summaryrefslogtreecommitdiffstats
path: root/src/compiler/glsl/opt_constant_folding.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/compiler/glsl/opt_constant_folding.cpp')
-rw-r--r--src/compiler/glsl/opt_constant_folding.cpp9
1 files changed, 9 insertions, 0 deletions
diff --git a/src/compiler/glsl/opt_constant_folding.cpp b/src/compiler/glsl/opt_constant_folding.cpp
index ee67420adf8..97dcc7e1acb 100644
--- a/src/compiler/glsl/opt_constant_folding.cpp
+++ b/src/compiler/glsl/opt_constant_folding.cpp
@@ -91,6 +91,15 @@ ir_constant_fold(ir_rvalue **rvalue)
!array_ref->array_index->as_constant()))
return false;
+ /* No constant folding can be performed on variable dereferences. We need
+ * to explicitly avoid them, as calling constant_expression_value() on a
+ * variable dereference will return a clone of var->constant_value. This
+ * would make us propagate the value into the tree, which isn't our job.
+ */
+ ir_dereference_variable *var_ref = (*rvalue)->as_dereference_variable();
+ if (var_ref)
+ return false;
+
ir_constant *constant = (*rvalue)->constant_expression_value();
if (constant) {
*rvalue = constant;