diff options
Diffstat (limited to 'ir_dead_code.cpp')
-rw-r--r-- | ir_dead_code.cpp | 40 |
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; } |