1 /* 2 * Copyright © 2022 Valve Corporation 3 * 4 * SPDX-License-Identifier: MIT 5 */ 6 #include "helpers.h" 7 8 using namespace aco; 9 10 BEGIN_TEST(setup_reduce_temp.divergent_if_phi) 11 /* 12 * This must have an end_linear_vgpr after the phi (to ensure it's live during the phi copies): 13 * v0 = start_linear_vgpr 14 * divergent_if (...) { 15 * 16 * } else { 17 * use_linear_vgpr(v0) 18 * } 19 * ... = phi ... 20 */ 21 // TODO: fix the RA validator to spot this 22 //>> s2: %_, v1: %a = p_startpgm 23 if (!setup_cs("s2 v1", GFX9)) 24 return; 25 26 //>> p_logical_start 27 //>> p_logical_end 28 bld.pseudo(aco_opcode::p_logical_start); 29 bld.pseudo(aco_opcode::p_logical_end); 30 31 //>> lv1: %lv = p_start_linear_vgpr 32 emit_divergent_if_else( 33 program.get(), bld, Operand(inputs[0]), 34 [&]() -> void __anonb484ab630102() 35 { 36 //>> s1: %_, s2: %_, s1: %_:scc = p_reduce %a, %lv, lv1: undef op:umin32 cluster_size:64 37 Instruction* reduce = 38 bld.reduction(aco_opcode::p_reduce, bld.def(s1), bld.def(bld.lm), bld.def(s1, scc), 39 inputs[1], Operand(v1.as_linear()), Operand(v1.as_linear()), umin32); 40 reduce->reduction().cluster_size = bld.lm.bytes() * 8; 41 }, 42 [&]() -> void __anonb484ab630202() 43 { 44 /* nothing */ 45 }); 46 bld.pseudo(aco_opcode::p_phi, bld.def(v1), Operand::c32(1), Operand::zero()); 47 //>> /* logical preds: BB1, BB4, / linear preds: BB4, BB5, / kind: uniform, top-level, merge, */ 48 //! p_end_linear_vgpr %lv 49 50 finish_setup_reduce_temp_test(); 51 END_TEST 52