X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbelower.c;h=18052a00fe80e12292b30ecba3a29fcbeac7e027;hb=1b4cac3471b02b63e9656cd8c876f067766fe482;hp=10d1cc62a45f481b920715518d7a83cb55e8cbaa;hpb=1376e7ac003f5d209b72056c62798cbb6d928de3;p=libfirm diff --git a/ir/be/belower.c b/ir/be/belower.c index 10d1cc62a..18052a00f 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); + ); } } @@ -809,10 +790,9 @@ void assure_constraints(ir_graph *irg) ir_node *keep; keep = be_new_Keep(get_nodes_block(cp), n, get_irn_in(cp) + 1); - sched_add_before(cp, keep); + sched_replace(cp, keep); /* Set all ins (including the block) of the CopyKeep BAD to keep the verifier happy. */ - sched_remove(cp); kill_node(cp); } }