BugFix: mode_b lowering might create new control flow (if ir_create_cond_set() is...
[libfirm] / ir / be / arm / arm_transform.c
index ca0e967..91bb8f1 100644 (file)
@@ -94,7 +94,6 @@ static ir_node *create_const_graph_value(dbg_info *dbgi, ir_node *block,
        if (vn.ops < v.ops) {
                /* remove bits */
                result = new_bd_arm_Mvn_imm(dbgi, block, vn.values[0], vn.rors[0]);
-               be_dep_on_frame(result);
 
                for (cnt = 1; cnt < vn.ops; ++cnt) {
                        result = new_bd_arm_Bic_imm(dbgi, block, result,
@@ -103,7 +102,6 @@ static ir_node *create_const_graph_value(dbg_info *dbgi, ir_node *block,
        } else {
                /* add bits */
                result = new_bd_arm_Mov_imm(dbgi, block, v.values[0], v.rors[0]);
-               be_dep_on_frame(result);
 
                for (cnt = 1; cnt < v.ops; ++cnt) {
                        result = new_bd_arm_Or_imm(dbgi, block, result,
@@ -915,6 +913,9 @@ static ir_node *gen_Load(ir_node *node)
        dbg_info *dbgi      = get_irn_dbg_info(node);
        ir_node  *new_load = NULL;
 
+       if (get_Load_unaligned(node) == align_non_aligned)
+               panic("arm: unaligned Loads not supported yet");
+
        if (mode_is_float(mode)) {
                if (USE_FPA(isa)) {
                        new_load = new_bd_arm_Ldf(dbgi, block, new_ptr, new_mem, mode,
@@ -955,6 +956,9 @@ static ir_node *gen_Store(ir_node *node)
        dbg_info *dbgi     = get_irn_dbg_info(node);
        ir_node *new_store = NULL;
 
+       if (get_Store_unaligned(node) == align_non_aligned)
+               panic("arm: unaligned Stores not supported yet");
+
        if (mode_is_float(mode)) {
                if (USE_FPA(isa)) {
                        new_store = new_bd_arm_Stf(dbgi, block, new_ptr, new_val,
@@ -1131,7 +1135,6 @@ static ir_node *gen_Const(ir_node *node)
                if (USE_FPA(isa)) {
                        ir_tarval *tv = get_Const_tarval(node);
                        node          = new_bd_arm_fConst(dbg, block, tv);
-                       be_dep_on_frame(node);
                        return node;
                } else if (USE_VFP(isa)) {
                        assert(mode != mode_E && "IEEE Extended FP not supported");
@@ -1151,7 +1154,6 @@ static ir_node *gen_SymConst(ir_node *node)
        ir_node   *new_node;
 
        new_node = new_bd_arm_SymConst(dbgi, block, entity, 0);
-       be_dep_on_frame(new_node);
        return new_node;
 }
 
@@ -1163,7 +1165,7 @@ static ir_node *ints_to_double(dbg_info *dbgi, ir_node *block, ir_node *node0,
         * registers... */
        ir_graph *irg   = current_ir_graph;
        ir_node  *stack = get_irg_frame(irg);
-       ir_node  *nomem = new_r_NoMem(irg);
+       ir_node  *nomem = get_irg_no_mem(irg);
        ir_node  *str0  = new_bd_arm_Str(dbgi, block, stack, node0, nomem, mode_gp,
                                         NULL, 0, 0, true);
        ir_node  *str1  = new_bd_arm_Str(dbgi, block, stack, node1, nomem, mode_gp,
@@ -1184,7 +1186,7 @@ static ir_node *int_to_float(dbg_info *dbgi, ir_node *block, ir_node *node)
 {
        ir_graph *irg   = current_ir_graph;
        ir_node  *stack = get_irg_frame(irg);
-       ir_node  *nomem = new_r_NoMem(irg);
+       ir_node  *nomem = get_irg_no_mem(irg);
        ir_node  *str   = new_bd_arm_Str(dbgi, block, stack, node, nomem, mode_gp,
                                         NULL, 0, 0, true);
        ir_node  *ldf;
@@ -1200,7 +1202,7 @@ static ir_node *float_to_int(dbg_info *dbgi, ir_node *block, ir_node *node)
 {
        ir_graph *irg   = current_ir_graph;
        ir_node  *stack = get_irg_frame(irg);
-       ir_node  *nomem = new_r_NoMem(irg);
+       ir_node  *nomem = get_irg_no_mem(irg);
        ir_node  *stf   = new_bd_arm_Stf(dbgi, block, stack, node, nomem, mode_F,
                                         NULL, 0, 0, true);
        ir_node  *ldr;
@@ -1217,7 +1219,7 @@ static void double_to_ints(dbg_info *dbgi, ir_node *block, ir_node *node,
 {
        ir_graph *irg   = current_ir_graph;
        ir_node  *stack = get_irg_frame(irg);
-       ir_node  *nomem = new_r_NoMem(irg);
+       ir_node  *nomem = get_irg_no_mem(irg);
        ir_node  *stf   = new_bd_arm_Stf(dbgi, block, stack, node, nomem, mode_D,
                                         NULL, 0, 0, true);
        ir_node  *ldr0, *ldr1;
@@ -1415,7 +1417,6 @@ static ir_node *gen_Proj_Start(ir_node *node)
 {
        ir_node *block     = get_nodes_block(node);
        ir_node *new_block = be_transform_node(block);
-       ir_node *barrier   = be_transform_node(get_Proj_pred(node));
        long     proj      = get_Proj_proj(node);
 
        switch ((pn_Start) proj) {
@@ -1424,17 +1425,15 @@ static ir_node *gen_Proj_Start(ir_node *node)
                return new_bd_arm_Jmp(NULL, new_block);
 
        case pn_Start_M:
-               return new_r_Proj(barrier, mode_M, 0);
+               return be_prolog_get_memory(abihelper);
 
        case pn_Start_T_args:
-               return barrier;
+               /* we should never need this explicitely */
+               return new_r_Bad(get_irn_irg(node));
 
        case pn_Start_P_frame_base:
                return be_prolog_get_reg_value(abihelper, sp_reg);
 
-       case pn_Start_P_tls:
-               return new_r_Bad(get_irn_irg(node));
-
        case pn_Start_max:
                break;
        }
@@ -1562,7 +1561,6 @@ static ir_node *gen_Proj_Call(ir_node *node)
        case pn_Call_X_regular:
        case pn_Call_X_except:
        case pn_Call_T_result:
-       case pn_Call_P_value_res_base:
        case pn_Call_max:
                break;
        }
@@ -1644,7 +1642,6 @@ static ir_node *gen_Unknown(ir_node *node)
        if (mode_is_float(mode)) {
                ir_tarval *tv   = get_mode_null(mode);
                ir_node   *node = new_bd_arm_fConst(dbgi, new_block, tv);
-               be_dep_on_frame(node);
                return node;
        } else if (mode_needs_gp_reg(mode)) {
                return create_const_graph_value(dbgi, new_block, 0);
@@ -1710,7 +1707,6 @@ static void create_stacklayout(ir_graph *irg)
        layout->param_map      = NULL; /* TODO */
        layout->initial_offset = 0;
        layout->initial_bias   = 0;
-       layout->stack_dir      = -1;
        layout->sp_relative    = true;
 
        assert(N_FRAME_TYPES == 3);
@@ -1720,7 +1716,7 @@ static void create_stacklayout(ir_graph *irg)
 }
 
 /**
- * transform the start node to the prolog code + initial barrier
+ * transform the start node to the prolog code
  */
 static ir_node *gen_Start(ir_node *node)
 {
@@ -1731,9 +1727,6 @@ static ir_node *gen_Start(ir_node *node)
        ir_node   *new_block     = be_transform_node(block);
        dbg_info  *dbgi          = get_irn_dbg_info(node);
        ir_node   *start;
-       ir_node   *incsp;
-       ir_node   *sp;
-       ir_node   *barrier;
        size_t     i;
 
        /* stackpointer is important at function prolog */
@@ -1753,12 +1746,7 @@ static ir_node *gen_Start(ir_node *node)
        }
 
        start = be_prolog_create_start(abihelper, dbgi, new_block);
-       sp    = be_prolog_get_reg_value(abihelper, sp_reg);
-       incsp = be_new_IncSP(sp_reg, new_block, sp, BE_STACK_FRAME_SIZE_EXPAND, 0);
-       be_prolog_set_reg_value(abihelper, sp_reg, incsp);
-       barrier = be_prolog_create_barrier(abihelper, new_block);
-
-       return barrier;
+       return start;
 }
 
 static ir_node *get_stack_pointer_for(ir_node *node)
@@ -1798,7 +1786,6 @@ static ir_node *gen_Return(ir_node *node)
        ir_node   *sp_proj        = get_stack_pointer_for(node);
        int        n_res          = get_Return_n_ress(node);
        ir_node   *bereturn;
-       ir_node   *incsp;
        int        i;
 
        be_epilog_begin(abihelper);
@@ -1826,17 +1813,8 @@ static ir_node *gen_Return(ir_node *node)
                be_epilog_add_reg(abihelper, reg, arch_register_req_type_none, value);
        }
 
-       /* create the barrier before the epilog code */
-       be_epilog_create_barrier(abihelper, new_block);
-
        /* epilog code: an incsp */
-       sp_proj = be_epilog_get_reg_value(abihelper, sp_reg);
-       incsp   = be_new_IncSP(sp_reg, new_block, sp_proj,
-                              BE_STACK_FRAME_SIZE_SHRINK, 0);
-       be_epilog_set_reg_value(abihelper, sp_reg, incsp);
-
        bereturn = be_epilog_create_return(abihelper, dbgi, new_block);
-
        return bereturn;
 }