#include "irdump_t.h"
#include "benode_t.h"
+#include "besched.h"
#include "bespillslots.h"
#include "bechordal_t.h"
#include "bejavacoal.h"
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;
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;
}
}
+/**
+ * Returns the last node in a block which is no control flow changing node
+ */
+static ir_node *get_end_of_block_insertion_point(ir_node* block)
+{
+ ir_node* ins = sched_last(block);
+ while(is_Proj(ins) && get_irn_mode(ins) == mode_X) {
+ ins = sched_prev(ins);
+ assert(ins != NULL);
+ }
+
+ if(is_cfop(ins)) {
+ while(1) {
+ ir_node *prev = sched_prev(ins);
+ if(!is_cfop(prev))
+ break;
+ ins = prev;
+ }
+ }
+
+ return ins;
+}
+
static void create_memperms(ss_env_t *env) {
memperm_t *memperm;
for(memperm = set_first(env->memperms); memperm != NULL; memperm = set_next(env->memperms)) {
int i;
memperm_entry_t *entry;
+ ir_node *blockend;
ir_node** nodes = alloca(memperm->entrycount * sizeof(nodes[0]));
ir_node* mempermnode;
mempermnode = be_new_MemPerm(env->chordal_env->birg->main_env->arch_env, env->chordal_env->irg, memperm->block,
memperm->entrycount, nodes);
+ // insert node into schedule
+ blockend = get_end_of_block_insertion_point(memperm->block);
+ sched_add_before(blockend, mempermnode);
+
for(entry = memperm->entries, i = 0; entry != NULL; entry = entry->next, ++i) {
ir_node *proj;
ir_node* arg = get_irn_n(entry->node, entry->pos);
be_set_MemPerm_in_entity(mempermnode, i, entry->in);
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);
- set_irn_n(arg, entry->pos, proj);
+ sched_add_before(blockend, proj);
+
+ set_irn_n(entry->node, entry->pos, proj);
}
- ir_printf("Memperm created in block %+F\n", memperm->block);
}
}