From: Eric Anholt Date: Thu, 26 Aug 2010 17:42:47 +0000 (-0700) Subject: glsl: Add a quick hack to constant folding to reduce duplicated work. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=2db7bb9c665d13fd067109b1171eedd92764791d;p=mesa.git glsl: Add a quick hack to constant folding to reduce duplicated work. Reduces runtime of glsl-max-varyings 92% on my system. --- diff --git a/src/glsl/ir_constant_folding.cpp b/src/glsl/ir_constant_folding.cpp index 3e6934c9a7c..554c54fae3a 100644 --- a/src/glsl/ir_constant_folding.cpp +++ b/src/glsl/ir_constant_folding.cpp @@ -62,6 +62,19 @@ ir_constant_folding_visitor::handle_rvalue(ir_rvalue **rvalue) if (*rvalue == NULL || (*rvalue)->ir_type == ir_type_constant) return; + /* Note that we do rvalue visitoring on leaving. So if an + * expression has a non-constant operand, no need to go looking + * down it to find if it's constant. This cuts the time of this + * pass down drastically. + */ + ir_expression *expr = (*rvalue)->as_expression(); + if (expr) { + for (unsigned int i = 0; i < expr->get_num_operands(); i++) { + if (!expr->operands[i]->as_constant()) + return; + } + } + ir_constant *constant = (*rvalue)->constant_expression_value(); if (constant) { *rvalue = constant;