freedreno/ir3: use peephole select pass
authorRob Clark <robdclark@gmail.com>
Fri, 19 Jan 2018 21:13:09 +0000 (16:13 -0500)
committerRob Clark <robdclark@gmail.com>
Sat, 10 Feb 2018 19:54:58 +0000 (14:54 -0500)
Agressively lowering all if/else to selects in some extreme cases
results in much higher register pressure.  Using peephole select instead
with a modest threshold speeds up alu2 4x!

16 seems like a good limit, low enough to help alu2 but not too low that
it penalizes everything else.  With a bit better scheduling of the
instruction that moves a value into a predicate register, we might be
able to lower this limit a bit more in the future, but since we need 6
cycles from the move to predicate register to predicated branch, that
puts some sort of lower bound on how far we can lower this threshold.

Signed-off-by: Rob Clark <robdclark@gmail.com>
src/gallium/drivers/freedreno/ir3/ir3_nir.c

index 81a46be914e4e80786eb8e39fdf94cc3bd8de1fe..e76b39b230422eae81e7b1897752fd5c0c201680 100644 (file)
@@ -97,7 +97,7 @@ ir3_optimize_loop(nir_shader *s)
                progress |= OPT(s, nir_copy_prop);
                progress |= OPT(s, nir_opt_dce);
                progress |= OPT(s, nir_opt_cse);
-               progress |= OPT(s, ir3_nir_lower_if_else);
+               progress |= OPT(s, nir_opt_peephole_select, 16);
                progress |= OPT(s, nir_opt_algebraic);
                progress |= OPT(s, nir_opt_constant_folding);