nir: Split ALU instructions in loops that read phis
authorIan Romanick <ian.d.romanick@intel.com>
Fri, 18 Jan 2019 01:34:47 +0000 (17:34 -0800)
committerIan Romanick <ian.d.romanick@intel.com>
Fri, 8 Feb 2019 18:37:06 +0000 (10:37 -0800)
commit0881e90c09965818b02e359474a6f7446b41d647
tree30d09847b3c453b1b4338352fd2c87b73cb274bb
parent0c0c69729b6d72a5297122856c8fe48510e90764
nir: Split ALU instructions in loops that read phis

A single shader in Unigine Superposition is affected by this change.
A single iadd is moved to the end of a loop.  This iadd is involved in
a complex set of logic to terminate the loop, and an extra mov
instruction is inserted.  This shader really needs the optimization
suggested by bugzilla #94747, and I expect that to make this tiny
regression go away.

All Gen7+ platforms had similar results. (Skylake shown)
total instructions in shared programs: 15047543 -> 15047545 (<.01%)
instructions in affected programs: 565 -> 567 (0.35%)
helped: 0
HURT: 2

total cycles in shared programs: 369977253 -> 369978253 (<.01%)
cycles in affected programs: 127910 -> 128910 (0.78%)
helped: 0
HURT: 2

v2: Skip nir_op_vec{2,3,4} and nir_op_[fi]mov instructions to avoid
infinite optimization loops.  Remove the original ALU instruciton after
all of its readers are modified to read the new ALU instruction.

v3: Extend to the more general case.  The if the prev-block value from
the phi is not undef, this means the ALU instruction has to be
duplicated in both the prev-block and the continue-block.

Fixes: 8fb8ebfbb05 ("intel/compiler: More peephole select")
Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
src/compiler/nir/nir_opt_if.c