adapted to new callback
[libfirm] / ir / be / beabi.c
index cd006b5..9ab4e69 100644 (file)
@@ -400,7 +400,6 @@ static ir_node *adjust_call(be_abi_irg_t *env, ir_node *irn, ir_node *curr_sp, i
        const arch_register_t *sp = arch_isa_sp(isa);
        ir_mode *mach_mode        = sp->reg_class->mode;
        struct obstack *obst      = &env->obst;
-       ir_node *no_mem           = get_irg_no_mem(irg);
        int no_alloc              = call->flags.bits.frame_is_setup_on_call;
 
        ir_node *res_proj = NULL;
@@ -478,6 +477,13 @@ static ir_node *adjust_call(be_abi_irg_t *env, ir_node *irn, ir_node *curr_sp, i
                        }
                }
 
+               if(!do_seq) {
+                       obstack_ptr_grow(obst, get_Call_mem(irn));
+                       curr_mem = new_NoMem();
+               } else {
+                       curr_mem = get_Call_mem(irn);
+               }
+
                assert(mode_is_reference(mach_mode) && "machine mode must be pointer");
                for(i = 0; i < n_pos; ++i) {
                        int p                  = pos[i];
@@ -515,15 +521,18 @@ static ir_node *adjust_call(be_abi_irg_t *env, ir_node *irn, ir_node *curr_sp, i
 
                        /* Insert a store for primitive arguments. */
                        if (is_atomic_type(param_type)) {
-                               mem = new_r_Store(irg, bl, curr_mem, addr, param);
-                               mem = new_r_Proj(irg, bl, mem, mode_M, pn_Store_M);
+                               ir_node *store;
+                               store = new_r_Store(irg, bl, curr_mem, addr, param);
+                               mem = new_r_Proj(irg, bl, store, mode_M, pn_Store_M);
                        }
 
                        /* Make a mem copy for compound arguments. */
                        else {
+                               ir_node *copy;
+
                                assert(mode_is_reference(get_irn_mode(param)));
-                               mem = new_r_CopyB(irg, bl, curr_mem, addr, param, param_type);
-                               mem = new_r_Proj(irg, bl, mem, mode_M, pn_CopyB_M_regular);
+                               copy = new_r_CopyB(irg, bl, curr_mem, addr, param, param_type);
+                               mem = new_r_Proj(irg, bl, copy, mode_M, pn_CopyB_M_regular);
                        }
 
                        curr_ofs += param_size;
@@ -537,8 +546,13 @@ static ir_node *adjust_call(be_abi_irg_t *env, ir_node *irn, ir_node *curr_sp, i
                in = (ir_node **) obstack_finish(obst);
 
                /* We need the sync only, if we didn't build the stores sequentially. */
-               if(!do_seq)
-                       curr_mem = new_r_Sync(irg, bl, n_pos, in);
+               if(!do_seq) {
+                       if(n_pos >= 1) {
+                               curr_mem = new_r_Sync(irg, bl, n_pos + 1, in);
+                       } else {
+                               curr_mem = get_Call_mem(irn);
+                       }
+               }
                obstack_free(obst, in);
        }
 
@@ -694,8 +708,10 @@ static ir_node *adjust_call(be_abi_irg_t *env, ir_node *irn, ir_node *curr_sp, i
                        }
                }
 
-               if(!mem_proj)
+               if(!mem_proj) {
                        mem_proj = new_r_Proj(irg, bl, low_call, mode_M, pn_Call_M);
+                       keep_alive(mem_proj);
+               }
 
                 /* Clean up the stack frame if we allocated it */
                if(!no_alloc) {
@@ -1487,7 +1503,6 @@ static void modify_irg(be_abi_irg_t *env)
        ir_graph *irg             = env->birg->irg;
        ir_node *bl               = get_irg_start_block(irg);
        ir_node *end              = get_irg_end_block(irg);
-       ir_node *no_mem           = get_irg_no_mem(irg);
        ir_node *mem              = get_irg_initial_mem(irg);
        ir_type *method_type      = get_entity_type(get_irg_entity(irg));
        pset *dont_save           = pset_new_ptr(8);