glsl/loops: replace loop controls with a normative bound.
authorPaul Berry <stereotype441@gmail.com>
Thu, 28 Nov 2013 16:13:41 +0000 (08:13 -0800)
committerPaul Berry <stereotype441@gmail.com>
Mon, 9 Dec 2013 18:54:33 +0000 (10:54 -0800)
This patch replaces the ir_loop fields "from", "to", "increment",
"counter", and "cmp" with a single integer ("normative_bound") that
serves the same purpose.

I've used the name "normative_bound" to emphasize the fact that the
back-end is required to emit code to prevent the loop from running
more than normative_bound times.  (By contrast, an "informative" bound
would be a bound that is informational only).

Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
46 files changed:
src/glsl/ir.cpp
src/glsl/ir.h
src/glsl/ir_clone.cpp
src/glsl/ir_hv_accept.cpp
src/glsl/ir_print_visitor.cpp
src/glsl/ir_reader.cpp
src/glsl/ir_validate.cpp
src/glsl/ir_variable_refcount.cpp
src/glsl/ir_variable_refcount.h
src/glsl/loop_analysis.h
src/glsl/loop_controls.cpp
src/glsl/lower_bounded_loops.cpp
src/glsl/tests/lower_jumps/lower_breaks_1.opt_test
src/glsl/tests/lower_jumps/lower_breaks_1.opt_test.expected
src/glsl/tests/lower_jumps/lower_breaks_2.opt_test
src/glsl/tests/lower_jumps/lower_breaks_2.opt_test.expected
src/glsl/tests/lower_jumps/lower_breaks_3.opt_test
src/glsl/tests/lower_jumps/lower_breaks_3.opt_test.expected
src/glsl/tests/lower_jumps/lower_breaks_4.opt_test
src/glsl/tests/lower_jumps/lower_breaks_4.opt_test.expected
src/glsl/tests/lower_jumps/lower_breaks_5.opt_test
src/glsl/tests/lower_jumps/lower_breaks_5.opt_test.expected
src/glsl/tests/lower_jumps/lower_breaks_6.opt_test
src/glsl/tests/lower_jumps/lower_breaks_6.opt_test.expected
src/glsl/tests/lower_jumps/lower_guarded_conditional_break.opt_test
src/glsl/tests/lower_jumps/lower_guarded_conditional_break.opt_test.expected
src/glsl/tests/lower_jumps/lower_pulled_out_jump.opt_test
src/glsl/tests/lower_jumps/lower_pulled_out_jump.opt_test.expected
src/glsl/tests/lower_jumps/remove_continue_at_end_of_loop.opt_test
src/glsl/tests/lower_jumps/remove_continue_at_end_of_loop.opt_test.expected
src/glsl/tests/lower_jumps/return_non_void_at_end_of_loop_lower_nothing.opt_test
src/glsl/tests/lower_jumps/return_non_void_at_end_of_loop_lower_nothing.opt_test.expected
src/glsl/tests/lower_jumps/return_non_void_at_end_of_loop_lower_return.opt_test
src/glsl/tests/lower_jumps/return_non_void_at_end_of_loop_lower_return.opt_test.expected
src/glsl/tests/lower_jumps/return_non_void_at_end_of_loop_lower_return_and_break.opt_test
src/glsl/tests/lower_jumps/return_non_void_at_end_of_loop_lower_return_and_break.opt_test.expected
src/glsl/tests/lower_jumps/return_void_at_end_of_loop_lower_nothing.opt_test
src/glsl/tests/lower_jumps/return_void_at_end_of_loop_lower_nothing.opt_test.expected
src/glsl/tests/lower_jumps/return_void_at_end_of_loop_lower_return.opt_test
src/glsl/tests/lower_jumps/return_void_at_end_of_loop_lower_return.opt_test.expected
src/glsl/tests/lower_jumps/return_void_at_end_of_loop_lower_return_and_break.opt_test
src/glsl/tests/lower_jumps/return_void_at_end_of_loop_lower_return_and_break.opt_test.expected
src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
src/mesa/program/ir_to_mesa.cpp
src/mesa/state_tracker/st_glsl_to_tgsi.cpp

index 330b4dccbb58809fac49619c57b172ff909e2a48..29fe64ad496ed98ed2daa77b3beb6cf9f3594246 100644 (file)
@@ -1277,11 +1277,7 @@ ir_constant::is_basis() const
 ir_loop::ir_loop()
 {
    this->ir_type = ir_type_loop;
-   this->cmp = ir_unop_neg;
-   this->from = NULL;
-   this->to = NULL;
-   this->increment = NULL;
-   this->counter = NULL;
+   this->normative_bound = -1;
 }
 
 
index e60ffc0834fe6f4c444487c294f0c001238209b3..a34a9c3193b70056af29da912983c4a6a9ca1611 100644 (file)
@@ -86,6 +86,7 @@ enum ir_node_type {
    ir_type_max /**< maximum ir_type enum number, for validation */
 };
 
+
 /**
  * Base class of all IR instructions
  */
@@ -1025,54 +1026,11 @@ public:
    exec_list body_instructions;
 
    /**
-    * \name Loop counter and controls
-    *
-    * Represents a loop like a FORTRAN \c do-loop.
-    *
-    * \note
-    * If \c from and \c to are the same value, the loop will execute once.
-    */
-   /*@{*/
-
-   /**
-    * Value which should be assigned to \c counter before the first iteration
-    * of the loop.  Must be non-null whenever \c counter is non-null, and vice
-    * versa.
-    */
-   ir_rvalue *from;
-
-   /**
-    * Value which \c counter should be compared to in order to determine
-    * whether to exit the loop.  Must be non-null whenever \c counter is
-    * non-null, and vice versa.
+    * Normative bound for the loop.  If this value is >= 0, the back-end
+    * should generate instructions to ensure that the loop executes no more
+    * than this many times.
     */
-   ir_rvalue *to;
-
-   /**
-    * Value which should be added to \c counter at the end of each loop
-    * iteration.  Must be non-null whenever \c counter is non-null, and vice
-    * versa.
-    */
-   ir_rvalue *increment;
-
-   /**
-    * Variable which counts loop iterations.  This is a brand new ir_variable
-    * declaration (not a reference to a previously declared ir_variable, as in
-    * ir_dereference_variable).
-    */
-   ir_variable *counter;
-
-   /**
-    * Comparison operation in the loop terminator.
-    *
-    * If any of the loop control fields are non-\c NULL, this field must be
-    * one of \c ir_binop_less, \c ir_binop_greater, \c ir_binop_lequal,
-    * \c ir_binop_gequal, \c ir_binop_equal, or \c ir_binop_nequal.
-    *
-    * Ignored if \c counter is NULL.
-    */
-   int cmp;
-   /*@}*/
+   int normative_bound;
 };
 
 
index a66864a61d13b4c26d287ab48f3ebadc6bc2d3aa..383627ae3e22c244cede59f197bacc3b9972d8b9 100644 (file)
@@ -158,21 +158,13 @@ ir_loop::clone(void *mem_ctx, struct hash_table *ht) const
 {
    ir_loop *new_loop = new(mem_ctx) ir_loop();
 
-   if (this->from)
-      new_loop->from = this->from->clone(mem_ctx, ht);
-   if (this->to)
-      new_loop->to = this->to->clone(mem_ctx, ht);
-   if (this->increment)
-      new_loop->increment = this->increment->clone(mem_ctx, ht);
-   if (this->counter)
-      new_loop->counter = this->counter->clone(mem_ctx, ht);
+   new_loop->normative_bound = this->normative_bound;
 
    foreach_iter(exec_list_iterator, iter, this->body_instructions) {
       ir_instruction *ir = (ir_instruction *)iter.get();
       new_loop->body_instructions.push_tail(ir->clone(mem_ctx, ht));
    }
 
-   new_loop->cmp = this->cmp;
    return new_loop;
 }
 
index a0fe3b95d35d342de5c980dd5a3c1d14b761b4d6..2a1f70e5baa12d18f4d223df67084a5f9b44fc99 100644 (file)
@@ -87,36 +87,10 @@ ir_loop::accept(ir_hierarchical_visitor *v)
    if (s != visit_continue)
       return (s == visit_continue_with_parent) ? visit_continue : s;
 
-   if (this->counter) {
-      s = this->counter->accept(v);
-      if (s != visit_continue)
-         return (s == visit_continue_with_parent) ? visit_continue : s;
-   }
-
    s = visit_list_elements(v, &this->body_instructions);
    if (s == visit_stop)
       return s;
 
-   if (s != visit_continue_with_parent) {
-      if (this->from) {
-        s = this->from->accept(v);
-        if (s != visit_continue)
-           return (s == visit_continue_with_parent) ? visit_continue : s;
-      }
-
-      if (this->to) {
-        s = this->to->accept(v);
-        if (s != visit_continue)
-           return (s == visit_continue_with_parent) ? visit_continue : s;
-      }
-
-      if (this->increment) {
-        s = this->increment->accept(v);
-        if (s != visit_continue)
-           return (s == visit_continue_with_parent) ? visit_continue : s;
-      }
-   }
-
    return v->visit_leave(this);
 }
 
