From 818ff03865cda335148e1d7a789cab8e8d90a82b Mon Sep 17 00:00:00 2001 From: Georg Lehmann Date: Fri, 31 May 2024 15:52:12 +0200 Subject: [PATCH] aco: optimize branching sequence with p_create_vector exec producer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This happens with inverse_ballot and wave64. Foz-DB Navi21: Totals from 3 (0.00% of 79395) affected shaders: Instrs: 2689 -> 2683 (-0.22%) CodeSize: 14988 -> 14972 (-0.11%) Latency: 20207 -> 20204 (-0.01%) Copies: 144 -> 141 (-2.08%) Branches: 76 -> 73 (-3.95%) SALU: 241 -> 238 (-1.24%) Reviewed-by: Daniel Schürmann Part-of: --- src/amd/compiler/aco_ssa_elimination.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/amd/compiler/aco_ssa_elimination.cpp b/src/amd/compiler/aco_ssa_elimination.cpp index 61815a2bc60..081c965b642 100644 --- a/src/amd/compiler/aco_ssa_elimination.cpp +++ b/src/amd/compiler/aco_ssa_elimination.cpp @@ -398,7 +398,8 @@ try_optimize_branching_sequence(ssa_elimination_ctx& ctx, Block& block, const in */ const bool can_reassign = vopc || (exec_copy->opcode == aco_opcode::p_parallelcopy && - (exec_val->isSALU() || exec_val->opcode == aco_opcode::p_parallelcopy)); + (exec_val->isSALU() || exec_val->opcode == aco_opcode::p_parallelcopy || + exec_val->opcode == aco_opcode::p_create_vector)); /* The reassignment is not worth it when both the original exec needs to be copied * and the new exec copy can't be removed. In this case we'd end up with more instructions. @@ -507,8 +508,10 @@ try_optimize_branching_sequence(ssa_elimination_ctx& ctx, Block& block, const in exec_copy->operands[0] = Operand(exec, ctx.program->lane_mask); } - if (exec_val->opcode == aco_opcode::p_parallelcopy && exec_val->operands[0].isConstant() && - exec_val->operands[0].constantValue()) { + bool has_nonzero_op = + std::any_of(exec_val->operands.begin(), exec_val->operands.end(), + [](const Operand& op) -> bool { return op.isConstant() && op.constantValue(); }); + if (exec_val->isPseudo() && has_nonzero_op) { /* Remove the branch instruction when exec is constant non-zero. */ aco_ptr& branch = block.instructions.back(); if (branch->opcode == aco_opcode::p_cbranch_z && branch->operands[0].physReg() == exec)