Refactor ir_dereference support for ir_visitor
authorIan Romanick <ian.d.romanick@intel.com>
Wed, 19 May 2010 11:20:12 +0000 (13:20 +0200)
committerIan Romanick <ian.d.romanick@intel.com>
Wed, 26 May 2010 22:23:25 +0000 (15:23 -0700)
Move the accept method for visitors from ir_dereference to the derived
classes.

ir.h
ir_constant_expression.cpp
ir_constant_folding.cpp
ir_copy_propagation.cpp
ir_expression_flattening.cpp
ir_function_inlining.cpp
ir_print_visitor.cpp
ir_print_visitor.h
ir_visitor.h

diff --git a/ir.h b/ir.h
index f785ddb63736ed3e032af760c91ac593df5740bd..2d641766b2e6e255e9b742e68911d37c4c72ad9a 100644 (file)
--- a/ir.h
+++ b/ir.h
@@ -793,11 +793,6 @@ public:
       return this;
    }
 
-   virtual void accept(ir_visitor *v)
-   {
-      v->visit(this);
-   }
-
    bool is_lvalue();
 
    /**
@@ -844,6 +839,11 @@ public:
       return (ir_variable *) this->var;
    }
 
+   virtual void accept(ir_visitor *v)
+   {
+      v->visit(this);
+   }
+
    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
 };
 
@@ -862,6 +862,11 @@ public:
       return ((ir_rvalue *) this->var)->variable_referenced();
    }
 
+   virtual void accept(ir_visitor *v)
+   {
+      v->visit(this);
+   }
+
    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
 
 private:
@@ -883,6 +888,11 @@ public:
       return ((ir_rvalue *) this->var)->variable_referenced();
    }
 
+   virtual void accept(ir_visitor *v)
+   {
+      v->visit(this);
+   }
+
    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
 };
 
index e5626c53117d1db85a05f9fe16247d9fdd99f699..076fdfda75fa2bbbb501a62afe9723d1b962cf7e 100644 (file)
@@ -67,7 +67,9 @@ public:
    virtual void visit(ir_function *);
    virtual void visit(ir_expression *);
    virtual void visit(ir_swizzle *);
-   virtual void visit(ir_dereference *);
+   virtual void visit(ir_dereference_variable *);
+   virtual void visit(ir_dereference_array *);
+   virtual void visit(ir_dereference_record *);
    virtual void visit(ir_assignment *);
    virtual void visit(ir_constant *);
    virtual void visit(ir_call *);
@@ -412,16 +414,28 @@ ir_constant_visitor::visit(ir_swizzle *ir)
 
 
 void
-ir_constant_visitor::visit(ir_dereference *ir)
+ir_constant_visitor::visit(ir_dereference_variable *ir)
 {
    value = NULL;
 
-   if (ir->mode == ir_dereference::ir_reference_variable) {
-      ir_variable *var = ir->var->as_variable();
-      if (var && var->constant_value) {
-        value = new ir_constant(ir->type, &var->constant_value->value);
-      }
-   }
+   ir_variable *var = ir->variable_referenced();
+   if (var && var->constant_value)
+      value = new ir_constant(ir->type, &var->constant_value->value);
+}
+
+
+void
+ir_constant_visitor::visit(ir_dereference_array *ir)
+{
+   value = NULL;
+   /* FINISHME: Other dereference modes. */
+}
+
+
+void
+ir_constant_visitor::visit(ir_dereference_record *ir)
+{
+   value = NULL;
    /* FINISHME: Other dereference modes. */
 }
 
index 913d42f0d9aa12a4aa3ba81b9b70ad35fcd76d68..9a2a7f3f2e7e13f433037f27ab2e394114d70a3f 100644 (file)
@@ -61,7 +61,9 @@ public:
    virtual void visit(ir_function *);
    virtual void visit(ir_expression *);
    virtual void visit(ir_swizzle *);
-   virtual void visit(ir_dereference *);
+   virtual void visit(ir_dereference_variable *);
+   virtual void visit(ir_dereference_array *);
+   virtual void visit(ir_dereference_record *);
    virtual void visit(ir_assignment *);
    virtual void visit(ir_constant *);
    virtual void visit(ir_call *);