index f4109fb1f4cc8ff2ba7b0e18365694ebd1aa3f3e..857a27ad21f3d71b551ace6e9c4cfcf5f92158cd 100644 (file)
@@ -524,17 +524,8 @@ void
 ir_print_visitor::visit(ir_loop *ir)
 {
    printf("(loop (");
-   if (ir->counter != NULL)
-      ir->counter->accept(this);
-   printf(") (");
-   if (ir->from != NULL)
-      ir->from->accept(this);
-   printf(") (");
-   if (ir->to != NULL)
-      ir->to->accept(this);
-   printf(") (");
-   if (ir->increment != NULL)
-      ir->increment->accept(this);
+   if (ir->normative_bound >= 0)
+      printf("%d", ir->normative_bound);
    printf(") (\n");
    indentation++;
 
index 7fcb34d2390eb352b0eaddf6a25b6a52749867df..72ce684b69cb2e06b3c59c3a937c18f9fea473d3 100644 (file)
@@ -488,18 +488,34 @@ ir_reader::read_if(s_expression *expr, ir_loop *loop_ctx)
 ir_loop *
 ir_reader::read_loop(s_expression *expr)
 {
-   s_expression *s_counter, *s_from, *s_to, *s_inc, *s_body;
+   s_expression *s_bound_expr, *s_body, *s_bound;
 
-   s_pattern pat[] = { "loop", s_counter, s_from, s_to, s_inc, s_body };
-   if (!MATCH(expr, pat)) {
-      ir_read_error(expr, "expected (loop <counter> <from> <to> "
-                         "<increment> <body>)");
+   s_pattern loop_pat[] = { "loop", s_bound_expr, s_body };
+   s_pattern no_bound_pat[] = { };
+   s_pattern bound_pat[] = { s_bound };
+   if (!MATCH(expr, loop_pat)) {
+      ir_read_error(expr, "expected (loop <bound> <body>)");
       return NULL;
    }
 
-   // FINISHME: actually read the count/from/to fields.
-
    ir_loop *loop = new(mem_ctx) ir_loop;
+
+   if (MATCH(s_bound_expr, no_bound_pat)) {
+      loop->normative_bound = -1;
+   } else if (MATCH(s_bound_expr, bound_pat)) {
+      s_int *value = SX_AS_INT(s_bound);
+      if (value == NULL) {
+         ir_read_error(s_bound_expr, "malformed loop bound");
+         delete loop;
+         return NULL;
+      }
+      loop->normative_bound = value->value();
+   } else {
+      ir_read_error(s_bound_expr, "malformed loop bound");
+      delete loop;
+      return NULL;
+   }
+
    read_instructions(&loop->body_instructions, s_body, loop);
    if (state->error) {
       delete loop;
index 26d63883422a6b78c88affa57806aa8c44ef6282..8e73229572dd1cc152ab321662f65f0c798bd135 100644 (file)
@@ -63,8 +63,6 @@ public:
 
    virtual ir_visitor_status visit_enter(ir_if *ir);
 
-   virtual ir_visitor_status visit_enter(ir_loop *ir);
-   virtual ir_visitor_status visit_leave(ir_loop *ir);
    virtual ir_visitor_status visit_enter(ir_function *ir);
    virtual ir_visitor_status visit_leave(ir_function *ir);
    virtual ir_visitor_status visit_enter(ir_function_signature *ir);
@@ -149,54 +147,6 @@ ir_validate::visit_enter(ir_if *ir)
 }
 
 
-ir_visitor_status
-ir_validate::visit_enter(ir_loop *ir)
-{
-   if (ir->counter != NULL && hash_table_find(ht, ir->counter) != NULL) {
-      printf("ir_loop @ %p specifies already-declared variable `%s' @ %p\n",
-             (void *) ir, ir->counter->name, (void *) ir->counter);
-      abort();
-   }
-   return visit_continue;
-}
-
-
-ir_visitor_status
-ir_validate::visit_leave(ir_loop *ir)
-{
-   if (ir->counter != NULL) {
-      if ((ir->from == NULL) || (ir->to == NULL) || (ir->increment == NULL)) {
-        printf("ir_loop has invalid loop controls:\n"
-               "    counter:   %p\n"
-               "    from:      %p\n"
-               "    to:        %p\n"
-               "    increment: %p\n",
-               (void *) ir->counter, (void *) ir->from, (void *) ir->to,
-                (void *) ir->increment);
-        abort();
-      }
-
-      if ((ir->cmp < ir_binop_less) || (ir->cmp > ir_binop_nequal)) {
-        printf("ir_loop has invalid comparitor %d\n", ir->cmp);
-        abort();
-      }
-   } else {
-      if ((ir->from != NULL) || (ir->to != NULL) || (ir->increment != NULL)) {
-        printf("ir_loop has invalid loop controls:\n"
-               "    counter:   %p\n"
-               "    from:      %p\n"
-               "    to:        %p\n"
-               "    increment: %p\n",
-               (void *) ir->counter, (void *) ir->from, (void *) ir->to,
-                (void *) ir->increment);
-        abort();
-      }
-   }
-
-   return visit_continue;
-}
-
-
 ir_visitor_status
 ir_validate::visit_enter(ir_function *ir)
 {
index 425ed812dc323f337f445f8206f44073b85b65b2..923eb1a82749e8f71e2e2cf368f35f34e0d51b7a 100644 (file)
@@ -132,24 +132,3 @@ ir_variable_refcount_visitor::visit_leave(ir_assignment *ir)
 
    return visit_continue;
 }
-
-
-ir_visitor_status
-ir_variable_refcount_visitor::visit_leave(ir_loop *ir)
-{
-   /* If the loop has a counter variable, it is implicitly referenced and
-    * assigned to.  Note that since the LHS of an assignment is counted as a
-    * reference, we actually have to increment referenced_count by 2 so that
-    * later code will know that the variable isn't just assigned to.
-    */
-   if (ir->counter != NULL) {
-      ir_variable_refcount_entry *entry =
-         this->get_variable_entry(ir->counter);
-      if (entry) {
-         entry->referenced_count += 2;
-         entry->assigned_count++;
-      }
-   }
-
-   return visit_continue;
-}
index 03fa7b5b4670b045157a0a0e18e26be3ffcd8791..c15e8110d04a98bc6b0f0d1eba20faa5f55c496a 100644 (file)
@@ -60,7 +60,6 @@ public:
 
    virtual ir_visitor_status visit_enter(ir_function_signature *);
    virtual ir_visitor_status visit_leave(ir_assignment *);
-   virtual ir_visitor_status visit_leave(ir_loop *);
 
    ir_variable_refcount_entry *get_variable_entry(ir_variable *var);
 
index 3c3719b919e02c3f3068929fa8f7b84e63336119..c7fa7ea07c7622c260df84bead91d8232f899bf8 100644 (file)
@@ -44,8 +44,7 @@ analyze_loop_variables(exec_list *instructions);
  *
  *  (if (expression bool ...) (break))
  *
- * and fill in the \c ir_loop::from, \c ir_loop::to, and \c ir_loop::counter
- * fields of the \c ir_loop.
+ * and fill in the \c normative_bound field of the \c ir_loop.
  *
  * In this process, some conditional break-statements may be eliminated
  * altogether.  For example, if it is provable that one loop exit condition will
index 0eb103f49b86bcd4af55d1f0105b88cb8dfa135c..a1dc20e719853a59354735a79242817410c76aef 100644 (file)
@@ -187,13 +187,11 @@ loop_control_visitor::visit_leave(ir_loop *ir)
     * i is a loop induction variable, c is a constant, and < is any relative
     * operator.
     */
-   int max_iterations = ls->max_iterations;
+   unsigned max_iterations =
+      ls->max_iterations < 0 ? INT_MAX : ls->max_iterations;
 
-   if(ir->from && ir->to && ir->increment)
-      max_iterations = calculate_iterations(ir->from, ir->to, ir->increment, (ir_expression_operation)ir->cmp);
-
-   if(max_iterations < 0)
-      max_iterations = INT_MAX;
+   if (ir->normative_bound >= 0)
+      max_iterations = ir->normative_bound;
 
    foreach_list(node, &ls->terminators) {
       loop_terminator *t = (loop_terminator *) node;
@@ -248,14 +246,11 @@ loop_control_visitor::visit_leave(ir_loop *ir)
                                                           cmp);
               if (iterations >= 0) {
                  /* If the new iteration count is lower than the previously
-                  * believed iteration count, update the loop control values.
+                  * believed iteration count, then add a normative bound to
+                  * this loop.
                   */
-                 if (iterations < max_iterations) {
-                    ir->from = init->clone(ir, NULL);
-                    ir->to = limit->clone(ir, NULL);
-                    ir->increment = lv->increment->clone(ir, NULL);
-                    ir->counter = lv->var->clone(ir, NULL);
-                    ir->cmp = cmp;
+                 if ((unsigned) iterations < max_iterations) {
+                     ir->normative_bound = iterations;
 
                     max_iterations = iterations;
                  }
index 10f272f36f89200ac43c2e5d48e581b2bb5d5fa5..0cd907d91b252f3734b801c7456e69a370eb5d07 100644 (file)
@@ -72,34 +72,34 @@ public:
 ir_visitor_status
 lower_bounded_loops_visitor::visit_leave(ir_loop *ir)
 {
-   if (ir->counter == NULL)
+   if (ir->normative_bound < 0)
       return visit_continue;
 
    exec_list new_instructions;
    ir_factory f(&new_instructions, ralloc_parent(ir));
 
-   /* Before the loop, declare the counter and initialize it to "from". */
-   f.emit(ir->counter);
-   f.emit(assign(ir->counter, ir->from));
+   /* Before the loop, declare the counter and initialize it to zero. */
+   ir_variable *counter = f.make_temp(glsl_type::uint_type, "counter");
+   f.emit(assign(counter, f.constant(0u)));
    ir->insert_before(&new_instructions);
 
-   /* At the top of the loop, compare the counter to "to", and break if the
-    * comparison succeeds.
+   /* At the top of the loop, compare the counter to normative_bound, and
+    * break if the comparison succeeds.
     */
    ir_loop_jump *brk = new(f.mem_ctx) ir_loop_jump(ir_loop_jump::jump_break);
-   ir_expression_operation cmp = (ir_expression_operation) ir->cmp;
-   ir->body_instructions.push_head(if_tree(expr(cmp, ir->counter, ir->to),
-                                           brk));
+   ir_if *if_inst = if_tree(gequal(counter,
+                                   f.constant((unsigned) ir->normative_bound)),
+                            brk);
+   ir->body_instructions.push_head(if_inst);
 
    /* At the bottom of the loop, increment the counter. */
-   ir->body_instructions.push_tail(assign(ir->counter,
-                                          add(ir->counter, ir->increment)));
-
-   /* NULL out the counter, from, to, and increment variables. */
-   ir->counter = NULL;
-   ir->from = NULL;
-   ir->to = NULL;
-   ir->increment = NULL;
+   ir->body_instructions.push_tail(assign(counter,
+                                          add(counter, f.constant(1u))));
+
+   /* Since we've explicitly added instructions to terminate the loop, we no
+    * longer need it to have a normative bound.
+    */
+   ir->normative_bound = -1;
 
    this->progress = true;
    return visit_continue;
index dc9cf8f1a60fd10d8ff0e6db47f71defebadd7e4..c38ed9e70c6be008dd9535770cea5122d9aae307 100755 (executable)
@@ -8,6 +8,6 @@
 ((declare (out) float a)
  (function main
   (signature void (parameters)
-   ((loop () () () ()
+   ((loop ()
      ((assign (x) (var_ref a) (constant float (1.000000))) break))))))
 EOF
index d4bb6fc02748afd841326adf14a18459c01892dc..b278b1c79c1c0b85c769aca91bd78b41b706c5f5 100644 (file)
@@ -1,5 +1,5 @@
 ((declare (out) float a)
  (function main
   (signature void (parameters)
-   ((loop () () () ()
+   ((loop ()
      ((assign (x) (var_ref a) (constant float (1.000000))) break))))))
index 9b297daf14eeaf4dbed7c8febc9f5687ba4ee6de..a4a94e05be57c0cee4ba91b36b13e8f1274337c7 100755 (executable)
@@ -8,7 +8,7 @@
 ((declare (in) float b) (declare (out) float a)
  (function main
   (signature void (parameters)
-   ((loop () () () ()
+   ((loop ()
      ((assign (x) (var_ref a) (constant float (1.000000)))
       (if (expression bool > (var_ref b) (constant float (0.000000))) (break)
        ())))))))
index 3771efc7511d35e6a7098e888d670209f852c843..90156be830481d6838a37ae964f296fb08bb0950 100644 (file)
@@ -1,7 +1,7 @@
 ((declare (in) float b) (declare (out) float a)
  (function main
   (signature void (parameters)
-   ((loop () () () ()
+   ((loop ()
      ((assign (x) (var_ref a) (constant float (1.000000)))
       (if (expression bool > (var_ref b) (constant float (0.0))) (break)
        ())))))))
index 366e23093a794068e42f8a080de419f3f06a3e0a..4475eea0b359fcf18e6687f01973e4c0320d82ad 100755 (executable)
@@ -9,7 +9,7 @@
 ((declare (in) float b) (declare (out) float a) (declare (out) float c)
  (function main
   (signature void (parameters)
-   ((loop () () () ()
+   ((loop ()
      ((assign (x) (var_ref a) (constant float (1.000000)))
       (if (expression bool > (var_ref b) (constant float (0.000000)))
        ((assign (x) (var_ref c) (constant float (1.000000))) break)
index afae5e7c77b4ae5c12a80f0301e9253470ffe6ad..e31a71257de9bd5b37e5eec1e6d79498c647b1f0 100644 (file)
@@ -1,7 +1,7 @@
 ((declare (in) float b) (declare (out) float a) (declare (out) float c)
  (function main
   (signature void (parameters)
-   ((loop () () () ()
+   ((loop ()
      ((assign (x) (var_ref a) (constant float (1.000000)))
       (if (expression bool > (var_ref b) (constant float (0.0)))
        ((assign (x) (var_ref c) (constant float (1.000000))) break)
index 350ad628fb39ec93849cf810a2541345dcd882b7..cb06cfd6ddd2b975c2134e933956aa9c28425cc0 100755 (executable)
@@ -8,7 +8,7 @@
 ((declare (in) float b) (declare (out) float a)
  (function main
   (signature void (parameters)
-   ((loop () () () ()
+   ((loop ()
      ((assign (x) (var_ref a) (constant float (1.000000)))
       (if (expression bool > (var_ref b) (constant float (0.000000))) ()
        (break))))))))
index 588a3f66a531bc83a786b42b1785ef6bd6228d37..3c216ed6a573d8ad4f134b15c6630ddafe5fdadf 100644 (file)
@@ -1,7 +1,7 @@
 ((declare (in) float b) (declare (out) float a)
  (function main
   (signature void (parameters)
-   ((loop () () () ()
+   ((loop ()
      ((assign (x) (var_ref a) (constant float (1.000000)))
       (if (expression bool > (var_ref b) (constant float (0.0))) ()
        (break))))))))
index 72b207205723c832ab60dbb3e0311b17e7e80fcd..0a7a11250f2fd76009ae124ffdc156b773bb9791 100755 (executable)
@@ -9,7 +9,7 @@
 ((declare (in) float b) (declare (out) float a) (declare (out) float c)
  (function main
   (signature void (parameters)
-   ((loop () () () ()
+   ((loop ()
      ((assign (x) (var_ref a) (constant float (1.000000)))
       (if (expression bool > (var_ref b) (constant float (0.000000))) ()
        ((assign (x) (var_ref c) (constant float (1.000000))) break))))))))
index da2d1a2c8200c9b6a59f00650df292bf29f07637..45e718ddcd618b008e9203c8cd22e9e0ed1702ee 100644 (file)
@@ -1,7 +1,7 @@
 ((declare (in) float b) (declare (out) float a) (declare (out) float c)
  (function main
   (signature void (parameters)
-   ((loop () () () ()
+   ((loop ()
      ((assign (x) (var_ref a) (constant float (1.000000)))
       (if (expression bool > (var_ref b) (constant float (0.0))) ()
        ((assign (x) (var_ref c) (constant float (1.000000))) break))))))))
index 711ab87218d88472698861cd1938336469bd8c1c..4786063056799eaec8a6341c600993b2f0f03fc6 100755 (executable)
@@ -12,7 +12,7 @@
  (declare (in) float cb)
  (function main
   (signature void (parameters)
-   ((loop () () () ()
+   ((loop ()
      ((if (expression bool > (var_ref a) (constant float (0.000000)))
        ((if (expression bool > (var_ref ba) (constant float (0.000000)))
          ((if (expression bool > (var_ref bb) (constant float (0.000000)))
index 9adf8655f238a368accd805098f86108894970f6..338d751e84d52156f69ec0daaec10380fdf07dbd 100644 (file)
@@ -5,7 +5,7 @@
   (signature void (parameters)
    ((declare (temporary) bool break_flag)
     (assign (x) (var_ref break_flag) (constant bool (0)))
-    (loop () () () ()
+    (loop ()
      ((declare (temporary) bool execute_flag)
       (assign (x) (var_ref execute_flag) (constant bool (1)))
       (if (expression bool > (var_ref a) (constant float (0.0)))
index a63306931ca4b26fe2c1642ad02fbeb4a1421215..0f84c5d507c72d04e377189138e45d3ccd5d15be 100755 (executable)
@@ -10,7 +10,7 @@
 ((declare (in) float aa) (declare (in) float ab) (declare (in) float b)
  (function main
   (signature void (parameters)
-   ((loop () () () ()
+   ((loop ()
      ((if (expression bool > (var_ref aa) (constant float (0.000000)))
        ((if (expression bool > (var_ref ab) (constant float (0.000000)))
          (continue)
index a69e2b791a6f1ea10a19ac60c03267876022febd..3ce323aead8662d64db20375165a68a98cd725d8 100644 (file)
@@ -3,7 +3,7 @@
   (signature void (parameters)
    ((declare (temporary) bool break_flag)
     (assign (x) (var_ref break_flag) (constant bool (0)))
-    (loop () () () ()
+    (loop ()
      ((declare (temporary) bool execute_flag)
       (assign (x) (var_ref execute_flag) (constant bool (1)))
       (if (expression bool > (var_ref aa) (constant float (0.0)))
index eeae6fd6f9eb720af7b3948abd3d7bec378c67c2..cebdad78d36001132318175c9168d12cedd50f65 100755 (executable)
@@ -19,7 +19,7 @@
        ((return))
        ()))
      ())
-    (loop () () () ()
+    (loop ()
      ((if (expression bool > (var_ref b) (constant float (0.000000)))
        ((if (expression bool > (var_ref c) (constant float (0.000000))) (break)
          (continue)))
index b921d307ff68164a6c8a594d6978e31b64d762c8..e4339b14268bbf68ae36305ae0463a1b39f02e3e 100644 (file)
@@ -14,7 +14,7 @@
        ()))
      ())
     (if (var_ref execute_flag)
-     ((loop () () () ()
+     ((loop ()
        ((if (expression bool > (var_ref b) (constant float (0.0)))
          ((if (expression bool > (var_ref c) (constant float (0.0))) ()
            (continue)))
index ceb010c7c658f15ed3bc42294e15b0dde73930c7..da1caad064e852963d9f22ba0d1cfc3c50dd26dd 100755 (executable)
@@ -8,6 +8,6 @@
 ((declare (out) float a)
  (function main
   (signature void (parameters)
-   ((loop () () () ()
+   ((loop ()
      ((assign (x) (var_ref a) (constant float (1.000000))) continue))))))
 EOF
index d2a02c6f38094846db3d64d57a45c8c0052504ad..df2b5483d862d4cf179d2bc794a8b9b2d1fd442a 100644 (file)
@@ -1,5 +1,5 @@
 ((declare (out) float a)
  (function main
   (signature void (parameters)
-   ((loop () () () ()
+   ((loop ()
      ((assign (x) (var_ref a) (constant float (1.000000)))))))))
index a93167b645c5e80b0010a0719d26c704d529e5e1..0b46a7951301e257394a6d72fb77982af1a67ad5 100755 (executable)
@@ -8,7 +8,7 @@
 ((declare (out) float a) (declare (out) float b)
  (function sub
   (signature float (parameters)
-   ((loop () () () ()
+   ((loop ()
      ((assign (x) (var_ref a) (constant float (1.000000)))
       (return (constant float (2.000000)))))
     (assign (x) (var_ref b) (constant float (3.000000)))
index 2cf117a5ee1ca6d1f71e3a9bcd7729bfadd0c825..a1f3cdee713642c3c3ddc9ab8a56d77f0f90f52e 100644 (file)
@@ -1,7 +1,7 @@
 ((declare (out) float a) (declare (out) float b)
  (function sub
   (signature float (parameters)
-   ((loop () () () ()
+   ((loop ()
      ((assign (x) (var_ref a) (constant float (1.000000)))
       (return (constant float (2.000000)))))
     (assign (x) (var_ref b) (constant float (3.000000)))
index 9ce33f0ac2e3a1ebba2ff4c5c4448a5cc3768ef3..0d73a6603b531552db7a6100ef1fa3a5f12e453c 100755 (executable)
@@ -8,7 +8,7 @@
 ((declare (out) float a) (declare (out) float b)
  (function sub
   (signature float (parameters)
-   ((loop () () () ()
+   ((loop ()
      ((assign (x) (var_ref a) (constant float (1.000000)))
       (return (constant float (2.000000)))))
     (assign (x) (var_ref b) (constant float (3.000000)))
index 0bab8f16f30d5d163ce7791e93396f1e8a72e445..52bc99ccb3a79f2d047ff6986bd6d66e0cb963ef 100644 (file)
@@ -6,7 +6,7 @@
     (declare (temporary) float return_value)
     (declare (temporary) bool return_flag)
     (assign (x) (var_ref return_flag) (constant bool (0)))
-    (loop () () () ()
+    (loop ()
      ((assign (x) (var_ref a) (constant float (1.000000)))
       (assign (x) (var_ref return_value) (constant float (2.000000)))
       (assign (x) (var_ref return_flag) (constant bool (1)))
index 06988c2957112a2145c93c71b5e96b967fe2bb40..8b08c996b979b71066cb71da14279364bcf2035c 100755 (executable)
@@ -8,7 +8,7 @@
 ((declare (out) float a) (declare (out) float b)
  (function sub
   (signature float (parameters)
-   ((loop () () () ()
+   ((loop ()
      ((assign (x) (var_ref a) (constant float (1.000000)))
       (return (constant float (2.000000)))))
     (assign (x) (var_ref b) (constant float (3.000000)))
index 0bab8f16f30d5d163ce7791e93396f1e8a72e445..52bc99ccb3a79f2d047ff6986bd6d66e0cb963ef 100644 (file)
@@ -6,7 +6,7 @@
     (declare (temporary) float return_value)
     (declare (temporary) bool return_flag)
     (assign (x) (var_ref return_flag) (constant bool (0)))
-    (loop () () () ()
+    (loop ()
      ((assign (x) (var_ref a) (constant float (1.000000)))
       (assign (x) (var_ref return_value) (constant float (2.000000)))
       (assign (x) (var_ref return_flag) (constant bool (1)))
index 45699a897e4fa7b6b3c6d087b444b54d86d2cae0..f5b45bc058f332def9562fc7a11ee39e0a95f6e3 100755 (executable)
@@ -8,7 +8,7 @@
 ((declare (out) float a) (declare (out) float b)
  (function main
   (signature void (parameters)
-   ((loop () () () ()
+   ((loop ()
      ((assign (x) (var_ref a) (constant float (1.000000))) (return)))
     (assign (x) (var_ref b) (constant float (2.000000)))))))
 EOF
index 0bd8037bf00d16bcd2bb99d0d82a0d1f426b2e0c..ae9359ff273358b71e0e6b5039754bc8d10cce56 100644 (file)
@@ -1,6 +1,6 @@
 ((declare (out) float a) (declare (out) float b)
  (function main
   (signature void (parameters)
-   ((loop () () () ()
+   ((loop ()
      ((assign (x) (var_ref a) (constant float (1.000000))) (return)))
     (assign (x) (var_ref b) (constant float (2.000000)))))))
index abfa582c2914029c92a2aa4cd5b5d5ca27a75750..2a02101d8ff87e970eb1b8fd23b523f896561547 100755 (executable)
@@ -8,7 +8,7 @@
 ((declare (out) float a) (declare (out) float b)
  (function main
   (signature void (parameters)
-   ((loop () () () ()
+   ((loop ()
      ((assign (x) (var_ref a) (constant float (1.000000))) (return)))
     (assign (x) (var_ref b) (constant float (2.000000)))))))
 EOF
index 53814eaacad9bbd10e8d96df4bf4c10b1f033284..d6dd1db68b50c1fee1d6702b649bbc4a23d5d6c5 100644 (file)
@@ -3,7 +3,7 @@
   (signature void (parameters)
    ((declare (temporary) bool return_flag)
     (assign (x) (var_ref return_flag) (constant bool (0)))
-    (loop () () () ()
+    (loop ()
      ((assign (x) (var_ref a) (constant float (1.000000)))
       (assign (x) (var_ref return_flag) (constant bool (1)))
       break))
index a8c5e379136109bb828aededc1b3353342281115..4c6f959122220922e15d0960b17805d97f8cb2e2 100755 (executable)
@@ -8,7 +8,7 @@
 ((declare (out) float a) (declare (out) float b)
  (function main
   (signature void (parameters)
-   ((loop () () () ()
+   ((loop ()
      ((assign (x) (var_ref a) (constant float (1.000000))) (return)))
     (assign (x) (var_ref b) (constant float (2.000000)))))))
 EOF
index 53814eaacad9bbd10e8d96df4bf4c10b1f033284..d6dd1db68b50c1fee1d6702b649bbc4a23d5d6c5 100644 (file)
@@ -3,7 +3,7 @@
   (signature void (parameters)
    ((declare (temporary) bool return_flag)
     (assign (x) (var_ref return_flag) (constant bool (0)))
-    (loop () () () ()
+    (loop ()
      ((assign (x) (var_ref a) (constant float (1.000000)))
       (assign (x) (var_ref return_flag) (constant bool (1)))
       break))
index 3e32f6e0eba7d534d4ad1bbb5929c39bdda18d73..70eb997944283a766070c6691c040349e8558865 100644 (file)
@@ -2181,8 +2181,10 @@ fs_visitor::visit(ir_if *ir)
 void
 fs_visitor::visit(ir_loop *ir)
 {
-   /* Any bounded loops should have been lowered by lower_bounded_loops(). */
-   assert(ir->counter == NULL);
+   /* Any normative loop bounds should have been lowered by
+    * lower_bounded_loops().
+    */
+   assert(ir->normative_bound < 0);
 
    if (brw->gen < 6 && dispatch_width == 16) {
       fail("Can't support (non-uniform) control flow on 16-wide\n");
index cf62e7ed0b081902a9aff3792fe845d32d2edb60..d0e378b76ef4ae6d3992b19112e1b6cf49d19f85 100644 (file)
@@ -1007,8 +1007,10 @@ vec4_visitor::visit(ir_variable *ir)
 void
 vec4_visitor::visit(ir_loop *ir)
 {
-   /* Any bounded loops should have been lowered by lower_bounded_loops(). */
-   assert(ir->counter == NULL);
+   /* Any normative loop bounds should have been lowered by
+    * lower_bounded_loops().
+    */
+   assert(ir->normative_bound < 0);
 
    /* We don't want debugging output to print the whole body of the
     * loop as the annotation.
index 9fd10d1d91cae8b0f31679141fe3a8600d938274..583cdef9f26c1b24f1c589c1c69727c4e4d1fcab 100644 (file)
@@ -759,8 +759,10 @@ ir_to_mesa_visitor::visit(ir_variable *ir)
 void
 ir_to_mesa_visitor::visit(ir_loop *ir)
 {
-   /* Any bounded loops should have been lowered by lower_bounded_loops(). */
-   assert(ir->counter == NULL);
+   /* Any normative loop bounds should have been lowered by
+    * lower_bounded_loops().
+    */
+   assert(ir->normative_bound < 0);
 
    emit(NULL, OPCODE_BGNLOOP);
 
index f748ed85092ddb7b22f81e5b1d1be3382f7ac419..18d2a5b0a41fd73e31cf0897b3e0cfe6bc6d4e30 100644 (file)
@@ -1137,8 +1137,10 @@ glsl_to_tgsi_visitor::visit(ir_variable *ir)
 void
 glsl_to_tgsi_visitor::visit(ir_loop *ir)
 {
-   /* Any bounded loops should have been lowered by lower_bounded_loops(). */
-   assert(ir->counter == NULL);
+   /* Any normative loop bounds should have been lowered by
+    * lower_bounded_loops().
+    */
+   assert(ir->normative_bound < 0);
 
    emit(NULL, TGSI_OPCODE_BGNLOOP);