glsl: Make opt_copy_propagation actually propagate into loops.
authorKenneth Graunke <kenneth@whitecape.org>
Sat, 30 Apr 2016 05:06:37 +0000 (22:06 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Mon, 6 Jun 2016 21:14:31 +0000 (14:14 -0700)
commit0756e3a25ce5e81773a54942d737ba4643e2f7dc
tree97e136540ef99ab55219f5b295aadbaa93c8d791
parent08ddfe7b2fa9f577ba00c8c05c5604460942f5a8
glsl: Make opt_copy_propagation actually propagate into loops.

We've had a FINISHME here since Eric originally wrote the code in 2010.
This patch implements his suggested approach, which makes us actually
able to copy propagate into the loops, at the unfortunate cost of making
this pass even more expensive.

The shader-db statistics are not terribly impressive:

   total instructions in shared programs: 9008589 -> 9008613 (0.00%)
   instructions in affected programs: 4293 -> 4317 (0.56%)
   helped: 0
   HURT: 10

   total cycles in shared programs: 78550978 -> 78575760 (0.03%)
   cycles in affected programs: 655426 -> 680208 (3.78%)
   helped: 75
   HURT: 88

   GAINED: 2

Most of the "regressions" appear to be us successfully copy propagating
uniforms, which i965 is loading as pull constants instead of push, so we
occasionally have two pulls instead of one.  That doesn't seem like this
pass's job - it's propagating correctly, and we should be smarter about
pull loads in the backend.

This patch is also useful for a couple of reasons:

1. It can clean up copies created by varying packing (previously, we
   couldn't if the uses were inside a loop).

   This fixes a bug when interpolateAt*() is used on a packed varying
   inside a loop: glsl_to_nir struggles to see through the extra copy
   and mistakenly believed the variable was not an input.

2. It will help propagate uniform array access created by
   lower_const_array_to_uniforms().

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Matt Turner <mattst88@gmail.com>
src/compiler/glsl/opt_copy_propagation.cpp