[Mesa-dev] [PATCH 3/5] glsl: Consolidate duplicate copies of constant folding.

Ian Romanick idr at freedesktop.org
Mon May 9 17:49:20 UTC 2016


This patch is

Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>

On 05/09/2016 08:50 AM, Kenneth Graunke wrote:
> We could probably clean this up more (maybe make it a method), but at
> least there's only one copy of this code now, and that's a start.
> 
> No change in shader-db.
> 
> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> ---
>  src/compiler/glsl/ir_optimization.h            |  2 ++
>  src/compiler/glsl/opt_constant_folding.cpp     | 20 ++++++++++++------
>  src/compiler/glsl/opt_constant_propagation.cpp | 29 +++-----------------------
>  3 files changed, 19 insertions(+), 32 deletions(-)
> 
> diff --git a/src/compiler/glsl/ir_optimization.h b/src/compiler/glsl/ir_optimization.h
> index f9599a3..5fc2740 100644
> --- a/src/compiler/glsl/ir_optimization.h
> +++ b/src/compiler/glsl/ir_optimization.h
> @@ -73,6 +73,8 @@ bool do_common_optimization(exec_list *ir, bool linked,
>                              const struct gl_shader_compiler_options *options,
>                              bool native_integers);
>  
> +bool ir_constant_fold(ir_rvalue **rvalue);
> +
>  bool do_rebalance_tree(exec_list *instructions);
>  bool do_algebraic(exec_list *instructions, bool native_integers,
>                    const struct gl_shader_compiler_options *options);
> diff --git a/src/compiler/glsl/opt_constant_folding.cpp b/src/compiler/glsl/opt_constant_folding.cpp
> index de13c9e..0ea53a5 100644
> --- a/src/compiler/glsl/opt_constant_folding.cpp
> +++ b/src/compiler/glsl/opt_constant_folding.cpp
> @@ -61,11 +61,11 @@ public:
>  
>  } /* unnamed namespace */
>  
> -void
> -ir_constant_folding_visitor::handle_rvalue(ir_rvalue **rvalue)
> +bool
> +ir_constant_fold(ir_rvalue **rvalue)
>  {
>     if (*rvalue == NULL || (*rvalue)->ir_type == ir_type_constant)
> -      return;
> +      return false;
>  
>     /* Note that we do rvalue visitoring on leaving.  So if an
>      * expression has a non-constant operand, no need to go looking
> @@ -76,20 +76,28 @@ ir_constant_folding_visitor::handle_rvalue(ir_rvalue **rvalue)
>     if (expr) {
>        for (unsigned int i = 0; i < expr->get_num_operands(); i++) {
>  	 if (!expr->operands[i]->as_constant())
> -	    return;
> +	    return false;
>        }
>     }
>  
>     /* Ditto for swizzles. */
>     ir_swizzle *swiz = (*rvalue)->as_swizzle();
>     if (swiz && !swiz->val->as_constant())
> -      return;
> +      return false;
>  
>     ir_constant *constant = (*rvalue)->constant_expression_value();
>     if (constant) {
>        *rvalue = constant;
> -      this->progress = true;
> +      return true;
>     }
> +   return false;
> +}
> +
> +void
> +ir_constant_folding_visitor::handle_rvalue(ir_rvalue **rvalue)
> +{
> +   if (ir_constant_fold(rvalue))
> +      this->progress = true;
>  }
>  
>  ir_visitor_status
> diff --git a/src/compiler/glsl/opt_constant_propagation.cpp b/src/compiler/glsl/opt_constant_propagation.cpp
> index 4764d16..4b82bd1 100644
> --- a/src/compiler/glsl/opt_constant_propagation.cpp
> +++ b/src/compiler/glsl/opt_constant_propagation.cpp
> @@ -136,33 +136,10 @@ public:
>  
>  
>  void
> -ir_constant_propagation_visitor::constant_folding(ir_rvalue **rvalue) {
> -
> -   if (*rvalue == NULL || (*rvalue)->ir_type == ir_type_constant)
> -      return;
> -
> -   /* Note that we visit rvalues one 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;
> -      }
> -   }
> -
> -   /* 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;
> +ir_constant_propagation_visitor::constant_folding(ir_rvalue **rvalue)
> +{
> +   if (ir_constant_fold(rvalue))
>        this->progress = true;
> -   }
>  }
>  
>  void
> 



More information about the mesa-dev mailing list