Add ir_loop to represent loops
authorIan Romanick <ian.d.romanick@intel.com>
Mon, 5 Apr 2010 23:16:07 +0000 (16:16 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Wed, 7 Apr 2010 18:41:50 +0000 (11:41 -0700)
This touches a lot of files because everything derived from ir_visitor
has to be updated.  This is the primary disadvantage of the visitor pattern.

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 adc1405572497b1c19351cbbac5afd0e68ba04c5..8c533c308a04d55352f0b943eed036577dd60637 100644 (file)
--- a/ir.h
+++ b/ir.h
@@ -287,6 +287,44 @@ public:
 };
 
 
+/**
+ * IR instruction representing a high-level loop structure.
+ */
+class ir_loop : public ir_instruction {
+public:
+   ir_loop() : from(NULL), to(NULL), increment(NULL), counter(NULL)
+   {
+      /* empty */
+   }
+
+   virtual void accept(ir_visitor *v)
+   {
+      v->visit(this);
+   }
+
+   /**
+    * Get an iterator for the instructions of the loop body
+    */
+   exec_list_iterator iterator()
+   {
+      return body_instructions.iterator();
+   }
+
+   /** List of instructions that make up the body of the loop. */
+   exec_list body_instructions;
+
+   /**
+    * \name Loop counter and controls
+    */
+   /*@{*/
+   ir_rvalue *from;
+   ir_rvalue *to;
+   ir_rvalue *increment;
+   ir_variable *counter;
+   /*@}*/
+};
+
+
 class ir_assignment : public ir_rvalue {
 public:
    ir_assignment(ir_rvalue *lhs, ir_rvalue *rhs, ir_rvalue *condition);
index e1073cde1ceaa325a87dc4c8167807afe1419149..a94b0fc9e2a3baf9900f1fa109d1347dc04c1868 100644 (file)
@@ -74,6 +74,7 @@ public:
    virtual void visit(ir_call *);
    virtual void visit(ir_return *);
    virtual void visit(ir_if *);
+   virtual void visit(ir_loop *);
    /*@}*/
 
    /**
@@ -464,3 +465,11 @@ ir_constant_visitor::visit(ir_if *ir)
    (void) ir;
    value = NULL;
 }
+
+
+void
+ir_constant_visitor::visit(ir_loop *ir)
+{
+   (void) ir;
+   value = NULL;
+}
index af6674c3f6e74ef48284ff9133b1ede1a27e68cc..d7efdecc45f9ed9c262db25c499844b22b86bbc6 100644 (file)
@@ -145,3 +145,10 @@ ir_constant_folding_visitor::visit(ir_if *ir)
    visit_exec_list(&ir->then_instructions, this);
    visit_exec_list(&ir->else_instructions, this);
 }
+
+
+void
+ir_constant_folding_visitor::visit(ir_loop *ir)
+{
+   (void) ir;
+}
index 9e151ecde667e7235101df0b97720979101a4af3..382f57c7e558ecf5d0ec4b2e77378d71869378cd 100644 (file)
@@ -58,5 +58,6 @@ public:
    virtual void visit(ir_call *);
    virtual void visit(ir_return *);
    virtual void visit(ir_if *);
+   virtual void visit(ir_loop *);
    /*@}*/
 };
index 375659d5cffb5da92b729ddd7948b4e29f258def..76524261ecdac0e55ddc169268c500f4a79ffd43 100644 (file)
@@ -294,3 +294,28 @@ ir_print_visitor::visit(ir_if *ir)
    }
    printf("))\n");
 }
+
+
+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);
+   printf(") (");
+   foreach_iter(exec_list_iterator, iter, ir->body_instructions) {
+      ir_instruction *const inst = (ir_instruction *) iter.get();
+
+      inst->accept(this);
+   }
+   printf("))\n");
+}
index 76d812e19c1abbb12077c7b7f7fd2c38b5ef2681..a6365bec7e2ed6bfb6d00093fe7a5dcf6dd0ac32 100644 (file)
@@ -65,6 +65,7 @@ public:
    virtual void visit(ir_call *);
    virtual void visit(ir_return *);
    virtual void visit(ir_if *);
+   virtual void visit(ir_loop *);
    /*@}*/
 
 private:
index 521b1c3d8050cc24fc49f6584652f787020d0001..fab1a75d53fdba150ece2b292845c3b52ef006f1 100644 (file)
@@ -56,6 +56,7 @@ public:
    virtual void visit(class ir_call *) = 0;
    virtual void visit(class ir_return *) = 0;
    virtual void visit(class ir_if *) = 0;
+   virtual void visit(class ir_loop *) = 0;
    /*@}*/
 };