summaryrefslogtreecommitdiff
path: root/ir_dead_code.cpp
diff options
context:
space:
mode:
authorIan Romanick <ian.d.romanick@intel.com>2010-05-19 12:02:19 +0200
committerIan Romanick <ian.d.romanick@intel.com>2010-05-26 15:23:25 -0700
commitf3a002b503542fe2544025c6a42d552fdc4907c2 (patch)
tree647f6bba599e317ced48e8f484f4933b6708e1fb /ir_dead_code.cpp
parent70fe8b66632f4afd87ebb12a450b1e639428e88f (diff)
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.
Diffstat (limited to 'ir_dead_code.cpp')
-rw-r--r--ir_dead_code.cpp40
1 files changed, 10 insertions, 30 deletions
diff --git a/ir_dead_code.cpp b/ir_dead_code.cpp
index aa8ebf8ad1..2ede7ff0cf 100644
--- a/ir_dead_code.cpp
+++ b/ir_dead_code.cpp
@@ -60,14 +60,11 @@ public:
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 @@ public:
/* 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,40 +95,31 @@ ir_visitor_status
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_enter(ir_function *ir)
+ir_dead_code_visitor::visit(ir_dereference_variable *ir)
{
- (void) ir;
- return visit_continue_with_parent;
-}
+ ir_variable *const var = ir->variable_referenced();
+ variable_entry *entry = this->get_variable_entry(var);
+ if (entry)
+ entry->referenced_count++;
-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)
+ir_dead_code_visitor::visit_enter(ir_function *ir)
{
(void) ir;
- this->in_dereference--;
- return visit_continue;
+ return visit_continue_with_parent;
}