glsl: Don't do constant propagation in opt_constant_folding.
authorKenneth Graunke <kenneth@whitecape.org>
Fri, 29 Apr 2016 20:13:01 +0000 (13:13 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Mon, 16 May 2016 06:59:39 +0000 (23:59 -0700)
commit8e71ac731b53a755df37efe63cf49607276de2d4
tree2f2fda1bdf3946f2c56ea13eb1e7d1a58aa2fec1
parentdb8fcbbaf940cdf690878f204f17d8bc90a6768e
glsl: Don't do constant propagation in opt_constant_folding.

opt_constant_folding is supposed to fold trees of constants into a
single constant.  Surprisingly, it was also propagating constant values
from variables into expression trees - even when the result couldn't be
folded together.  This is opt_constant_propagation's job.

The ir_dereference_variable::constant_expression_value() method returns
a clone of var->constant_value.  So we would replace the dereference
with a constant, propagating it into the tree.

Skip over ir_dereference_variable to avoid this surprising behavior.
However, add code to explicitly continue doing it in the constant
propagation pass, as it's useful to do so.

shader-db statistics on Broadwell:

total instructions in shared programs: 8905349 -> 8905126 (-0.00%)
instructions in affected programs: 30100 -> 29877 (-0.74%)
helped: 93
HURT: 20

total cycles in shared programs: 71017030 -> 71015944 (-0.00%)
cycles in affected programs: 132456 -> 131370 (-0.82%)
helped: 54
HURT: 45

The only hurt programs are by a single instruction, while the helped
ones are helped by 1-4 instructions.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
src/compiler/glsl/opt_constant_folding.cpp
src/compiler/glsl/opt_constant_propagation.cpp