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