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

20
ir.h
View File

@@ -793,11 +793,6 @@ public:
return this; return this;
} }
virtual void accept(ir_visitor *v)
{
v->visit(this);
}
bool is_lvalue(); bool is_lvalue();
/** /**
@@ -844,6 +839,11 @@ public:
return (ir_variable *) this->var; return (ir_variable *) this->var;
} }
virtual void accept(ir_visitor *v)
{
v->visit(this);
}
virtual ir_visitor_status accept(ir_hierarchical_visitor *); virtual ir_visitor_status accept(ir_hierarchical_visitor *);
}; };
@@ -862,6 +862,11 @@ public:
return ((ir_rvalue *) this->var)->variable_referenced(); return ((ir_rvalue *) this->var)->variable_referenced();
} }
virtual void accept(ir_visitor *v)
{
v->visit(this);
}
virtual ir_visitor_status accept(ir_hierarchical_visitor *); virtual ir_visitor_status accept(ir_hierarchical_visitor *);
private: private:
@@ -883,6 +888,11 @@ public:
return ((ir_rvalue *) this->var)->variable_referenced(); return ((ir_rvalue *) this->var)->variable_referenced();
} }
virtual void accept(ir_visitor *v)
{
v->visit(this);
}
virtual ir_visitor_status accept(ir_hierarchical_visitor *); virtual ir_visitor_status accept(ir_hierarchical_visitor *);
}; };

View File

@@ -67,7 +67,9 @@ public:
virtual void visit(ir_function *); virtual void visit(ir_function *);
virtual void visit(ir_expression *); virtual void visit(ir_expression *);
virtual void visit(ir_swizzle *); 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_assignment *);
virtual void visit(ir_constant *); virtual void visit(ir_constant *);
virtual void visit(ir_call *); virtual void visit(ir_call *);
@@ -412,16 +414,28 @@ ir_constant_visitor::visit(ir_swizzle *ir)
void void
ir_constant_visitor::visit(ir_dereference *ir) ir_constant_visitor::visit(ir_dereference_variable *ir)
{ {
value = NULL; value = NULL;
if (ir->mode == ir_dereference::ir_reference_variable) { ir_variable *var = ir->variable_referenced();
ir_variable *var = ir->var->as_variable(); if (var && var->constant_value)
if (var && var->constant_value) {
value = new ir_constant(ir->type, &var->constant_value->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. */ /* FINISHME: Other dereference modes. */
} }

View File

@@ -61,7 +61,9 @@ public:
virtual void visit(ir_function *); virtual void visit(ir_function *);
virtual void visit(ir_expression *); virtual void visit(ir_expression *);
virtual void visit(ir_swizzle *); 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_assignment *);
virtual void visit(ir_constant *); virtual void visit(ir_constant *);
virtual void visit(ir_call *); virtual void visit(ir_call *);
@@ -117,15 +119,30 @@ ir_constant_folding_visitor::visit(ir_swizzle *ir)
void void
ir_constant_folding_visitor::visit(ir_dereference *ir) ir_constant_folding_visitor::visit(ir_dereference_variable *ir)
{ {
if (ir->mode == ir_dereference::ir_reference_array) { (void) ir;
ir_constant *const_val = ir->selector.array_index->constant_expression_value(); }
void
ir_constant_folding_visitor::visit(ir_dereference_array *ir)
{
ir_constant *const_val =
ir->selector.array_index->constant_expression_value();
if (const_val) if (const_val)
ir->selector.array_index = const_val; ir->selector.array_index = const_val;
else else
ir->selector.array_index->accept(this); ir->selector.array_index->accept(this);
}
ir->var->accept(this);
}
void
ir_constant_folding_visitor::visit(ir_dereference_record *ir)
{
ir->var->accept(this); ir->var->accept(this);
} }

View File

@@ -78,7 +78,9 @@ public:
virtual void visit(ir_function *); virtual void visit(ir_function *);
virtual void visit(ir_expression *); virtual void visit(ir_expression *);
virtual void visit(ir_swizzle *); 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_assignment *);
virtual void visit(ir_constant *); virtual void visit(ir_constant *);
virtual void visit(ir_call *); virtual void visit(ir_call *);
@@ -149,16 +151,10 @@ ir_copy_propagation_visitor::visit(ir_swizzle *ir)
* must not be shared by multiple IR operations! * must not be shared by multiple IR operations!
*/ */
void 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) { foreach_iter(exec_list_iterator, iter, *this->acp) {
acp_entry *entry = (acp_entry *)iter.get(); acp_entry *entry = (acp_entry *)iter.get();
@@ -168,9 +164,19 @@ ir_copy_propagation_visitor::visit(ir_dereference *ir)
break; break;
} }
} }
} else { }
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); ir->var->accept(this);
}
} }
void void

View File

@@ -70,7 +70,9 @@ public:
virtual void visit(ir_function *); virtual void visit(ir_function *);
virtual void visit(ir_expression *); virtual void visit(ir_expression *);
virtual void visit(ir_swizzle *); 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_assignment *);
virtual void visit(ir_constant *); virtual void visit(ir_constant *);
virtual void visit(ir_call *); virtual void visit(ir_call *);
@@ -162,11 +164,21 @@ ir_expression_flattening_visitor::visit(ir_swizzle *ir)
void 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)
{ {
if (ir->mode == ir_dereference::ir_reference_array) {
ir->selector.array_index->accept(this); ir->selector.array_index->accept(this);
} ir->var->accept(this);
}
void
ir_expression_flattening_visitor::visit(ir_dereference_record *ir)
{
ir->var->accept(this); ir->var->accept(this);
} }

