glsl: Make constant propagation's folder not propagate into an LHS.
authorKenneth Graunke <kenneth@whitecape.org>
Mon, 20 Jun 2016 23:48:02 +0000 (16:48 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Thu, 23 Jun 2016 18:58:50 +0000 (11:58 -0700)
opt_constant_propagation.cpp contains constant folding code which can
actually do constant propagation in some cases.  It was happily
propagating constants into the left-hand-side of assignments.

For example,

   (assign () (var_ref temp) (constant ...))

would brilliantly be turned into:

   (assign () (constant ...) (constant ....))

This is a bigger hammer than necessary - it prevents propagation
into the left-hand-side altogether.  We could certainly do better
someday.  Notably, the constant propagation pass itself already
takes this approach - it's just the constant propagation pass's
built-in constant folding code (which actually propagates, too)
that was broken.

No change in shader-db, but prevents regressions after future commits.
It seems plausible that this could be hit today, but I haven't seen it
happen.

Cc: mesa-stable@lists.freedesktop.org
Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Timothy Arceri <timothy.arceri@collabora.com>
src/compiler/glsl/opt_constant_propagation.cpp

index fbc22b0e50f18b428e572f4a5fbb83d20d05ee58..6ec4ab498d95e4b9296817e678612731833ae8e4 100644 (file)
@@ -138,7 +138,7 @@ public:
 void
 ir_constant_propagation_visitor::constant_folding(ir_rvalue **rvalue)
 {
-   if (*rvalue == NULL)
+   if (this->in_assignee || *rvalue == NULL)
       return;
 
    if (ir_constant_fold(rvalue))