glsl/loops: Get rid of loop_variable_state::max_iterations.
authorPaul Berry <stereotype441@gmail.com>
Fri, 29 Nov 2013 08:11:12 +0000 (00:11 -0800)
committerPaul Berry <stereotype441@gmail.com>
Mon, 9 Dec 2013 18:55:03 +0000 (10:55 -0800)
This value is now redundant with
loop_variable_state::limiting_terminator->iterations and
ir_loop::normative_bound.

Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
src/glsl/loop_analysis.h
src/glsl/loop_controls.cpp
src/glsl/loop_unroll.cpp

index 0208890b1fd9df5f00cde537caf81126034e0cbe..ae980567c065869aa0edae7f272a19ab1b581455 100644 (file)
@@ -118,15 +118,6 @@ public:
     */
    hash_table *var_hash;
 
-   /**
-    * Maximum number of loop iterations.
-    *
-    * If this value is negative, then the loop may be infinite.  This actually
-    * means that analysis was unable to determine an upper bound on the number
-    * of loop iterations.
-    */
-   int max_iterations;
-
    /**
     * Number of ir_loop_jump instructions that operate on this loop
     */
@@ -139,7 +130,6 @@ public:
 
    loop_variable_state()
    {
-      this->max_iterations = -1;
       this->num_loop_jumps = 0;
       this->contains_calls = false;
       this->var_hash = hash_table_ctor(0, hash_table_pointer_hash,
index a14ea6ba6be2f44d498a1a23243f0ec5050d90f3..9e32ff5d5fac48346e4bb278cfc4301412f917ac 100644 (file)
@@ -183,24 +183,23 @@ loop_control_visitor::visit_leave(ir_loop *ir)
       return visit_continue;
    }
 
-   /* Figure out how many times the loop will run based on the iteration count
-    * annotations made by loop analysis, and give the loop a normative bound
-    * if possible.
-    */
-   unsigned max_iterations =
-      ls->max_iterations < 0 ? INT_MAX : ls->max_iterations;
-
-   if (ir->normative_bound >= 0)
-      max_iterations = ir->normative_bound;
+   if (ls->limiting_terminator != NULL) {
+      /* If the limiting terminator has an iteration count of zero, then we've
+       * proven that the loop cannot run, so delete it.
+       */
+      int iterations = ls->limiting_terminator->iterations;
+      if (iterations == 0) {
+         ir->remove();
+         this->progress = true;
+         return visit_continue;
+      }
 
-   /* If the limiting terminator has a lower iteration count than we'd
-    * previously inferred for this loop, then make the new iteration count the
-    * normative bound for this loop.
-    */
-   if (ls->limiting_terminator != NULL &&
-       (unsigned) ls->limiting_terminator->iterations < max_iterations) {
-      ir->normative_bound = ls->limiting_terminator->iterations;
-      max_iterations = ls->limiting_terminator->iterations;
+      /* If the limiting terminator has a lower iteration count than the
+       * normative loop bound (if any), then make this a normatively bounded
+       * loop with the new iteration count.
+       */
+      if (ir->normative_bound < 0 || iterations < ir->normative_bound)
+         ir->normative_bound = iterations;
    }
 
    /* Remove the conditional break statements associated with all terminators
@@ -221,14 +220,6 @@ loop_control_visitor::visit_leave(ir_loop *ir)
       this->progress = true;
    }
 
-   /* If we have proven the one of the loop exit conditions is satisifed before
-    * running the loop once, remove the loop.
-    */
-   if (max_iterations == 0)
-      ir->remove();
-   else
-      ls->max_iterations = max_iterations;
-
    return visit_continue;
 }
 
index e1009169370483c11681572f8b828ccad9081084..9472bc5a5104b79ab1e8ae5b7e7cb79440c99b88 100644 (file)
@@ -236,14 +236,14 @@ loop_unroll_visitor::visit_leave(ir_loop *ir)
       return visit_continue;
    }
 
-   iterations = ls->max_iterations;
-
    /* Don't try to unroll loops where the number of iterations is not known
     * at compile-time.
     */
-   if (iterations < 0)
+   if (ir->normative_bound < 0)
       return visit_continue;
 
+   iterations = ir->normative_bound;
+
    /* Don't try to unroll loops that have zillions of iterations either.
     */
    if (iterations > (int) max_iterations)