This patch is Reviewed-by: Ian Romanick <ian.d.roman...@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 <kenn...@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 > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev