Refactor ir_dereference support for ir_visitor

Move the accept method for visitors from ir_dereference to the derived
classes.
This commit is contained in:
Ian Romanick
2010-05-19 13:20:12 +02:00
parent f3a002b503
commit c7b1046a9f
9 changed files with 176 additions and 104 deletions
+40 -22
View 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);
}