bestack: remove unnecessary keep edges from IncSP nodes
authorMatthias Braun <matze@braunis.de>
Mon, 7 Mar 2011 13:47:07 +0000 (14:47 +0100)
committerMatthias Braun <matze@braunis.de>
Wed, 16 Mar 2011 18:33:23 +0000 (19:33 +0100)
ir/be/bestack.c

index 18522b1..a5cb662 100644 (file)
@@ -379,6 +379,28 @@ void be_abi_fix_stack_nodes(ir_graph *irg)
                arch_set_irn_register(phi, arch_env->sp);
        }
        be_ssa_construction_destroy(&senv);
-
        DEL_ARR_F(walker_env.sp_nodes);
+
+       /* when doing code with frame-pointers then often the last incsp-nodes are
+        * not used anymore because we copy the framepointer to the stack pointer
+        * when leaving the function. Though the last incsp is often keeped (because
+        * you often don't know which incsp is the last one and fixstack should find
+        * them all). Remove unnecessary keeps and IncSP nodes */
+       {
+               ir_node  *end    = get_irg_end(irg);
+               int       arity  = get_irn_arity(end);
+               int       i;
+               for (i = arity-1; i >= 0; --i) {
+                       ir_node *in = get_irn_n(end, i);
+                       if (!be_is_IncSP(in)) {
+                               continue;
+                       }
+
+                       remove_End_keepalive(end, in);
+                       if (get_irn_n_edges(in) == 0) {
+                               sched_remove(in);
+                               kill_node(in);
+                       }
+               }
+       }
 }