[Mesa-dev] [RFC PATCH 04/10] glsl/loops: Remove unnecessary list walk from loop_control_visitor.

Paul Berry stereotype441 at gmail.com
Sat Nov 30 08:38:13 PST 2013


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.
---
 src/glsl/loop_analysis.h   |  9 +++++++
 src/glsl/loop_controls.cpp | 63 ++++++++++++++++++++++------------------------
 2 files changed, 39 insertions(+), 33 deletions(-)

diff --git a/src/glsl/loop_analysis.h b/src/glsl/loop_analysis.h
index 961ea40..8e57dac 100644
--- a/src/glsl/loop_analysis.h
+++ b/src/glsl/loop_analysis.h
@@ -189,6 +189,15 @@ public:
    ir_rvalue *increment;
 
 
+   inline bool is_induction_var() const
+   {
+      /* Induction variables always have a non-null increment, and vice
+       * versa.
+       */
+      return this->increment != NULL;
+   }
+
+
    inline bool is_loop_constant() const
    {
       const bool is_const = (this->num_assignments == 0)
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;
       }
 
-- 
1.8.4.2



More information about the mesa-dev mailing list