| /* |
| * Copyright © 2022 Valve Corporation |
| * |
| * SPDX-License-Identifier: MIT |
| */ |
| #include "helpers.h" |
| |
| using namespace aco; |
| |
| BEGIN_TEST(setup_reduce_temp.divergent_if_phi) |
| /* |
| * This must have an end_linear_vgpr after the phi (to ensure it's live during the phi copies): |
| * v0 = start_linear_vgpr |
| * divergent_if (...) { |
| * |
| * } else { |
| * use_linear_vgpr(v0) |
| * } |
| * ... = phi ... |
| */ |
| // TODO: fix the RA validator to spot this |
| //>> s2: %_, v1: %a = p_startpgm |
| if (!setup_cs("s2 v1", GFX9)) |
| return; |
| |
| //>> p_logical_start |
| //>> p_logical_end |
| bld.pseudo(aco_opcode::p_logical_start); |
| bld.pseudo(aco_opcode::p_logical_end); |
| |
| //>> lv1: %lv = p_start_linear_vgpr |
| emit_divergent_if_else( |
| program.get(), bld, Operand(inputs[0]), |
| [&]() -> void |
| { |
| //>> s1: %_, s2: %_, s1: %_:scc = p_reduce %a, %lv, lv1: undef op:umin32 cluster_size:64 |
| Instruction* reduce = |
| bld.reduction(aco_opcode::p_reduce, bld.def(s1), bld.def(bld.lm), bld.def(s1, scc), |
| inputs[1], Operand(v1.as_linear()), Operand(v1.as_linear()), umin32); |
| reduce->reduction().cluster_size = bld.lm.bytes() * 8; |
| }, |
| [&]() -> void |
| { |
| /* nothing */ |
| }); |
| bld.pseudo(aco_opcode::p_phi, bld.def(v1), Operand::c32(1), Operand::zero()); |
| //>> /* logical preds: BB1, BB4, / linear preds: BB4, BB5, / kind: uniform, top-level, merge, */ |
| //! p_end_linear_vgpr %lv |
| |
| finish_setup_reduce_temp_test(); |
| END_TEST |