[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