From: Sebastian Hack Date: Fri, 17 Mar 2006 09:38:09 +0000 (+0000) Subject: Fixed spill placement in start block X-Git-Url: http://nsz.repo.hu/git/?a=commitdiff_plain;ds=sidebyside;h=47bb27bdaf7c524167169c6208389b0da9410071;p=libfirm Fixed spill placement in start block --- diff --git a/ir/be/benode.c b/ir/be/benode.c index 28032041f..e79acc33b 100644 --- a/ir/be/benode.c +++ b/ir/be/benode.c @@ -796,11 +796,11 @@ void be_copy_entities_to_reloads(ir_graph *irg) ir_node *be_spill(const arch_env_t *arch_env, ir_node *irn, ir_node *ctx) { - ir_node *bl = get_nodes_block(irn); - ir_graph *irg = get_irn_irg(bl); - ir_node *frame = get_irg_frame(irg); + ir_node *bl = get_nodes_block(irn); + ir_graph *irg = get_irn_irg(bl); + ir_node *frame = get_irg_frame(irg); + ir_node *insert = bl; ir_node *spill; - ir_node *insert; const arch_register_class_t *cls = arch_get_irn_reg_class(arch_env, irn, -1); const arch_register_class_t *cls_frame = arch_get_irn_reg_class(arch_env, frame, -1); @@ -812,20 +812,17 @@ ir_node *be_spill(const arch_env_t *arch_env, ir_node *irn, ir_node *ctx) * directly after the phi, if there are some phis behind the one which * is spilled. Also, a spill of a Proj must be after all Projs of the * same tuple node. - */ - insert = sched_next(irn); - while((is_Phi(insert) || is_Proj(insert)) && !sched_is_end(insert)) - insert = sched_next(insert); - - /* + * * Here's one special case: * If the spill is in the start block, the spill must be after the frame - * pointer is set up. This is checked here and fixed. - * If the insertion point is already the block, everything is fine, since - * the Spill gets inserted at the end of the block. + * pointer is set up. This is done by setting insert to the end of the block + * which is its default initialization (see above). */ - if(bl == get_irg_start_block(irg) && insert != bl && sched_comes_after(insert, frame)) - insert = sched_next(frame); + if(bl != get_irg_start_block(irg)) { + insert = sched_next(irn); + while((is_Phi(insert) || is_Proj(insert)) && !sched_is_end(insert)) + insert = sched_next(insert); + } sched_add_before(insert, spill); return spill; @@ -1134,99 +1131,3 @@ static const ir_op_ops be_node_op_ops = { dump_node, NULL }; - -pset *nodes_live_at(const arch_env_t *arch_env, const arch_register_class_t *cls, const ir_node *pos, pset *live) -{ - firm_dbg_module_t *dbg = firm_dbg_register("firm.be.node"); - const ir_node *bl = is_Block(pos) ? pos : get_nodes_block(pos); - ir_node *irn; - irn_live_t *li; - - live_foreach(bl, li) { - ir_node *irn = (ir_node *) li->irn; - if(live_is_end(li) && arch_irn_consider_in_reg_alloc(arch_env, cls, irn)) - pset_insert_ptr(live, irn); - } - - sched_foreach_reverse(bl, irn) { - int i, n; - ir_node *x; - - /* - * If we encounter the node we want to insert the Perm after, - * exit immediately, so that this node is still live - */ - if(irn == pos) - return live; - - DBG((dbg, LEVEL_1, "%+F\n", irn)); - for(x = pset_first(live); x; x = pset_next(live)) - DBG((dbg, LEVEL_1, "\tlive: %+F\n", x)); - - if(arch_irn_consider_in_reg_alloc(arch_env, cls, irn)) - pset_remove_ptr(live, irn); - - for(i = 0, n = get_irn_arity(irn); i < n; ++i) { - ir_node *op = get_irn_n(irn, i); - - if(arch_irn_consider_in_reg_alloc(arch_env, cls, op)) - pset_insert_ptr(live, op); - } - } - - return live; -} - -ir_node *insert_Perm_after(const arch_env_t *arch_env, - const arch_register_class_t *cls, - dom_front_info_t *dom_front, - ir_node *pos) -{ - ir_node *bl = is_Block(pos) ? pos : get_nodes_block(pos); - ir_graph *irg = get_irn_irg(bl); - pset *live = pset_new_ptr_default(); - firm_dbg_module_t *dbg = firm_dbg_register("be.node"); - - ir_node *curr, *irn, *perm, **nodes; - int i, n; - - DBG((dbg, LEVEL_1, "Insert Perm after: %+F\n", pos)); - - if(!nodes_live_at(arch_env, cls, pos, live)); - - n = pset_count(live); - - if(n == 0) - return NULL; - - nodes = malloc(n * sizeof(nodes[0])); - - DBG((dbg, LEVEL_1, "live:\n")); - for(irn = pset_first(live), i = 0; irn; irn = pset_next(live), i++) { - DBG((dbg, LEVEL_1, "\t%+F\n", irn)); - nodes[i] = irn; - } - - perm = be_new_Perm(cls, irg, bl, n, nodes); - sched_add_after(pos, perm); - free(nodes); - - curr = perm; - for(i = 0; i < n; ++i) { - ir_node *copies[2]; - ir_node *perm_op = get_irn_n(perm, i); - const arch_register_t *reg = arch_get_irn_register(arch_env, perm_op); - - ir_mode *mode = get_irn_mode(perm_op); - ir_node *proj = new_r_Proj(irg, bl, perm, mode, i); - arch_set_irn_register(arch_env, proj, reg); - - sched_add_after(curr, proj); - curr = proj; - - copies[0] = perm_op; - copies[1] = proj; - be_ssa_constr(dom_front, 2, copies); - } - return perm; -} diff --git a/ir/be/benode_t.h b/ir/be/benode_t.h index b0f55c2e2..1b422fdb2 100644 --- a/ir/be/benode_t.h +++ b/ir/be/benode_t.h @@ -204,8 +204,7 @@ int be_is_StackParam(const ir_node *irn); int be_is_FrameAddr(const ir_node *irn); int be_is_FrameLoad(const ir_node *irn); int be_is_FrameStore(const ir_node *irn); -int be_is_Epilogue(const ir_node *irn); -int be_is_Prologue(const ir_node *irn); +int be_is_Barrier(const ir_node *irn); /** * Get the entity on the stack frame the given node uses.