BugFix: mode_b lowering might create new control flow (if ir_create_cond_set() is...
[libfirm] / ir / be / arm / arm_transform.c
index 5c93e7e..91bb8f1 100644 (file)
@@ -913,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,
@@ -953,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,
@@ -1159,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,
@@ -1180,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;
@@ -1196,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;
@@ -1213,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;
@@ -1411,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) {
@@ -1420,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;
        }
@@ -1558,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;
        }
@@ -1705,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);
@@ -1715,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)
 {
@@ -1726,8 +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;
        size_t     i;
 
        /* stackpointer is important at function prolog */
@@ -1747,10 +1746,6 @@ 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);
-
        return start;
 }
 
@@ -1791,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);
@@ -1820,13 +1814,7 @@ static ir_node *gen_Return(ir_node *node)
        }
 
        /* 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;
 }