X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fopt%2Ftailrec.c;h=15932a5a9551770c0100894dc488b3b04948af55;hb=6b124543aff56817fcfe6d5b5ff181ac5c790e73;hp=28ab28faabb9ae8af4951320cc18a66db32b524d;hpb=533faf35a5f51a6ac3548e7f64aadd7b59b371d3;p=libfirm diff --git a/ir/opt/tailrec.c b/ir/opt/tailrec.c index 28ab28faa..15932a5a9 100644 --- a/ir/opt/tailrec.c +++ b/ir/opt/tailrec.c @@ -45,6 +45,7 @@ #include "irouts.h" #include "irhooks.h" #include "ircons_t.h" +#include "irpass.h" DEBUG_ONLY(static firm_dbg_module_t *dbg); @@ -195,7 +196,7 @@ static void do_opt_tail_rec(ir_graph *irg, tr_env *env) { ir_node *block = get_nodes_block(p); n = get_irn_link(p); - in[i++] = new_r_Jmp(irg, block); + in[i++] = new_r_Jmp(block); // exchange(p, new_r_Bad(irg)); @@ -206,7 +207,7 @@ static void do_opt_tail_rec(ir_graph *irg, tr_env *env) { /* create a new block at start */ block = new_r_Block(irg, env->n_tail_calls + 1, in); - jmp = new_r_Jmp(irg, block); + jmp = new_r_Jmp(block); /* the old first block is now the second one */ set_Block_cfgpred(data.block, data.blk_idx, jmp); @@ -216,7 +217,7 @@ static void do_opt_tail_rec(ir_graph *irg, tr_env *env) { /* build the memory phi */ i = 0; - in[i] = new_r_Proj(irg, get_irg_start_block(irg), get_irg_start(irg), mode_M, pn_Start_M); + in[i] = new_r_Proj(get_irg_start_block(irg), get_irg_start(irg), mode_M, pn_Start_M); set_irg_initial_mem(irg, in[i]); ++i; @@ -226,7 +227,7 @@ static void do_opt_tail_rec(ir_graph *irg, tr_env *env) { } assert(i == env->n_tail_calls + 1); - phis[0] = new_r_Phi(irg, block, env->n_tail_calls + 1, in, mode_M); + phis[0] = new_r_Phi(block, env->n_tail_calls + 1, in, mode_M); /* build the data Phi's */ if (n_params > 0) { @@ -248,11 +249,11 @@ static void do_opt_tail_rec(ir_graph *irg, tr_env *env) { for (i = 0; i < n_params; ++i) { ir_mode *mode = get_type_mode(get_method_param_type(method_tp, i)); - in[0] = new_r_Proj(irg, args_bl, args, mode, i); + in[0] = new_r_Proj(args_bl, args, mode, i); for (j = 0; j < env->n_tail_calls; ++j) in[j + 1] = call_params[j][i]; - phis[i + 1] = new_r_Phi(irg, block, env->n_tail_calls + 1, in, mode); + phis[i + 1] = new_r_Phi(block, env->n_tail_calls + 1, in, mode); } } @@ -346,7 +347,6 @@ static void do_opt_tail_rec(ir_graph *irg, tr_env *env) { set_Tuple_pred(call, pn_Call_X_regular, jmp); set_Tuple_pred(call, pn_Call_X_except, bad); set_Tuple_pred(call, pn_Call_T_result, tuple); - set_Tuple_pred(call, pn_Call_M_except, mem); set_Tuple_pred(call, pn_Call_P_value_res_base, bad); for (i = 0; i < env->n_ress; ++i) { @@ -702,6 +702,11 @@ int opt_tail_rec_irg(ir_graph *irg) { return n_tail_calls; } +ir_graph_pass_t *opt_tail_rec_irg_pass(const char *name) +{ + return def_graph_pass_ret(name ? name : "tailrec", opt_tail_rec_irg); +} + /* * optimize tail recursion away */ @@ -727,3 +732,8 @@ void opt_tail_recursion(void) { DB((dbg, LEVEL_1, "Performed tail recursion for %d of %d graphs\n", n_opt_applications, get_irp_n_irgs())); } + +ir_prog_pass_t *opt_tail_recursion_pass(const char *name) +{ + return def_prog_pass(name ? name : "tailrec", opt_tail_recursion); +}