On 09/12/2014 03:16 PM, Kenneth Graunke wrote: > ir_rvalue::constant_expression_value() recursively walks down an IR > tree, attempting to reduce it to a single constant value. This is > useful when you want to know whether a variable has a constant > expression value at all, and if so, what it is. > > The constant folding optimization pass attempts to replace rvalues with > their constant expression value from the bottom up. That way, we can > optimize subexpressions, and ideally stop as soon as we find a > non-constant subexpression. > > In order to obtain the actual value of an expression, the optimization > pass calls constant_expression_value(). But it should only do so if it > knows the value can be combined into a constant. Otherwise, at each > step of walking back up the tree, it will walk down the tree again, only > to discover what it already knew: it isn't constant.
Right... handle_rvalue happens for a node after all of its leaves have been processed, so swiz->val would already be ir_type_constant if it could be. Since constant_expression_value is general, it tries to figure it out again. Gotcha. Are there other IR types that should get this treatment as well? Either way, this patch is Reviewed-by: Ian Romanick <ian.d.roman...@intel.com> > We properly avoided this call for ir_expression nodes, but not for > ir_swizzle nodes. This patch fixes that, drastically reducing compile > times on certain shaders where tree grafting has given us huge > expression trees. It also fixes SuperTuxKart. > > Thanks to Iago and Mike for help in tracking this down. > > Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=78468 > Signed-off-by: Kenneth Graunke <kenn...@whitecape.org> > Cc: mesa-sta...@lists.freedesktop.org > --- > src/glsl/opt_constant_folding.cpp | 5 +++++ > 1 file changed, 5 insertions(+) > > diff --git a/src/glsl/opt_constant_folding.cpp > b/src/glsl/opt_constant_folding.cpp > index d0e5754..74b855e 100644 > --- a/src/glsl/opt_constant_folding.cpp > +++ b/src/glsl/opt_constant_folding.cpp > @@ -79,6 +79,11 @@ ir_constant_folding_visitor::handle_rvalue(ir_rvalue > **rvalue) > } > } > > + /* Ditto for swizzles. */ > + ir_swizzle *swiz = (*rvalue)->as_swizzle(); > + if (swiz && !swiz->val->as_constant()) > + return; > + > ir_constant *constant = (*rvalue)->constant_expression_value(); > if (constant) { > *rvalue = constant; > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev