/* * 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