aco/opt_postRA: remove scc != 0 with multiple uses
These can always be removed. Foz-DB Navi21: Totals from 39 (0.05% of 79789) affected shaders: Instrs: 138352 -> 138299 (-0.04%) CodeSize: 710424 -> 710272 (-0.02%) Latency: 468276 -> 468254 (-0.00%); split: -0.01%, +0.00% InvThroughput: 108970 -> 108973 (+0.00%) SALU: 18785 -> 18732 (-0.28%) Reviewed-by: Timur Kristóf <timur.kristof@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/33734>
This commit is contained in:
@@ -448,16 +448,16 @@ try_optimize_scc_nocompare(pr_opt_ctx& ctx, aco_ptr<Instruction>& instr)
|
||||
/* Check if we found the pattern above. */
|
||||
if (wr_instr->opcode != aco_opcode::s_cmp_eq_u32 && wr_instr->opcode != aco_opcode::s_cmp_lg_u32)
|
||||
return;
|
||||
if (wr_instr->operands[0].physReg() != scc)
|
||||
if (wr_instr->operands[0].physReg() != scc || !wr_instr->operands[0].isTemp())
|
||||
return;
|
||||
if (!wr_instr->operands[1].constantEquals(0))
|
||||
return;
|
||||
|
||||
/* The optimization can be unsafe when there are other users. */
|
||||
if (ctx.uses[instr->operands[scc_op_idx].tempId()] > 1)
|
||||
return;
|
||||
|
||||
if (wr_instr->opcode == aco_opcode::s_cmp_eq_u32) {
|
||||
/* The optimization can be unsafe when there are other users. */
|
||||
if (ctx.uses[instr->operands[scc_op_idx].tempId()] > 1)
|
||||
return;
|
||||
|
||||
/* Flip the meaning of the instruction to correctly use the SCC. */
|
||||
if (instr->format == Format::PSEUDO_BRANCH)
|
||||
instr->opcode = instr->opcode == aco_opcode::p_cbranch_z ? aco_opcode::p_cbranch_nz
|
||||
@@ -471,6 +471,8 @@ try_optimize_scc_nocompare(pr_opt_ctx& ctx, aco_ptr<Instruction>& instr)
|
||||
|
||||
/* Use the SCC def from the original instruction, not the comparison */
|
||||
ctx.uses[instr->operands[scc_op_idx].tempId()]--;
|
||||
if (ctx.uses[instr->operands[scc_op_idx].tempId()])
|
||||
ctx.uses[wr_instr->operands[0].tempId()]++;
|
||||
instr->operands[scc_op_idx] = wr_instr->operands[0];
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user