X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fopt%2Ftailrec.c;h=45f1b50cac2732e08c934d508832a458d0c5b7d1;hb=44faeb9742640d3498eb4482f98eb1255607c4d6;hp=5ca9549f0c6c3e4cb8e2784169586daee9900454;hpb=fcbd0b3a6f23769801789fa68c52bc6aaacdb82e;p=libfirm diff --git a/ir/opt/tailrec.c b/ir/opt/tailrec.c index 5ca9549f0..45f1b50ca 100644 --- a/ir/opt/tailrec.c +++ b/ir/opt/tailrec.c @@ -46,6 +46,7 @@ #include "trouts.h" #include "irouts.h" #include "irhooks.h" +#include "ircons_t.h" #include "xmalloc.h" DEBUG_ONLY(static firm_dbg_module_t *dbg); @@ -77,7 +78,7 @@ static void collect_data(ir_node *node, void *env) { if (op == op_Proj) { ir_node *start = get_Proj_pred(pred); - if (get_irn_op(start) == op_Start) { + if (is_Start(start)) { if (get_Proj_proj(pred) == pn_Start_T_args) { /* found Proj(ProjT(Start)) */ set_irn_link(node, data->proj_data); @@ -262,10 +263,7 @@ static void do_opt_tail_rec(ir_graph *irg, tr_env *env) { * ok, we are here, so we have build and collected all needed Phi's * now exchange all Projs into links to Phi */ - for (p = data.proj_m; p; p = n) { - n = get_irn_link(p); - exchange(p, phis[0]); - } + exchange(data.proj_m, phis[0]); for (p = data.proj_data; p; p = n) { long proj = get_Proj_proj(p); @@ -491,7 +489,7 @@ static tail_rec_variants find_variant(ir_node *irn, ir_node *call) { return TR_BAD; case iro_Sub: - /* try additive, but return value mut be left */ + /* try additive, but return value must be left */ a = get_Sub_left(irn); if (get_irn_MacroBlock(a) != get_irn_MacroBlock(call)) { /* we are outside, ignore */ @@ -631,10 +629,10 @@ int opt_tail_rec_irg(ir_graph *irg) { /* check if it's a recursive call */ call_ptr = get_Call_ptr(call); - if (! is_SymConst_addr_ent(call_ptr)) + if (! is_Global(call_ptr)) continue; - ent = get_SymConst_entity(call_ptr); + ent = get_Global_entity(call_ptr); if (!ent || get_entity_irg(ent) != irg) continue; @@ -721,8 +719,11 @@ void opt_tail_recursion(void) { current_ir_graph = irg; + ir_reserve_resources(irg, IR_RESOURCE_IRN_LINK); if (opt_tail_rec_irg(irg)) ++n_opt_applications; + + ir_free_resources(irg, IR_RESOURCE_IRN_LINK); } DB((dbg, LEVEL_1, "Performed tail recursion for %d of %d graphs\n",