I had thought about doing something similar once upon a time, but I never got around to it. I'm glad you got some good performance data. With the couple typos fixed, this patch is
Reviewed-by: Ian Romanick <ian.d.roman...@intel.com> On 08/19/2015 09:37 PM, Timothy Arceri wrote: > The constant folding pass can take a long time to complete > so rather than running throught the entire pass each time through > a new constant is propagated (and vice versa) interleave them. > > This change helps ES31-CTS.arrays_of_arrays.InteractionFunctionCalls1 > go from around 2 min -> 23 sec. > --- > src/glsl/opt_constant_propagation.cpp | 46 > +++++++++++++++++++++++++++++++++-- > 1 file changed, 44 insertions(+), 2 deletions(-) > > diff --git a/src/glsl/opt_constant_propagation.cpp > b/src/glsl/opt_constant_propagation.cpp > index 10be8e8..ebe30d9 100644 > --- a/src/glsl/opt_constant_propagation.cpp > +++ b/src/glsl/opt_constant_propagation.cpp > @@ -110,6 +110,8 @@ public: > virtual ir_visitor_status visit_enter(class ir_if *); > > void add_constant(ir_assignment *ir); > + void constant_folding(ir_rvalue **rvalue); > + void constant_propagation(ir_rvalue **rvalue); > void kill(ir_variable *ir, unsigned write_mask); > void handle_if_block(exec_list *instructions); > void handle_rvalue(ir_rvalue **rvalue); > @@ -132,8 +134,39 @@ public: > > > void > -ir_constant_propagation_visitor::handle_rvalue(ir_rvalue **rvalue) > -{ > +ir_constant_propagation_visitor::constant_folding(ir_rvalue **rvalue) { > + > + if (*rvalue == NULL || (*rvalue)->ir_type == ir_type_constant) > + return; > + > + /* Note that we do rvalue visitoring on leaving. So if an Note that we visit rvalues one leaving. > + * 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; > + this->progress = true; > + } > +} > + > +void > +ir_constant_propagation_visitor::constant_propagation(ir_rvalue **rvalue) { > + > if (this->in_assignee || !*rvalue) > return; > > @@ -216,6 +249,13 @@ ir_constant_propagation_visitor::handle_rvalue(ir_rvalue > **rvalue) > this->progress = true; > } > > +void > +ir_constant_propagation_visitor::handle_rvalue(ir_rvalue **rvalue) > +{ > + constant_propagation(rvalue); > + constant_folding(rvalue); > +} > + > ir_visitor_status > ir_constant_propagation_visitor::visit_enter(ir_function_signature *ir) > { > @@ -243,6 +283,8 @@ > ir_constant_propagation_visitor::visit_enter(ir_function_signature *ir) > ir_visitor_status > ir_constant_propagation_visitor::visit_leave(ir_assignment *ir) > { > + constant_folding(&ir->rhs); > + > if (this->in_assignee) > return visit_continue; > > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev