summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKenneth Graunke <[email protected]>2016-04-29 13:19:33 -0700
committerKenneth Graunke <[email protected]>2016-05-15 23:59:33 -0700
commitdb8fcbbaf940cdf690878f204f17d8bc90a6768e (patch)
tree62bb3a2b81612b7521f14ce16f8797be2105152c
parent329fe93210ce8f603f831ebd8431786d12cd1057 (diff)
glsl: Avoid excess tree walking when folding ir_dereference_arrays.
If an ir_dereference_array has non-constant components, there's no point in trying to evaluate its value (which involves walking down the tree and possibly allocating memory for portions of the subtree which are constant). This also removes convoluted tree walking in opt_constant_folding(), which tries to fold constants while walking up the tree. No need to walk down, then up, then down again. We did this for swizzles and expressions already, but I was lazy back in the day and didn't do this for ir_dereference_array. No change in shader-db. Signed-off-by: Kenneth Graunke <[email protected]> Reviewed-by: Ian Romanick <[email protected]>
-rw-r--r--src/compiler/glsl/opt_constant_folding.cpp6
1 files changed, 6 insertions, 0 deletions
diff --git a/src/compiler/glsl/opt_constant_folding.cpp b/src/compiler/glsl/opt_constant_folding.cpp
index 0ea53a5ed1b..ee67420adf8 100644
--- a/src/compiler/glsl/opt_constant_folding.cpp
+++ b/src/compiler/glsl/opt_constant_folding.cpp
@@ -85,6 +85,12 @@ ir_constant_fold(ir_rvalue **rvalue)
if (swiz && !swiz->val->as_constant())
return false;
+ /* Ditto for array dereferences */
+ ir_dereference_array *array_ref = (*rvalue)->as_dereference_array();
+ if (array_ref && (!array_ref->array->as_constant() ||
+ !array_ref->array_index->as_constant()))
+ return false;
+
ir_constant *constant = (*rvalue)->constant_expression_value();
if (constant) {
*rvalue = constant;