[Mesa-dev] [PATCH] glsl: Speed up constant folding for swizzles.

Ian Romanick idr at freedesktop.org
Fri Sep 12 16:30:55 PDT 2014


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.romanick at 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 <kenneth at whitecape.org>
> Cc: mesa-stable at 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;
> 



More information about the mesa-dev mailing list