diff options
author | Paul Berry <stereotype441@gmail.com> | 2013-11-28 12:44:53 -0800 |
---|---|---|
committer | Paul Berry <stereotype441@gmail.com> | 2013-12-09 10:54:49 -0800 |
commit | 714e1b331ed1b2dfffac4accb4ebf5a01d3f961f (patch) | |
tree | 55e28f094eda50017c627a9fc694665bb4159065 /src/glsl/loop_controls.cpp | |
parent | 115fd75ab06b858b83173f7d76eada8ea417fc86 (diff) | |
download | external_mesa3d-714e1b331ed1b2dfffac4accb4ebf5a01d3f961f.zip external_mesa3d-714e1b331ed1b2dfffac4accb4ebf5a01d3f961f.tar.gz external_mesa3d-714e1b331ed1b2dfffac4accb4ebf5a01d3f961f.tar.bz2 |
glsl/loops: Remove unnecessary list walk from loop_control_visitor.
When loop_control_visitor::visit_leave(ir_loop *) is analyzing a loop
terminator that acts on a certain ir_variable, it doesn't need to walk
the list of induction variables to find the loop_variable entry
corresponding to the variable. It can just look it up in the
loop_variable_state hashtable and verify that the loop_variable entry
represents an induction variable.
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
Diffstat (limited to 'src/glsl/loop_controls.cpp')
-rw-r--r-- | src/glsl/loop_controls.cpp | 63 |
1 files changed, 30 insertions, 33 deletions
diff --git a/src/glsl/loop_controls.cpp b/src/glsl/loop_controls.cpp index a1dc20e..ce05e09 100644 --- a/src/glsl/loop_controls.cpp +++ b/src/glsl/loop_controls.cpp @@ -237,39 +237,36 @@ loop_control_visitor::visit_leave(ir_loop *ir) ir_rvalue *init = find_initial_value(ir, var); - foreach_list(iv_node, &ls->induction_variables) { - loop_variable *lv = (loop_variable *) iv_node; - - if (lv->var == var) { - const int iterations = calculate_iterations(init, limit, - lv->increment, - cmp); - if (iterations >= 0) { - /* If the new iteration count is lower than the previously - * believed iteration count, then add a normative bound to - * this loop. - */ - if ((unsigned) iterations < max_iterations) { - ir->normative_bound = iterations; - - max_iterations = iterations; - } - - /* Remove the conditional break statement. The loop - * controls are now set such that the exit condition will be - * satisfied. - */ - if_stmt->remove(); - - assert(ls->num_loop_jumps > 0); - ls->num_loop_jumps--; - - this->progress = true; - } - - break; - } - } + loop_variable *lv = ls->get(var); + if (lv != NULL && lv->is_induction_var()) { + const int iterations = calculate_iterations(init, limit, + lv->increment, + cmp); + if (iterations >= 0) { + /* If the new iteration count is lower than the previously + * believed iteration count, then add a normative bound to + * this loop. + */ + if ((unsigned) iterations < max_iterations) { + ir->normative_bound = iterations; + + max_iterations = iterations; + } + + /* Remove the conditional break statement. The loop + * controls are now set such that the exit condition will be + * satisfied. + */ + if_stmt->remove(); + + assert(ls->num_loop_jumps > 0); + ls->num_loop_jumps--; + + this->progress = true; + } + + break; + } break; } |