Refactor ir_dereference support for ir_hierarchical_visitor
Move the accept method for hierarchical visitors from ir_dereference
to the derived classes. This was mostly straight-forward, but I
suspect that ir_dead_code_local may be broken now.
diff --git a/ir_dead_code.cpp b/ir_dead_code.cpp
index aa8ebf8..2ede7ff 100644
--- a/ir_dead_code.cpp
+++ b/ir_dead_code.cpp
@@ -60,14 +60,11 @@
class ir_dead_code_visitor : public ir_hierarchical_visitor {
public:
virtual ir_visitor_status visit(ir_variable *);
+ virtual ir_visitor_status visit(ir_dereference_variable *);
virtual ir_visitor_status visit_enter(ir_function *);
- virtual ir_visitor_status visit_enter(ir_dereference *);
- virtual ir_visitor_status visit_leave(ir_dereference *);
virtual ir_visitor_status visit_leave(ir_assignment *);
- ir_dead_code_visitor(void);
-
variable_entry *get_variable_entry(ir_variable *var);
bool (*predicate)(ir_instruction *ir);
@@ -75,16 +72,8 @@
/* List of variable_entry */
exec_list variable_list;
-
- /* Depth of derefernce stack. */
- int in_dereference;
};
-ir_dead_code_visitor::ir_dead_code_visitor(void)
-{
- this->in_dereference = 0;
-}
-
variable_entry *
ir_dead_code_visitor::get_variable_entry(ir_variable *var)
@@ -106,12 +95,21 @@
ir_dead_code_visitor::visit(ir_variable *ir)
{
variable_entry *entry = this->get_variable_entry(ir);
- if (entry) {
- if (this->in_dereference)
- entry->referenced_count++;
- else
- entry->declaration = true;
- }
+ if (entry)
+ entry->declaration = true;
+
+ return visit_continue;
+}
+
+
+ir_visitor_status
+ir_dead_code_visitor::visit(ir_dereference_variable *ir)
+{
+ ir_variable *const var = ir->variable_referenced();
+ variable_entry *entry = this->get_variable_entry(var);
+
+ if (entry)
+ entry->referenced_count++;
return visit_continue;
}
@@ -126,24 +124,6 @@
ir_visitor_status
-ir_dead_code_visitor::visit_enter(ir_dereference *ir)
-{
- (void) ir;
- this->in_dereference++;
- return visit_continue;
-}
-
-
-ir_visitor_status
-ir_dead_code_visitor::visit_leave(ir_dereference *ir)
-{
- (void) ir;
- this->in_dereference--;
- return visit_continue;
-}
-
-
-ir_visitor_status
ir_dead_code_visitor::visit_leave(ir_assignment *ir)
{
variable_entry *entry;