From 55d57b828f7669a1fd5e4c6c9cc04370a88d31a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timur=20Krist=C3=B3f?= Date: Sat, 17 Jul 2021 23:25:52 +0200 Subject: [PATCH] aco: Fix how p_elect interacts with optimizations. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Since p_elect doesn't have any operands, ACO's value numbering and/or the pre-RA optimizer could currently recognize two p_elect instructions in two different blocks as the same. This patch adds exec as an operand to p_elect in order to achieve correct behavior. Fixes: e66f54e5c83fd545e1a4062e683b584a35dacc00 Closes: #5080 Signed-off-by: Timur Kristóf Reviewed-by: Daniel Schürmann Part-of: --- src/amd/compiler/aco_instruction_selection.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/amd/compiler/aco_instruction_selection.cpp b/src/amd/compiler/aco_instruction_selection.cpp index 70bf5e8962f..300356d1f3c 100644 --- a/src/amd/compiler/aco_instruction_selection.cpp +++ b/src/amd/compiler/aco_instruction_selection.cpp @@ -8722,7 +8722,11 @@ visit_intrinsic(isel_context* ctx, nir_intrinsic_instr* instr) break; } case nir_intrinsic_elect: { - Temp elected = bld.pseudo(aco_opcode::p_elect, bld.def(bld.lm)); + /* p_elect is lowered in aco_insert_exec_mask. + * Use exec as an operand so value numbering and the pre-RA optimizer won't recognize + * two p_elect with different exec masks as the same. + */ + Temp elected = bld.pseudo(aco_opcode::p_elect, bld.def(bld.lm), Operand(exec, bld.lm)); emit_wqm(bld, elected, get_ssa_temp(ctx, &instr->dest.ssa)); ctx->block->kind |= block_kind_needs_lowering; break;