View File

@@ -61,7 +61,9 @@ public:
virtual void visit(ir_function *); virtual void visit(ir_function *);
virtual void visit(ir_expression *); virtual void visit(ir_expression *);
virtual void visit(ir_swizzle *); 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_assignment *);
virtual void visit(ir_constant *); virtual void visit(ir_constant *);
virtual void visit(ir_call *); virtual void visit(ir_call *);
@@ -134,7 +136,9 @@ public:
virtual void visit(ir_function *); virtual void visit(ir_function *);
virtual void visit(ir_expression *); virtual void visit(ir_expression *);
virtual void visit(ir_swizzle *); 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_assignment *);
virtual void visit(ir_constant *); virtual void visit(ir_constant *);
virtual void visit(ir_call *); virtual void visit(ir_call *);
@@ -218,12 +222,15 @@ ir_function_cloning_visitor::visit(ir_swizzle *ir)
} }
void 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()); ir_variable *var = this->get_remapped_variable(ir->variable_referenced());
this->result = new ir_dereference_variable(var); this->result = new ir_dereference_variable(var);
} else if (ir->mode == ir_dereference::ir_reference_array) { }
void
ir_function_cloning_visitor::visit(ir_dereference_array *ir)
{
ir->var->accept(this); ir->var->accept(this);
ir_rvalue *var = this->result->as_rvalue(); ir_rvalue *var = this->result->as_rvalue();
@@ -233,15 +240,16 @@ ir_function_cloning_visitor::visit(ir_dereference *ir)
ir_rvalue *index = this->result->as_rvalue(); ir_rvalue *index = this->result->as_rvalue();
this->result = new ir_dereference_array(var, index); this->result = new ir_dereference_array(var, index);
} else { }
assert(ir->mode == ir_dereference::ir_reference_record);
void
ir_function_cloning_visitor::visit(ir_dereference_record *ir)
{
ir->var->accept(this); ir->var->accept(this);
ir_rvalue *var = this->result->as_rvalue(); ir_rvalue *var = this->result->as_rvalue();
this->result = new ir_dereference_record(var, strdup(ir->selector.field)); this->result = new ir_dereference_record(var, strdup(ir->selector.field));
}
} }
void void
@@ -509,11 +517,21 @@ ir_function_inlining_visitor::visit(ir_swizzle *ir)
void 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)
{ {
if (ir->mode == ir_dereference::ir_reference_array) {
ir->selector.array_index->accept(this); ir->selector.array_index->accept(this);
} ir->var->accept(this);
}
void
ir_function_inlining_visitor::visit(ir_dereference_record *ir)
{
ir->var->accept(this); ir->var->accept(this);
} }

View File

@@ -74,9 +74,6 @@ print_type(const glsl_type *t)
void ir_print_visitor::visit(ir_variable *ir) 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 cent = (ir->centroid) ? "centroid " : "";
@@ -89,7 +86,6 @@ void ir_print_visitor::visit(ir_variable *ir)
print_type(ir->type); print_type(ir->type);
printf(" %s)", ir->name); 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++; printf("(var_ref %s) ", ir->variable_referenced()->name);
}
switch (ir->mode) {
case ir_dereference::ir_reference_variable: { void ir_print_visitor::visit(ir_dereference_array *ir)
printf("(var_ref "); {
ir->var->accept(this);
printf(") ");
break;
}
case ir_dereference::ir_reference_array:
printf("(array_ref "); printf("(array_ref ");
ir->var->accept(this); ir->var->accept(this);
ir->selector.array_index->accept(this); ir->selector.array_index->accept(this);
printf(") "); printf(") ");
break; }
case ir_dereference::ir_reference_record:
void ir_print_visitor::visit(ir_dereference_record *ir)
{
printf("(record_ref "); printf("(record_ref ");
ir->var->accept(this); ir->var->accept(this);
printf("(%s)) ", ir->selector.field); printf("(%s)) ", ir->selector.field);
break;
}
deref_depth--;
} }

View File

@@ -61,7 +61,9 @@ public:
virtual void visit(ir_function *); virtual void visit(ir_function *);
virtual void visit(ir_expression *); virtual void visit(ir_expression *);
virtual void visit(ir_swizzle *); 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_assignment *);
virtual void visit(ir_constant *); virtual void visit(ir_constant *);
virtual void visit(ir_call *); virtual void visit(ir_call *);

View File

@@ -49,7 +49,9 @@ public:
virtual void visit(class ir_function *) = 0; virtual void visit(class ir_function *) = 0;
virtual void visit(class ir_expression *) = 0; virtual void visit(class ir_expression *) = 0;
virtual void visit(class ir_swizzle *) = 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_assignment *) = 0;
virtual void visit(class ir_constant *) = 0; virtual void visit(class ir_constant *) = 0;
virtual void visit(class ir_call *) = 0; virtual void visit(class ir_call *) = 0;