glsl: Clean up code by adding a new is_break() function.
authorKenneth Graunke <kenneth@whitecape.org>
Wed, 1 Dec 2010 23:06:47 +0000 (15:06 -0800)
committerIan Romanick <ian.d.romanick@intel.com>
Fri, 10 Dec 2010 00:42:05 +0000 (16:42 -0800)
src/glsl/loop_unroll.cpp

index 11709587e24e57ce3c2adf43c2bb7d0463f4a68e..4e6acda907ed91f1abaa5337dca4e20a35c2cfe3 100644 (file)
@@ -43,6 +43,14 @@ public:
 };
 
 
+static bool
+is_break(ir_instruction *ir)
+{
+   return ir != NULL && ir->ir_type == ir_type_loop_jump
+                    && ((ir_loop_jump *) ir)->is_break();
+}
+
+
 ir_visitor_status
 loop_unroll_visitor::visit_leave(ir_loop *ir)
 {
@@ -93,14 +101,12 @@ loop_unroll_visitor::visit_leave(ir_loop *ir)
         ir_instruction *last =
            (ir_instruction *) last_if->then_instructions.get_tail();
 
-        if (last && last->ir_type == ir_type_loop_jump
-            && ((ir_loop_jump*) last)->is_break()) {
+        if (is_break(last)) {
            continue_from_then_branch = false;
         } else {
            last = (ir_instruction *) last_if->then_instructions.get_tail();
 
-           if (last && last->ir_type == ir_type_loop_jump
-               && ((ir_loop_jump*) last)->is_break())
+           if (is_break(last))
               continue_from_then_branch = true;
            else
               /* Bail out if neither if-statement branch ends with a break.
@@ -141,8 +147,7 @@ loop_unroll_visitor::visit_leave(ir_loop *ir)
 
          this->progress = true;
          return visit_continue;
-      } else if (last_ir->ir_type == ir_type_loop_jump
-                && ((ir_loop_jump *)last_ir)->is_break()) {
+      } else if (is_break(last_ir)) {
         /* If the only loop-jump is a break at the end of the loop, the loop
          * will execute exactly once.  Remove the break, set the iteration
          * count, and fall through to the normal unroller.