Fix ir_dead_code for function refactoring.
authorKenneth Graunke <kenneth@whitecape.org>
Wed, 21 Apr 2010 23:02:15 +0000 (16:02 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Wed, 21 Apr 2010 23:02:15 +0000 (16:02 -0700)
ir.h
ir_dead_code.cpp

diff --git a/ir.h b/ir.h
index fa9a1321e3235adaf20bc52ced0bbcc1765282cb..c93c043f5e53bf85e86e183bdea800f1eecb5a7b 100644 (file)
--- 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);
index aae45d993eadb2d7bc6c5767c69c73e27f7393a8..81fbeba32136473433a966db02a26b07d39aea3f 100644 (file)
@@ -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 *);
@@ -121,12 +120,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)
 {
@@ -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;
+        }
       }
    }