some bugifxes for alloca handling
[libfirm] / ir / be / bespillslots.c
index e4d6e7f..8932c16 100644 (file)
@@ -585,12 +585,14 @@ static void assign_spillslots(ss_env_t *env) {
                        be_set_frame_entity(node, slot->entity);
                } else {
                        int i, arity;
+                       ir_node *block = get_nodes_block(node);
 
                        // should be a PhiM
                        assert(is_Phi(node));
 
                        for(i = 0, arity = get_irn_arity(node); i < arity; ++i) {
                                ir_node *arg = get_irn_n(node, i);
+                               ir_node *predblock = get_Block_cfgpred_block(block, i);
                                spill_t *argspill;
                                int argslotid;
 
@@ -606,7 +608,7 @@ static void assign_spillslots(ss_env_t *env) {
                                                create_stack_entity(env, argslot);
                                        }
 
-                                       memperm = get_memperm(env, get_nodes_block(arg));
+                                       memperm = get_memperm(env, predblock);
 
                                        entry = obstack_alloc(&env->obst, sizeof(entry[0]));
                                        entry->node = node;
@@ -678,7 +680,7 @@ static void create_memperms(ss_env_t *env) {
 
                // insert node into schedule
                blockend = get_end_of_block_insertion_point(memperm->block);
-               sched_add_after(blockend, mempermnode);
+               sched_add_before(blockend, mempermnode);
 
                for(entry = memperm->entries, i = 0; entry != NULL; entry = entry->next, ++i) {
                        ir_node *proj;
@@ -688,7 +690,7 @@ static void create_memperms(ss_env_t *env) {
                        be_set_MemPerm_out_entity(mempermnode, i, entry->out);
                        set_irg_current_block(env->chordal_env->irg, memperm->block);
                        proj = new_Proj(mempermnode, get_irn_mode(arg), i);
-                       sched_add_after(blockend, proj);
+                       sched_add_before(blockend, proj);
 
                        set_irn_n(entry->node, entry->pos, proj);
                }