X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbeirgmod.c;h=50d65bdad64950826b061dc76bf5dcfa36e5f6a1;hb=b9d45e08e23bcf058fa8f2d9e18dd78e8cccd044;hp=9992afa9b61a48f645e36148a114ddae17292e1e;hpb=4362d1e56a708bc4d226ac09055e951253a6be06;p=libfirm diff --git a/ir/be/beirgmod.c b/ir/be/beirgmod.c index 9992afa9b..50d65bdad 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); @@ -616,8 +645,6 @@ static void remove_empty_block(ir_node *block, void *data) { sched_foreach(block, 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); @@ -642,7 +669,6 @@ static void remove_empty_block(ir_node *block, void *data) { irg = get_irn_irg(block); set_irg_doms_inconsistent(irg); set_irg_extblk_inconsistent(irg); - set_irg_outs_inconsistent(irg); } /**