@@ -117,15 +119,30 @@ ir_constant_folding_visitor::visit(ir_swizzle *ir)
 
 
 void
-ir_constant_folding_visitor::visit(ir_dereference *ir)
-{
-   if (ir->mode == ir_dereference::ir_reference_array) {
-      ir_constant *const_val = ir->selector.array_index->constant_expression_value();
-      if (const_val)
-        ir->selector.array_index = const_val;
-      else
-        ir->selector.array_index->accept(this);
-   }
+ir_constant_folding_visitor::visit(ir_dereference_variable *ir)
+{
+   (void) ir;
+}
+
+
+void
+ir_constant_folding_visitor::visit(ir_dereference_array *ir)
+{
+   ir_constant *const_val =
+      ir->selector.array_index->constant_expression_value();
+
+   if (const_val)
+      ir->selector.array_index = const_val;
+   else
+      ir->selector.array_index->accept(this);
+
+   ir->var->accept(this);
+}
+
+
+void
+ir_constant_folding_visitor::visit(ir_dereference_record *ir)
+{
    ir->var->accept(this);
 }
 
index aac12b3da380076f6fbdf98f1158bdb278b9d948..47f9390710c61ff64d620973fe3011cd82fa7779 100644 (file)
@@ -78,7 +78,9 @@ public:
    virtual void visit(ir_function *);
    virtual void visit(ir_expression *);
    virtual void visit(ir_swizzle *);
-   virtual void visit(ir_dereference *);
+   virtual void visit(ir_dereference_variable *);
+   virtual void visit(ir_dereference_array *);
+   virtual void visit(ir_dereference_record *);
    virtual void visit(ir_assignment *);
    virtual void visit(ir_constant *);
    virtual void visit(ir_call *);
@@ -149,30 +151,34 @@ ir_copy_propagation_visitor::visit(ir_swizzle *ir)
  * must not be shared by multiple IR operations!
  */
 void
-ir_copy_propagation_visitor::visit(ir_dereference *ir)
+ir_copy_propagation_visitor::visit(ir_dereference_variable *ir)
 {
-   ir_variable *var;
+   ir_variable *var = ir->variable_referenced();
 
-   if (ir->mode == ir_dereference::ir_reference_array) {
-      ir->selector.array_index->accept(this);
-   }
-
-   var = ir->var->as_variable();
-   if (var) {
-      foreach_iter(exec_list_iterator, iter, *this->acp) {
-        acp_entry *entry = (acp_entry *)iter.get();
+   foreach_iter(exec_list_iterator, iter, *this->acp) {
+      acp_entry *entry = (acp_entry *)iter.get();
 
-        if (var == entry->lhs) {
-           ir->var = entry->rhs;
-           this->progress = true;
-           break;
-        }
+      if (var == entry->lhs) {
+        ir->var = entry->rhs;
+        this->progress = true;
+        break;
       }
-   } else {
-      ir->var->accept(this);
    }
 }
 
+void
+ir_copy_propagation_visitor::visit(ir_dereference_array *ir)
+{
+   ir->var->accept(this);
+   ir->selector.array_index->accept(this);
+}
+
+void
+ir_copy_propagation_visitor::visit(ir_dereference_record *ir)
+{
+   ir->var->accept(this);
+}
+
 void
 ir_copy_propagation_visitor::visit(ir_assignment *ir)
 {
index 9494786d4e4d4226a6e93e5b2c5e375752df364d..1e0244988a253cf690b21df3c2716aad3e49af6b 100644 (file)
@@ -70,7 +70,9 @@ public:
    virtual void visit(ir_function *);
    virtual void visit(ir_expression *);
    virtual void visit(ir_swizzle *);
-   virtual void visit(ir_dereference *);
+   virtual void visit(ir_dereference_variable *);
+   virtual void visit(ir_dereference_array *);
+   virtual void visit(ir_dereference_record *);
    virtual void visit(ir_assignment *);
    virtual void visit(ir_constant *);
    virtual void visit(ir_call *);
@@ -162,11 +164,21 @@ ir_expression_flattening_visitor::visit(ir_swizzle *ir)
 
 
 void
-ir_expression_flattening_visitor::visit(ir_dereference *ir)
+ir_expression_flattening_visitor::visit(ir_dereference_variable *ir)
+{
+   ir->var->accept(this);
+}
+
+void
+ir_expression_flattening_visitor::visit(ir_dereference_array *ir)
+{
+   ir->selector.array_index->accept(this);
+   ir->var->accept(this);
+}
+
+void
+ir_expression_flattening_visitor::visit(ir_dereference_record *ir)
 {
-   if (ir->mode == ir_dereference::ir_reference_array) {
-      ir->selector.array_index->accept(this);
-   }
    ir->var->accept(this);
 }
 
index 499ce5f1dc2f6ab4aa6fa5f4edfaea6a6f6ef771..38572a2057a099e760b2699d934a941c4482751b 100644 (file)
@@ -61,7 +61,9 @@ public:
    virtual void visit(ir_function *);
    virtual void visit(ir_expression *);
    virtual void visit(ir_swizzle *);
-   virtual void visit(ir_dereference *);
+   virtual void visit(ir_dereference_variable *);
+   virtual void visit(ir_dereference_array *);
+   virtual void visit(ir_dereference_record *);
    virtual void visit(ir_assignment *);
    virtual void visit(ir_constant *);
    virtual void visit(ir_call *);
@@ -134,7 +136,9 @@ public:
    virtual void visit(ir_function *);
    virtual void visit(ir_expression *);
    virtual void visit(ir_swizzle *);
-   virtual void visit(ir_dereference *);
+   virtual void visit(ir_dereference_variable *);
+   virtual void visit(ir_dereference_array *);
+   virtual void visit(ir_dereference_record *);
    virtual void visit(ir_assignment *);
    virtual void visit(ir_constant *);
    virtual void visit(ir_call *);
@@ -218,30 +222,34 @@ ir_function_cloning_visitor::visit(ir_swizzle *ir)
 }
 
 void
-ir_function_cloning_visitor::visit(ir_dereference *ir)
+ir_function_cloning_visitor::visit(ir_dereference_variable *ir)
 {
-   if (ir->mode == ir_dereference::ir_reference_variable) {
-      ir_variable *var = this->get_remapped_variable(ir->variable_referenced());
-      this->result = new ir_dereference_variable(var);
-   } else if (ir->mode == ir_dereference::ir_reference_array) {
-      ir->var->accept(this);
+   ir_variable *var = this->get_remapped_variable(ir->variable_referenced());
+   this->result = new ir_dereference_variable(var);
+}
 
-      ir_rvalue *var = this->result->as_rvalue();
+void
+ir_function_cloning_visitor::visit(ir_dereference_array *ir)
+{
+   ir->var->accept(this);
 
-      ir->selector.array_index->accept(this);
+   ir_rvalue *var = this->result->as_rvalue();
 
-      ir_rvalue *index = this->result->as_rvalue();
+   ir->selector.array_index->accept(this);
 
-      this->result = new ir_dereference_array(var, index);
-   } else {
-      assert(ir->mode == ir_dereference::ir_reference_record);
+   ir_rvalue *index = this->result->as_rvalue();
 
-      ir->var->accept(this);
+   this->result = new ir_dereference_array(var, index);
+}
 
-      ir_rvalue *var = this->result->as_rvalue();
+void
+ir_function_cloning_visitor::visit(ir_dereference_record *ir)
+{
+   ir->var->accept(this);
 
-      this->result = new ir_dereference_record(var, strdup(ir->selector.field));
-   }
+   ir_rvalue *var = this->result->as_rvalue();
+
+   this->result = new ir_dereference_record(var, strdup(ir->selector.field));
 }
 
 void
@@ -509,11 +517,21 @@ ir_function_inlining_visitor::visit(ir_swizzle *ir)
 
 
 void
-ir_function_inlining_visitor::visit(ir_dereference *ir)
+ir_function_inlining_visitor::visit(ir_dereference_variable *ir)
+{
+   ir->var->accept(this);
+}
+
+void
+ir_function_inlining_visitor::visit(ir_dereference_array *ir)
+{
+   ir->selector.array_index->accept(this);
+   ir->var->accept(this);
+}
+
+void
+ir_function_inlining_visitor::visit(ir_dereference_record *ir)
 {
-   if (ir->mode == ir_dereference::ir_reference_array) {
-      ir->selector.array_index->accept(this);
-   }
    ir->var->accept(this);
 }
 
index ee7aa311758b3560b987df893687a2b0d131120e..7cb5eeba0155bfc05d961007a793d46d7f818104 100644 (file)
@@ -74,22 +74,18 @@ print_type(const glsl_type *t)
 
 void ir_print_visitor::visit(ir_variable *ir)
 {
-   if (deref_depth) {
-      printf("%s", ir->name);
-   } else {
-      printf("(declare ");
+   printf("(declare ");
 
-      const char *const cent = (ir->centroid) ? "centroid " : "";
-      const char *const inv = (ir->invariant) ? "invariant " : "";
-      const char *const mode[] = { "", "uniform ", "in ", "out ", "inout " };
-      const char *const interp[] = { "", "flat", "noperspective" };
+   const char *const cent = (ir->centroid) ? "centroid " : "";
+   const char *const inv = (ir->invariant) ? "invariant " : "";
+   const char *const mode[] = { "", "uniform ", "in ", "out ", "inout " };
+   const char *const interp[] = { "", "flat", "noperspective" };
 
-      printf("(%s%s%s%s) ",
-            cent, inv, mode[ir->mode], interp[ir->interpolation]);
+   printf("(%s%s%s%s) ",
+         cent, inv, mode[ir->mode], interp[ir->interpolation]);
 
-      print_type(ir->type);
-      printf(" %s)", ir->name);
-   }
+   print_type(ir->type);
+   printf(" %s)", ir->name);
 }
 
 
@@ -166,31 +162,26 @@ void ir_print_visitor::visit(ir_swizzle *ir)
 }
 
 
-void ir_print_visitor::visit(ir_dereference *ir)
+void ir_print_visitor::visit(ir_dereference_variable *ir)
 {
-   deref_depth++;
-
-   switch (ir->mode) {
-   case ir_dereference::ir_reference_variable: {
-      printf("(var_ref ");
-      ir->var->accept(this);
-      printf(") ");
-      break;
-   }
-   case ir_dereference::ir_reference_array:
-      printf("(array_ref ");
-      ir->var->accept(this);
-      ir->selector.array_index->accept(this);
-      printf(") ");
-      break;
-   case ir_dereference::ir_reference_record:
-      printf("(record_ref ");
-      ir->var->accept(this);
-      printf("(%s)) ", ir->selector.field);
-      break;
-   }
+   printf("(var_ref %s) ", ir->variable_referenced()->name);
+}
+
 
-   deref_depth--;
+void ir_print_visitor::visit(ir_dereference_array *ir)
+{
+   printf("(array_ref ");
+   ir->var->accept(this);
+   ir->selector.array_index->accept(this);
+   printf(") ");
+}
+
+
+void ir_print_visitor::visit(ir_dereference_record *ir)
+{
+   printf("(record_ref ");
+   ir->var->accept(this);
+   printf("(%s)) ", ir->selector.field);
 }
 
 
index aeee538df291563035fdb983e5143ef5e0fc04f0..4af508794bd933131c494f5f46c0795dbcad3dd9 100644 (file)
@@ -61,7 +61,9 @@ public:
    virtual void visit(ir_function *);
    virtual void visit(ir_expression *);
    virtual void visit(ir_swizzle *);
-   virtual void visit(ir_dereference *);
+   virtual void visit(ir_dereference_variable *);
+   virtual void visit(ir_dereference_array *);
+   virtual void visit(ir_dereference_record *);
    virtual void visit(ir_assignment *);
    virtual void visit(ir_constant *);
    virtual void visit(ir_call *);
index 579eee701d75a52bb7da1249e7a9819ef041cc00..ba30858fe629f894a47481bd77a243c99f6265be 100644 (file)
@@ -49,7 +49,9 @@ public:
    virtual void visit(class ir_function *) = 0;
    virtual void visit(class ir_expression *) = 0;
    virtual void visit(class ir_swizzle *) = 0;
-   virtual void visit(class ir_dereference *) = 0;
+   virtual void visit(class ir_dereference_variable *) = 0;
+   virtual void visit(class ir_dereference_array *) = 0;
+   virtual void visit(class ir_dereference_record *) = 0;
    virtual void visit(class ir_assignment *) = 0;
    virtual void visit(class ir_constant *) = 0;
    virtual void visit(class ir_call *) = 0;