From: Matthias Braun Date: Mon, 7 Mar 2011 13:47:07 +0000 (+0100) Subject: bestack: remove unnecessary keep edges from IncSP nodes X-Git-Url: http://nsz.repo.hu/git/?a=commitdiff_plain;h=51a7dbfd76da23a3f8b927d1113b95545ef43b8b;p=libfirm bestack: remove unnecessary keep edges from IncSP nodes --- diff --git a/ir/be/bestack.c b/ir/be/bestack.c index 18522b1b1..a5cb66231 100644 --- a/ir/be/bestack.c +++ b/ir/be/bestack.c @@ -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); + } + } + } }