aco: Remove branch instruction when exec is constant non-zero.

This mainly helps the "if (elect())" that is used in
NGG culling shaders, effectively removing a useless branch
from every culling shader.

Totals from 58346 (45.35% of 128653) affected shaders:
CodeSize: 153238668 -> 153005284 (-0.15%)
Instrs: 29066198 -> 29007852 (-0.20%)
Latency: 133626003 -> 133598182 (-0.02%); split: -0.02%, +0.00%
InvThroughput: 20208765 -> 20208689 (-0.00%)
Branches: 1190209 -> 1131863 (-4.90%)

Signed-off-by: Timur Kristóf <timur.kristof@gmail.com>
Reviewed-by: Daniel Schürmann <daniel@schuermann.dev>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13383>
This commit is contained in:
Timur Kristóf 2022-05-04 13:58:39 +02:00 committed by Marge Bot
parent baab6f18c9
commit b731be2e96

View file

@ -420,6 +420,14 @@ try_optimize_branching_sequence(ssa_elimination_ctx& ctx, Block& block, const in
copy->operands[0] = Operand(exec, ctx.program->lane_mask);
block.instructions.insert(it, std::move(copy));
}
if (exec_val->opcode == aco_opcode::p_parallelcopy && exec_val->operands[0].isConstant() &&
exec_val->operands[0].constantValue()) {
/* Remove the branch instruction when exec is constant non-zero. */
aco_ptr<Instruction>& branch = block.instructions.back();
if (branch->isBranch() && branch->operands.size() && branch->operands[0].physReg() == exec)
block.instructions.back().reset();
}
}
void