summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKenneth Graunke <kenneth@whitecape.org>2010-04-21 16:02:15 -0700
committerKenneth Graunke <kenneth@whitecape.org>2010-04-21 16:02:15 -0700
commit6202cbfe3614141e330501959a7322522b35f4e4 (patch)
treeeff2460f47157f403e1504811a2c5e167e846368
parent7bcd5bedcc16ad1be989cef7a05e6aa7711213e9 (diff)
Fix ir_dead_code for function refactoring.
-rw-r--r--ir.h6
-rw-r--r--ir_dead_code.cpp19
2 files changed, 14 insertions, 11 deletions
diff --git a/ir.h b/ir.h
index fa9a132..c93c043 100644
--- a/ir.h
+++ b/ir.h
@@ -52,6 +52,7 @@ public:
*/
/*@{*/
virtual class ir_variable * as_variable() { return NULL; }
+ virtual class ir_function * as_function() { return NULL; }
virtual class ir_dereference * as_dereference() { return NULL; }
virtual class ir_rvalue * as_rvalue() { return NULL; }
virtual class ir_label * as_label() { return NULL; }
@@ -243,6 +244,11 @@ class ir_function : public ir_instruction {
public:
ir_function(const char *name);
+ virtual ir_function *as_function()
+ {
+ return this;
+ }
+
virtual void accept(ir_visitor *v)
{
v->visit(this);
diff --git a/ir_dead_code.cpp b/ir_dead_code.cpp
index aae45d9..81fbeba 100644
--- a/ir_dead_code.cpp
+++ b/ir_dead_code.cpp
@@ -62,7 +62,6 @@ public:
*/
/*@{*/
virtual void visit(ir_variable *);
- virtual void visit(ir_label *);
virtual void visit(ir_loop *);
virtual void visit(ir_loop_jump *);
virtual void visit(ir_function_signature *);
@@ -122,12 +121,6 @@ ir_dead_code_visitor::visit(ir_variable *ir)
void
-ir_dead_code_visitor::visit(ir_label *ir)
-{
- ir->signature->accept(this);
-}
-
-void
ir_dead_code_visitor::visit(ir_loop *ir)
{
find_dead_code(&ir->body_instructions, this);
@@ -325,10 +318,14 @@ do_dead_code_unlinked(exec_list *instructions)
foreach_iter(exec_list_iterator, iter, *instructions) {
ir_instruction *ir = (ir_instruction *)iter.get();
- ir_label *label = ir->as_label();
- if (label) {
- if (do_dead_code(&label->signature->body))
- progress = true;
+ ir_function *f = ir->as_function();
+ if (f) {
+ foreach_iter(exec_list_iterator, sigiter, *f) {
+ ir_function_signature *sig =
+ (ir_function_signature *) sigiter.get();
+ if (do_dead_code(&sig->body))
+ progress = true;
+ }
}
}