• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright © 2022 Valve Corporation
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice (including the next
12  * paragraph) shall be included in all copies or substantial portions of the
13  * Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21  * IN THE SOFTWARE.
22  *
23  */
24 #include "helpers.h"
25 
26 using namespace aco;
27 
28 BEGIN_TEST(setup_reduce_temp.divergent_if_phi)
29    /*
30     * This must have an end_linear_vgpr after the phi (to ensure it's live during the phi copies):
31     * v0 = start_linear_vgpr
32     * divergent_if (...) {
33     *
34     * } else {
35     *    use_linear_vgpr(v0)
36     * }
37     * ... = phi ...
38     */
39    // TODO: fix the RA validator to spot this
40    //>> s2: %_, v1: %a = p_startpgm
41    if (!setup_cs("s2 v1", GFX9))
42       return;
43 
44    //>> lv1: %lv = p_start_linear_vgpr
45    emit_divergent_if_else(
46       program.get(), bld, Operand(inputs[0]),
47       [&]() -> void
__anon60e091810102() 48       {
49          //>> s1: %_, s2: %_, s1: %_:scc = p_reduce %a, %lv, lv1: undef op:umin32 cluster_size:64
50          Instruction* reduce =
51             bld.reduction(aco_opcode::p_reduce, bld.def(s1), bld.def(bld.lm), bld.def(s1, scc),
52                           inputs[1], Operand(v1.as_linear()), Operand(v1.as_linear()), umin32);
53          reduce->reduction().cluster_size = bld.lm.bytes() * 8;
54       },
55       [&]() -> void
__anon60e091810202() 56       {
57          /* nothing */
58       });
59    bld.pseudo(aco_opcode::p_phi, bld.def(v1), Operand::c32(1), Operand::zero());
60    //>> /* logical preds: BB1, BB4, / linear preds: BB4, BB5, / kind: uniform, top-level, merge, */
61    //! p_end_linear_vgpr %lv
62 
63    finish_setup_reduce_temp_test();
64 END_TEST
65