X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;ds=sidebyside;f=ir%2Fbe%2Fbelower.c;h=7ba31cfbe35cac05d31a60ca1ae93dd31b8b00f4;hb=a286e7dcdb4c41b2165c64fc85ed9eb021c08bc0;hp=b8e9cdd801e4bf9e41ea96b7bc6bc766197169ee;hpb=f94d292525ff2eb4b35dfcb1977612aa9deca775;p=libfirm diff --git a/ir/be/belower.c b/ir/be/belower.c index b8e9cdd80..7ba31cfbe 100644 --- a/ir/be/belower.c +++ b/ir/be/belower.c @@ -350,11 +350,6 @@ static void lower_perm_node(ir_node *irn, void *walk_env) { set_Proj_proj(pairs[i].out_node, get_Proj_proj(pairs[i].in_node)); } -#ifdef SCHEDULE_PROJS - /* remove the proj from the schedule */ - sched_remove(pairs[i].out_node); -#endif - /* reroute the edges from the proj to the argument */ exchange(pairs[i].out_node, pairs[i].in_node); //edges_reroute(pairs[i].out_node, pairs[i].in_node, env->birg->irg); @@ -466,25 +461,12 @@ static void lower_perm_node(ir_node *irn, void *walk_env) { /* set as in for next Perm */ pairs[pidx].in_node = res1; } - else { -#ifdef SCHEDULE_PROJS - sched_remove(res1); -#endif - } - -#ifdef SCHEDULE_PROJS - sched_remove(res2); -#endif set_Proj_pred(res2, cpyxchg); set_Proj_proj(res2, 0); set_Proj_pred(res1, cpyxchg); set_Proj_proj(res1, 1); -#ifdef SCHEDULE_PROJS - sched_add_after(sched_point, res1); - sched_add_after(sched_point, res2); -#endif arch_set_irn_register(arch_env, res2, cycle->elems[i + 1]); arch_set_irn_register(arch_env, res1, cycle->elems[i]); @@ -504,10 +486,6 @@ static void lower_perm_node(ir_node *irn, void *walk_env) { arch_set_irn_register(arch_env, cpyxchg, cycle->elems[i + 1]); n_ops++; -#ifdef SCHEDULE_PROJS - /* remove the proj from the schedule */ - sched_remove(res2); -#endif /* exchange copy node and proj */ exchange(res2, cpyxchg); @@ -962,6 +940,11 @@ found_front: bitset_set(keep, nr); if (!is_Proj(op) && get_nodes_block(op) == bl && (op == frontier || sched_comes_after(frontier, op))) { + /* don't move around nodes that modifies the flags */ + if (arch_irn_is(aenv, op, modify_flags)) { + continue; + } + for (i = get_irn_arity(op) - 1; i >= 0; --i) { ir_node *opop = get_irn_n(op, i); if (!arch_irn_consider_in_reg_alloc(aenv, cls, opop)) { @@ -1006,11 +989,6 @@ found_front: /* reroute all users of the proj to the moved node. */ edges_reroute(proj, move, irg); -#ifdef SCHEDULE_PROJS - /* remove the proj from the schedule. */ - sched_remove(proj); -#endif - /* and like it to bad so it is no more in the use array of the perm */ set_Proj_pred(proj, get_irg_bad(irg)); @@ -1032,15 +1010,18 @@ found_front: * @param walk_env The walker environment */ static void lower_nodes_after_ra_walker(ir_node *irn, void *walk_env) { - if (! is_Block(irn) && ! is_Proj(irn)) { - if (be_is_Perm(irn)) { - int perm_stayed = push_through_perm(irn, walk_env); - if (perm_stayed) - lower_perm_node(irn, walk_env); - } - } + int perm_stayed; - return; + if (is_Block(irn) || is_Proj(irn)) + return; + if (!be_is_Perm(irn)) + return; + + perm_stayed = push_through_perm(irn, walk_env); + if (!perm_stayed) + return; + + lower_perm_node(irn, walk_env); } /**