X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbeirgmod.c;h=4806a580ff85f584c3b2c001adfbb89ecc7bb197;hb=48f0393daa5d5a14ed7e3e32ee2b090759c9371e;hp=9992afa9b61a48f645e36148a114ddae17292e1e;hpb=f2bb8352d81f3a4b0acac43fa6b2081d7ab782bf;p=libfirm diff --git a/ir/be/beirgmod.c b/ir/be/beirgmod.c index 9992afa9b..4806a580f 100644 --- a/ir/be/beirgmod.c +++ b/ir/be/beirgmod.c @@ -243,10 +243,12 @@ static ir_node *search_def(ir_node *usage, int pos, pset *copies, pset *copy_blo * predecessor block of the usage. */ while(curr_bl != NULL) { + ir_node *phim; /* * If this block contains a copy, search the block - * instruction by instruction. + * instruction by instruction. If nothing is found + * search for a not scheduled PhiM. */ if(pset_find_ptr(copy_blocks, curr_bl)) { ir_node *irn; @@ -258,6 +260,16 @@ static ir_node *search_def(ir_node *usage, int pos, pset *copies, pset *copy_blo if(pset_find_ptr(copies, irn)) return irn; } + + for(phim = pset_first(copies); phim; phim = pset_next(copies)) { + if(!is_Phi(phim) || !(get_irn_mode(phim) == mode_M)) + continue; + + if(get_nodes_block(phim) == curr_bl) { + pset_break(copies); + return phim; + } + } } if(pset_find_ptr(phi_blocks, curr_bl)) { @@ -280,6 +292,16 @@ static ir_node *search_def(ir_node *usage, int pos, pset *copies, pset *copy_blo for(i = 0; i < n_preds; ++i) { ir_node *arg = search_def(phi, i, copies, copy_blocks, phis, phi_blocks, mode); + if(arg == NULL) { + ir_node *irn; + + ir_fprintf(stderr, "no definition found for %+F at position %d\nCopies: ", phi, i); + for(irn = pset_first(copies); irn; irn = pset_next(copies)) { + ir_fprintf(stderr, "%+F ", irn); + } + ir_fprintf(stderr, "\n\n"); + assert(arg && "no definition found"); + } DBG((dbg, LEVEL_2, "\t\t%+F(%d) -> %+F\n", phi, i, arg)); set_irn_n(phi, i, arg); } @@ -347,8 +369,15 @@ static void fix_usages(pset *copies, pset *copy_blocks, pset *phi_blocks, pset * def = search_def(irn, pos, copies, copy_blocks, phis, phi_blocks, mode); DBG((dbg, LEVEL_2, "\t%+F(%d) -> %+F\n", irn, pos, def)); - if(def != NULL) - set_irn_n(irn, pos, def); + if(def == NULL) { + ir_fprintf(stderr, "no definition found for %+F at position %d\nCopies: ", irn, pos); + for(irn = pset_first(copies); irn; irn = pset_next(copies)) { + ir_fprintf(stderr, "%+F ", irn); + } + ir_fprintf(stderr, "\n\n"); + assert(def && "no definition found"); + } + set_irn_n(irn, pos, def); } obstack_free(&obst, NULL); @@ -610,28 +639,27 @@ static void remove_empty_block(ir_node *block, void *data) { assert(is_Block(block)); - if(get_Block_n_cfgpreds(block) != 1) + if (get_Block_n_cfgpreds(block) != 1) return; sched_foreach(block, node) { - if(!is_Jmp(node)) + if (! is_Jmp(node)) return; - if(get_irn_n_edges(node) != 1) - return; - if(jump != NULL) { - // we should never have 2 jumps in a block - assert(0); + if (jump != NULL) { + /* we should never have 2 jumps in a block */ + assert(0 && "We should never have 2 jumps in a block"); return; } jump = node; } - if(jump == NULL) + + if (jump == NULL) return; node = get_Block_cfgpred(block, 0); foreach_out_edge_safe(jump, edge, next) { ir_node *block = get_edge_src_irn(edge); - int pos = get_edge_src_pos(edge); + int pos = get_edge_src_pos(edge); set_irn_n(block, pos, node); }