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 8c533c308a04d55352f0b943eed036577dd60637..4266dbc17aa456a7f0a45b8fe24a7520315e77dd 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 a94b0fc9e2a3baf9900f1fa109d1347dc04c1868..7e1bb030f57c553faebcdf0f5e415faead14bb33 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 d7efdecc45f9ed9c262db25c499844b22b86bbc6..e43f6f0ea4c9eb2d5507ec57f768bc26d7afd5ee 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 382f57c7e558ecf5d0ec4b2e77378d71869378cd..843b3ad0b77b6d7d7e9bba44d0ad6c2e903d585e 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 76524261ecdac0e55ddc169268c500f4a79ffd43..996beaf29084de944b3a3f370bd4c0ce67ab03d6 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 a6365bec7e2ed6bfb6d00093fe7a5dcf6dd0ac32..82ebbac81f0e70b53c74d24c0efbb49523d77dba 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 fab1a75d53fdba150ece2b292845c3b52ef006f1..323720e93eda7398aac3a1bc92705e69825a6263 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;
    /*@}*/
 };