X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbelower.c;h=2f22221e4f585e02cf1501439e2712b55ee0975a;hb=87a515f6ddc89aabf9ce4a18213e6dd20f71d776;hp=42c887ea83a4b492f8b92fdf4716ab124b74ab89;hpb=07d8237a144da310a3910a0ed04768481e40fb84;p=libfirm diff --git a/ir/be/belower.c b/ir/be/belower.c index 42c887ea8..2f22221e4 100644 --- a/ir/be/belower.c +++ b/ir/be/belower.c @@ -178,14 +178,14 @@ static int get_pairidx_for_regidx(reg_pair_t *pairs, int n, int reg_idx, int in_ if (in_out) { for (i = 0; i < n; i++) { /* out register matches */ - if (pairs[i].out_reg->index == reg_idx) + if ((int) pairs[i].out_reg->index == reg_idx) return i; } } else { for (i = 0; i < n; i++) { /* in register matches */ - if (pairs[i].in_reg->index == reg_idx) + if ((int) pairs[i].in_reg->index == reg_idx) return i; } } @@ -929,8 +929,9 @@ found_front: node = sched_prev(perm); n_moved = 0; while(!sched_is_begin(node)) { - int input = -1; - ir_node *proj; + const arch_register_req_t *req; + int input = -1; + ir_node *proj; foreach_out_edge(perm, edge) { ir_node *out = get_edge_src_irn(edge); @@ -949,6 +950,14 @@ found_front: break; if(arch_irn_is(aenv, node, modify_flags)) break; + if(is_Proj(node)) { + req = arch_get_register_req(aenv, get_Proj_pred(node), + -1 - get_Proj_proj(node)); + } else { + req = arch_get_register_req(aenv, node, -1); + } + if(req->type != arch_register_req_type_normal) + break; for(i = get_irn_arity(node) - 1; i >= 0; --i) { ir_node *opop = get_irn_n(node, i); if (arch_irn_consider_in_reg_alloc(aenv, cls, opop)) {