X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;ds=sidebyside;f=ir%2Fbe%2Fbenode.c;h=85392494c455e338e08b9468a929cd35e3c14007;hb=ab5a59d5ee2de51336777a0396153acfa3e70f41;hp=5adbad837a4c7ba1e9742b017d564fa8f84f2219;hpb=b853b10c054e5f8174a735ac597cec608b3d06dc;p=libfirm diff --git a/ir/be/benode.c b/ir/be/benode.c index 5adbad837..85392494c 100644 --- a/ir/be/benode.c +++ b/ir/be/benode.c @@ -18,6 +18,7 @@ #include "set.h" #include "pmap.h" #include "util.h" +#include "debug.h" #include "irop_t.h" #include "irmode_t.h" @@ -96,17 +97,15 @@ ir_node *new_Spill(const be_node_factory_t *factory, } ir_node *new_Reload(const be_node_factory_t *factory, - const arch_register_class_t *cls, - ir_graph *irg, ir_node *bl, ir_node *spill_node) + const arch_register_class_t *cls, ir_graph *irg, + ir_node *bl, ir_mode *mode, ir_node *spill_node) { - ir_mode *mode; ir_node *in[1]; ir_op *op = get_op(factory, cls, node_kind_reload)->op; assert(op && "Reload opcode must be present for this register class"); - assert(is_Spill(factory, spill_node) && "Operand of Reload must be a Spill"); + // assert(is_Spill(factory, spill_node) && "Operand of Reload must be a Spill"); in[0] = spill_node; - mode = get_irn_mode(get_irn_n(spill_node, 0)); return new_ir_node(NULL, irg, bl, op, mode, 1, in); } @@ -325,16 +324,27 @@ ir_node *insert_Perm_after(const be_main_session_env_t *env, const arch_env_t *arch_env = env->main_env->arch_env; ir_node *bl = is_Block(pos) ? pos : get_nodes_block(pos); ir_graph *irg = get_irn_irg(bl); - pset *live_end = get_live_end(bl); - pset *live = pset_new_ptr_default(); + pset *live = put_live_end(bl, pset_new_ptr_default()); ir_node *curr, *irn, *perm, **nodes; + firm_dbg_module_t *dbg = firm_dbg_register("firm.be.node"); int i, n; - /* put all live ends in the live set. */ - for(irn = pset_first(live_end); irn; irn = pset_next(live_end)) - pset_insert_ptr(live, irn); + firm_dbg_set_mask(dbg, -1); + DBG((dbg, LEVEL_1, "Insert Perm after: %+F\n", pos)); sched_foreach_reverse(bl, irn) { + 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) + break; + + 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_has_reg_class(arch_env, irn, arch_pos_make_out(0), cls)) pset_remove_ptr(live, irn); @@ -345,27 +355,31 @@ ir_node *insert_Perm_after(const be_main_session_env_t *env, if(arch_irn_has_reg_class(arch_env, op, arch_pos_make_out(0), cls)) pset_insert_ptr(live, op); } - - if(sched_prev(irn) == pos) - break; } n = pset_count(live); nodes = malloc(n * sizeof(nodes[0])); - for(irn = pset_first(live), i = 0; irn; irn = pset_next(live), i++) + 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; + } - curr = perm = new_Perm(env->main_env->node_factory, cls, irg, bl, n, nodes); + perm = new_Perm(env->main_env->node_factory, cls, irg, bl, n, nodes); sched_add_after(pos, perm); free(nodes); + curr = perm; for(i = 0; i < n; ++i) { ir_node *copies[1]; ir_node *perm_op = get_irn_n(perm, i); + const arch_register_t *reg = arch_get_irn_register(arch_env, perm_op, 0); 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, 0, reg); + sched_add_after(curr, proj); curr = proj;