From 6b35d6f75b7b00972aae7e8ea61aa355c32fcbbc Mon Sep 17 00:00:00 2001 From: Georg Lehmann Date: Thu, 19 Dec 2024 20:17:55 +0100 Subject: [PATCH] aco: allow p_exit_early_if_not with exec condition MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reviewed-by: Daniel Schürmann Reviewed-by: Timur Kristóf Reviewed-by: Daniel Schürmann Part-of: --- src/amd/compiler/aco_lower_branches.cpp | 4 +++- src/amd/compiler/aco_lower_to_hw_instr.cpp | 7 +++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/amd/compiler/aco_lower_branches.cpp b/src/amd/compiler/aco_lower_branches.cpp index 995adeba01a..1558278c9e9 100644 --- a/src/amd/compiler/aco_lower_branches.cpp +++ b/src/amd/compiler/aco_lower_branches.cpp @@ -78,7 +78,9 @@ can_remove_branch(branch_ctx& ctx, Block& block, Pseudo_branch_instruction* bran * an empty exec mask. */ if (instr->opcode == aco_opcode::s_cbranch_scc0 || - instr->opcode == aco_opcode::s_cbranch_scc1) { + instr->opcode == aco_opcode::s_cbranch_scc1 || + instr->opcode == aco_opcode::s_cbranch_execz || + instr->opcode == aco_opcode::s_cbranch_execnz) { bool is_break_continue = ctx.program->blocks[i].kind & (block_kind_break | block_kind_continue); bool discard_early_exit = diff --git a/src/amd/compiler/aco_lower_to_hw_instr.cpp b/src/amd/compiler/aco_lower_to_hw_instr.cpp index a2a0a9353d0..f705b4f1dc9 100644 --- a/src/amd/compiler/aco_lower_to_hw_instr.cpp +++ b/src/amd/compiler/aco_lower_to_hw_instr.cpp @@ -2427,8 +2427,11 @@ lower_to_hw_instr(Program* program) bld.reset(&ctx.instructions); } - assert(instr->operands[0].physReg() == scc); - bld.sopp(aco_opcode::s_cbranch_scc0, discard_block->index); + assert(instr->operands[0].physReg() == scc || instr->operands[0].physReg() == exec); + if (instr->operands[0].physReg() == scc) + bld.sopp(aco_opcode::s_cbranch_scc0, discard_block->index); + else + bld.sopp(aco_opcode::s_cbranch_execz, discard_block->index); discard_block->linear_preds.push_back(block->index); block->linear_succs.push_back(discard_block->index);