2023-01-27 19:56:56 +00:00
|
|
|
/*
|
|
|
|
|
* Copyright © 2022 Valve Corporation
|
|
|
|
|
*
|
2024-04-08 09:02:30 +02:00
|
|
|
* SPDX-License-Identifier: MIT
|
2023-01-27 19:56:56 +00:00
|
|
|
*/
|
|
|
|
|
#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
|
2025-07-28 12:25:11 +02:00
|
|
|
//>> s2: %_:s[0-1], v1: %a:v[0] = p_startpgm
|
2023-01-27 19:56:56 +00:00
|
|
|
if (!setup_cs("s2 v1", GFX9))
|
|
|
|
|
return;
|
|
|
|
|
|
2024-05-14 06:51:02 +02:00
|
|
|
//>> p_logical_start
|
|
|
|
|
//>> p_logical_end
|
|
|
|
|
bld.pseudo(aco_opcode::p_logical_start);
|
|
|
|
|
bld.pseudo(aco_opcode::p_logical_end);
|
|
|
|
|
|
2023-01-27 19:56:56 +00:00
|
|
|
//>> lv1: %lv = p_start_linear_vgpr
|
|
|
|
|
emit_divergent_if_else(
|
|
|
|
|
program.get(), bld, Operand(inputs[0]),
|
|
|
|
|
[&]() -> void
|
|
|
|
|
{
|
2024-07-25 17:15:15 +02:00
|
|
|
//>> s1: %_, s2: %_, s1: %_:scc = p_reduce %a, %lv, lv1: undef op:umin32 cluster_size:64
|
2023-01-27 19:56:56 +00:00
|
|
|
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, */
|
2024-07-25 17:15:15 +02:00
|
|
|
//! p_end_linear_vgpr %lv
|
2023-01-27 19:56:56 +00:00
|
|
|
|
|
|
|
|
finish_setup_reduce_temp_test();
|
|
|
|
|
END_TEST
|