X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbelower.c;h=e39cbe34046dbdb3e2b39b0278b492ce334e637e;hb=64252961a7d41265ff28353949e63f0662a1cd03;hp=b8a1d01b610702fcef0642e372e1d0b80d224fd3;hpb=fa66e6b80ee0a2e0c20cd1663c84b06e3178d217;p=libfirm diff --git a/ir/be/belower.c b/ir/be/belower.c index b8a1d01b6..e39cbe340 100644 --- a/ir/be/belower.c +++ b/ir/be/belower.c @@ -86,8 +86,6 @@ typedef struct reg_pair_t { typedef enum perm_type_t { PERM_CYCLE, PERM_CHAIN, - PERM_SWAP, - PERM_COPY } perm_type_t; /** Structure to represent cycles or chains in a Perm. */ @@ -382,9 +380,9 @@ static void lower_perm_node(ir_node *irn, lower_env_t *env) * IN_2 = in node with register i + 1 * OUT_1 = out node with register i + 1 * OUT_2 = out node with register i */ + ir_node *cpyxchg; if (cycle.type == PERM_CYCLE && !do_copy) { ir_node *in[2]; - ir_node *cpyxchg; in[0] = arg1; in[1] = arg2; @@ -441,16 +439,8 @@ static void lower_perm_node(ir_node *irn, lower_env_t *env) arch_set_irn_register(res2, cycle.elems[i + 1]); arch_set_irn_register(res1, cycle.elems[i]); - /* insert the copy/exchange node in schedule after the magic schedule node (see above) */ - sched_add_after(skip_Proj(sched_point), cpyxchg); - DB((dbg, LEVEL_1, "replacing %+F with %+F, placed new node after %+F\n", irn, cpyxchg, sched_point)); - - /* set the new scheduling point */ - sched_point = res1; } else { - ir_node *cpyxchg; - DB((dbg, LEVEL_1, "%+F creating copy node (%+F, %s) -> (%+F, %s)\n", irn, arg1, cycle.elems[i]->name, res2, cycle.elems[i + 1]->name)); @@ -459,13 +449,13 @@ static void lower_perm_node(ir_node *irn, lower_env_t *env) /* exchange copy node and proj */ exchange(res2, cpyxchg); + } - /* insert the copy/exchange node in schedule after the magic schedule node (see above) */ - sched_add_after(skip_Proj(sched_point), cpyxchg); + /* insert the copy/exchange node in schedule after the magic schedule node (see above) */ + sched_add_after(sched_point, cpyxchg); - /* set the new scheduling point */ - sched_point = cpyxchg; - } + /* set the new scheduling point */ + sched_point = cpyxchg; } } @@ -624,19 +614,10 @@ static void assure_constraints_walker(ir_node *block, void *walk_env) constraint_env_t *env = (constraint_env_t*)walk_env; sched_foreach_reverse(block, irn) { - ir_mode *mode = get_irn_mode(irn); - - if (mode == mode_T) { - foreach_out_edge(irn, edge) { - ir_node *proj = get_edge_src_irn(edge); - - mode = get_irn_mode(proj); - if (mode_is_datab(mode)) - assure_different_constraints(proj, irn, env); - } - } else if (mode_is_datab(mode)) { - assure_different_constraints(irn, irn, env); - } + be_foreach_value(irn, value, + if (mode_is_datab(get_irn_mode(value))) + assure_different_constraints(value, irn, env); + ); } } @@ -850,6 +831,7 @@ static int push_through_perm(ir_node *perm) int new_size; ir_node *frontier = bl; int i, n; + be_lv_t *lv = be_get_irg_liveness(irg); /* get some Proj and find out the register class of that Proj. */ ir_node *one_proj = get_edge_src_irn(get_irn_out_edge_first_kind(perm, EDGE_KIND_NORMAL)); @@ -867,15 +849,12 @@ static int push_through_perm(ir_node *perm) * the Perm, increasing the register pressure by one. */ sched_foreach_reverse_from(sched_prev(perm), irn) { - for (i = get_irn_arity(irn) - 1; i >= 0; --i) { - ir_node *op = get_irn_n(irn, i); - be_lv_t *lv = be_get_irg_liveness(irg); - if (arch_irn_consider_in_reg_alloc(cls, op) && - !be_values_interfere(lv, op, one_proj)) { + be_foreach_use(irn, cls, in_req_, op, op_req_, + if (!be_values_interfere(lv, op, one_proj)) { frontier = irn; goto found_front; } - } + ); } found_front: