forbid calls of new_XXX and new_d_XXX when not in phase_building (only new_r_XXX...
[libfirm] / ir / opt / tailrec.c
index 1855711..de723b2 100644 (file)
@@ -52,7 +52,7 @@ DEBUG_ONLY(static firm_dbg_module_t *dbg);
 /**
  * the environment for collecting data
  */
-typedef struct _collect_t {
+typedef struct collect_t {
        ir_node *proj_X;      /**< initial exec proj */
        ir_node *block;       /**< old first block */
        int     blk_idx;      /**< cfgpred index of the initial exec in block */
@@ -219,7 +219,7 @@ static void do_opt_tail_rec(ir_graph *irg, tr_env *env)
 
        /* build the memory phi */
        i = 0;
-       in[i] = new_r_Proj(get_irg_start_block(irg), get_irg_start(irg), mode_M, pn_Start_M);
+       in[i] = new_r_Proj(get_irg_start(irg), mode_M, pn_Start_M);
        set_irg_initial_mem(irg, in[i]);
        ++i;
 
@@ -251,7 +251,7 @@ 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(args_bl, args, mode, i);
+                       in[0] = new_r_Proj(args, mode, i);
                        for (j = 0; j < env->n_tail_calls; ++j)
                                in[j + 1] = call_params[j][i];
 
@@ -307,9 +307,9 @@ static void do_opt_tail_rec(ir_graph *irg, tr_env *env)
 
                        modes[i] = mode;
                        if (env->variants[i] == TR_ADD) {
-                               set_value(i, new_Const(get_mode_null(mode)));
+                               set_value(i, new_r_Const(irg, get_mode_null(mode)));
                        } else if (env->variants[i] == TR_MUL) {
-                               set_value(i, new_Const(get_mode_one(mode)));
+                               set_value(i, new_r_Const(irg, get_mode_one(mode)));
                        }
                }
                mature_immBlock(start_block);
@@ -331,7 +331,7 @@ static void do_opt_tail_rec(ir_graph *irg, tr_env *env)
 
                        /* create a new jump, free of CSE */
                        set_optimize(0);
-                       jmp = new_Jmp();
+                       jmp = new_r_Jmp(block);
                        set_optimize(rem);
 
                        for (i = 0; i < env->n_ress; ++i) {
@@ -342,7 +342,7 @@ static void do_opt_tail_rec(ir_graph *irg, tr_env *env)
                                }
                        }
                        /* create a new tuple for the return values */
-                       tuple = new_Tuple(env->n_ress, in);
+                       tuple = new_r_Tuple(block, env->n_ress, in);
 
                        turn_into_tuple(call, pn_Call_max);
                        set_Tuple_pred(call, pn_Call_M,                mem);
@@ -365,12 +365,14 @@ static void do_opt_tail_rec(ir_graph *irg, tr_env *env)
                end_block = get_irg_end_block(irg);
                for (i = get_Block_n_cfgpreds(end_block) - 1; i >= 0; --i) {
                        ir_node *ret = get_Block_cfgpred(end_block, i);
+                       ir_node *block;
 
                        /* search all Returns of a block */
                        if (! is_Return(ret))
                                continue;
 
-                       set_cur_block(get_nodes_block(ret));
+                       block = get_nodes_block(ret);
+                       set_cur_block(block);
                        for (j = 0; j < env->n_ress; ++j) {
                                ir_node *pred = get_Return_res(ret, j);
                                ir_node *n;
@@ -381,13 +383,13 @@ static void do_opt_tail_rec(ir_graph *irg, tr_env *env)
 
                                case TR_ADD:
                                        n = get_value(j, modes[j]);
-                                       n = new_Add(n, pred, modes[j]);
+                                       n = new_r_Add(block, n, pred, modes[j]);
                                        set_Return_res(ret, j, n);
                                        break;
 
                                case TR_MUL:
                                        n = get_value(j, modes[j]);
-                                       n = new_Mul(n, pred, modes[j]);
+                                       n = new_r_Mul(block, n, pred, modes[j]);
                                        set_Return_res(ret, j, n);
                                        break;
 
@@ -457,7 +459,7 @@ static tail_rec_variants find_variant(ir_node *irn, ir_node *call)
        case iro_Add:
                /* try additive */
                a = get_Add_left(irn);
-               if (get_irn_MacroBlock(a) != get_irn_MacroBlock(call)) {
+               if (get_nodes_block(a) != get_nodes_block(call)) {
                        /* we are outside, ignore */
                        va = TR_UNKNOWN;
                } else {
@@ -466,7 +468,7 @@ static tail_rec_variants find_variant(ir_node *irn, ir_node *call)
                                return TR_BAD;
                }
                b = get_Add_right(irn);
-               if (get_irn_MacroBlock(b) != get_irn_MacroBlock(call)) {
+               if (get_nodes_block(b) != get_nodes_block(call)) {
                        /* we are outside, ignore */
                        vb = TR_UNKNOWN;
                } else {
@@ -493,7 +495,7 @@ static tail_rec_variants find_variant(ir_node *irn, ir_node *call)
        case iro_Sub:
                /* try additive, but return value must be left */
                a = get_Sub_left(irn);
-               if (get_irn_MacroBlock(a) != get_irn_MacroBlock(call)) {
+               if (get_nodes_block(a) != get_nodes_block(call)) {
                        /* we are outside, ignore */
                        va = TR_UNKNOWN;
                } else {
@@ -502,7 +504,7 @@ static tail_rec_variants find_variant(ir_node *irn, ir_node *call)
                                return TR_BAD;
                }
                b = get_Sub_right(irn);
-               if (get_irn_MacroBlock(b) != get_irn_MacroBlock(call)) {
+               if (get_nodes_block(b) != get_nodes_block(call)) {
                        /* we are outside, ignore */
                        vb = TR_UNKNOWN;
                } else {
@@ -519,7 +521,7 @@ static tail_rec_variants find_variant(ir_node *irn, ir_node *call)
        case iro_Mul:
                /* try multiplicative */
                a = get_Mul_left(irn);
-               if (get_irn_MacroBlock(a) != get_irn_MacroBlock(call)) {
+               if (get_nodes_block(a) != get_nodes_block(call)) {
                        /* we are outside, ignore */
                        va = TR_UNKNOWN;
                } else {
@@ -528,7 +530,7 @@ static tail_rec_variants find_variant(ir_node *irn, ir_node *call)
                                return TR_BAD;
                }
                b = get_Mul_right(irn);
-               if (get_irn_MacroBlock(b) != get_irn_MacroBlock(call)) {
+               if (get_nodes_block(b) != get_nodes_block(call)) {
                        /* we are outside, ignore */
                        vb = TR_UNKNOWN;
                } else {
@@ -581,12 +583,13 @@ int opt_tail_rec_irg(ir_graph *irg)
        ir_type           *mtd_type, *call_type;
        ir_entity         *ent;
 
+       FIRM_DBG_REGISTER(dbg, "firm.opt.tailrec");
+
        assure_irg_outs(irg);
 
        if (! check_lifetime_of_locals(irg))
                return 0;
 
-
        ent      = get_irg_entity(irg);
        mtd_type = get_entity_type(ent);
     n_ress   = get_method_n_ress(mtd_type);