On Mon, Oct 22, 2012 at 10:39 PM, Jakub Jelinek <ja...@redhat.com> wrote: > dominance.c doesn't use cfgloop.h (can it? Isn't it used before loops are > computed, perhaps after loops destroyed, etc.), so there is no guarantee > that loop->latch of endless loop will have the fake edge added and no other > bb before it. As 7 and 8 are bigger than 4 or 6, the above loop > starts with bb 8, finds that its predecessor has already been searched and > stops there, similarly for 7, then goes on with 6 with another fake edge to > exit.
At least it looks like some of the cfganal DFS code could be used in dominance.c. I will have a look. A hack like the following should result in no fake edges for bb7 and bb8. Ciao! Steven Index: dominance.c =================================================================== --- dominance.c (revision 192517) +++ dominance.c (working copy) @@ -353,12 +353,15 @@ pretend that there is an edge to the exit block. In the second case, we wind up with a forest. We need to process all noreturn blocks before we know if we've got any infinite loops. */ - + int *revcfg_postorder = XNEWVEC (int, n_basic_blocks); + int n = inverted_post_order_compute (revcfg_postorder); + unsigned int i = (unsigned) n; basic_block b; bool saw_unconnected = false; - FOR_EACH_BB_REVERSE (b) + while (i) { + basic_block b = revcfg_postorder[--i]; if (EDGE_COUNT (b->succs) > 0) { if (di->dfs_order[b->index] == 0) @@ -375,8 +378,10 @@ if (saw_unconnected) { - FOR_EACH_BB_REVERSE (b) + i = n; + while (i) { + basic_block b = revcfg_postorder[--i]; if (di->dfs_order[b->index]) continue; bitmap_set_bit (di->fake_exit_edge, b->index);