Bootstrapped and tested on x86_64-unkown-linux-gnu, applied.
Richard. 2018-09-03 Richard Biener <rguent...@suse.de> PR tree-optimization/87169 * tree-ssa-sccvn.c (do_rpo_vn): When marking loops for not iterating make sure there's no extra backedges from irreducible regions feeding the header. Mark the destination block executable. * gcc.dg/torture/pr87169.c: New testcase. Index: gcc/tree-ssa-sccvn.c =================================================================== --- gcc/tree-ssa-sccvn.c (revision 264052) +++ gcc/tree-ssa-sccvn.c (working copy) @@ -6360,12 +6360,28 @@ do_rpo_vn (function *fn, edge entry, bit i < loop_depth (loop) - max_depth; ++i) { basic_block header = superloop_at_depth (loop, i)->header; - rpo_state[bb_to_rpo[header->index]].iterate = false; + bool non_latch_backedge = false; edge e; edge_iterator ei; FOR_EACH_EDGE (e, ei, header->preds) if (e->flags & EDGE_DFS_BACK) - e->flags |= EDGE_EXECUTABLE; + { + e->flags |= EDGE_EXECUTABLE; + e->dest->flags |= BB_EXECUTABLE; + /* There can be a non-latch backedge into the header + which is part of an outer irreducible region. We + cannot avoid iterating this block then. */ + if (!dominated_by_p (CDI_DOMINATORS, + e->src, e->dest)) + { + if (dump_file && (dump_flags & TDF_DETAILS)) + fprintf (dump_file, "non-latch backedge %d -> %d " + "forces iteration of loop %d\n", + e->src->index, e->dest->index, loop->num); + non_latch_backedge = true; + } + } + rpo_state[bb_to_rpo[header->index]].iterate = non_latch_backedge; } } Index: gcc/testsuite/gcc.dg/torture/pr87169.c =================================================================== --- gcc/testsuite/gcc.dg/torture/pr87169.c (revision 0) +++ gcc/testsuite/gcc.dg/torture/pr87169.c (working copy) @@ -0,0 +1,41 @@ +/* { dg-do compile } */ +/* { dg-additional-options "--param rpo-vn-max-loop-depth=7" } */ + +int a, b, c; + +int main () +{ + int d; + b = 1; +L1: + for (; b > 1;) + goto L2; + { + int e[1]; +L3:; + } +L2: + while (a) + { + d--; + goto L1; + } + while (c) + { + if (a) + goto L3; + if (a) + break; + if (a) + goto L2; + while (c) + while (c) + while (c) + while (c) + while (c) + while (c) + while (c) + ; + } + return 0; +}