Add ir_loop_jump to represent 'break' and 'continue' in loops
authorIan Romanick <ian.d.romanick@intel.com>
Mon, 5 Apr 2010 23:28:15 +0000 (16:28 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Wed, 7 Apr 2010 18:42:30 +0000 (11:42 -0700)
ir.h
ir_constant_expression.cpp
ir_constant_folding.cpp
ir_constant_folding.h
ir_print_visitor.cpp
ir_print_visitor.h
ir_visitor.h

diff --git a/ir.h b/ir.h
index 8c533c3..4266dbc 100644 (file)
--- a/ir.h
+++ b/ir.h
@@ -532,6 +532,51 @@ public:
 private:
    ir_rvalue *value;
 };
+
+
+/**
+ * Jump instructions used inside loops
+ *
+ * These include \c break and \c continue.  The \c break within a loop is
+ * different from the \c break within a switch-statement.
+ *
+ * \sa ir_switch_jump
+ */
+class ir_loop_jump : public ir_jump {
+public:
+   enum jump_mode {
+      jump_break,
+      jump_continue
+   };
+
+   ir_loop_jump(ir_loop *loop, jump_mode mode)
+      : loop(loop), mode(mode)
+   {
+      /* empty */
+   }
+
+   virtual void accept(ir_visitor *v)
+   {
+      v->visit(this);
+   }
+
+   bool is_break() const
+   {
+      return mode == jump_break;
+   }
+
+   bool is_continue() const
+   {
+      return mode == jump_continue;
+   }
+
+private:
+   /** Loop containing this break instruction. */
+   ir_loop *loop;
+
+   /** Mode selector for the jump instruction. */
+   enum jump_mode mode;
+};
 /*@}*/
 
 
index a94b0fc..7e1bb03 100644 (file)
@@ -75,6 +75,7 @@ public:
    virtual void visit(ir_return *);
    virtual void visit(ir_if *);
    virtual void visit(ir_loop *);
+   virtual void visit(ir_loop_jump *);
    /*@}*/
 
    /**
@@ -473,3 +474,11 @@ ir_constant_visitor::visit(ir_loop *ir)
    (void) ir;
    value = NULL;
 }
+
+
+void
+ir_constant_visitor::visit(ir_loop_jump *ir)
+{
+   (void) ir;
+   value = NULL;
+}
index d7efdec..e43f6f0 100644 (file)
@@ -152,3 +152,10 @@ ir_constant_folding_visitor::visit(ir_loop *ir)
 {
    (void) ir;
 }
+
+
+void
+ir_constant_folding_visitor::visit(ir_loop_jump *ir)
+{
+   (void) ir;
+}
index 382f57c..843b3ad 100644 (file)
@@ -59,5 +59,6 @@ public:
    virtual void visit(ir_return *);
    virtual void visit(ir_if *);
    virtual void visit(ir_loop *);
+   virtual void visit(ir_loop_jump *);
    /*@}*/
 };
index 7652426..996beaf 100644 (file)
@@ -319,3 +319,10 @@ ir_print_visitor::visit(ir_loop *ir)
    }
    printf("))\n");
 }
+
+
+void
+ir_print_visitor::visit(ir_loop_jump *ir)
+{
+   printf("%s", ir->is_break() ? "break" : "continue");
+}
index a6365be..82ebbac 100644 (file)
@@ -66,6 +66,7 @@ public:
    virtual void visit(ir_return *);
    virtual void visit(ir_if *);
    virtual void visit(ir_loop *);
+   virtual void visit(ir_loop_jump *);
    /*@}*/
 
 private:
index fab1a75..323720e 100644 (file)
@@ -57,6 +57,7 @@ public:
    virtual void visit(class ir_return *) = 0;
    virtual void visit(class ir_if *) = 0;
    virtual void visit(class ir_loop *) = 0;
+   virtual void visit(class ir_loop_jump *) = 0;
    /*@}*/
 };