Bootstrapped and tested on x86_64-unknown-linux-gnu, applied.
Richard. 2018-09-17 Richard Biener <rguent...@suse.de> PR tree-optimization/87328 * tree-ssa-sccvn.c (process_bb): Remove assertion about not visiting unexecutable backedges when not iterating. (do_rpo_vn): Mark all edges not executable even when not iterating. * gcc.dg/torture/pr87328.c: New testcase. Index: gcc/tree-ssa-sccvn.c =================================================================== --- gcc/tree-ssa-sccvn.c (revision 264364) +++ gcc/tree-ssa-sccvn.c (working copy) @@ -5978,7 +5978,6 @@ process_bb (rpo_elim &avail, basic_block fprintf (dump_file, "marking outgoing edge %d -> %d executable\n", e->src->index, e->dest->index); - gcc_checking_assert (iterate || !(e->flags & EDGE_DFS_BACK)); e->flags |= EDGE_EXECUTABLE; e->dest->flags |= BB_EXECUTABLE; } @@ -6125,7 +6124,6 @@ process_bb (rpo_elim &avail, basic_block "marking known outgoing %sedge %d -> %d executable\n", e->flags & EDGE_DFS_BACK ? "back-" : "", e->src->index, e->dest->index); - gcc_checking_assert (iterate || !(e->flags & EDGE_DFS_BACK)); e->flags |= EDGE_EXECUTABLE; e->dest->flags |= BB_EXECUTABLE; } @@ -6148,7 +6146,6 @@ process_bb (rpo_elim &avail, basic_block fprintf (dump_file, "marking outgoing edge %d -> %d executable\n", e->src->index, e->dest->index); - gcc_checking_assert (iterate || !(e->flags & EDGE_DFS_BACK)); e->flags |= EDGE_EXECUTABLE; e->dest->flags |= BB_EXECUTABLE; } @@ -6390,10 +6387,7 @@ do_rpo_vn (function *fn, edge entry, bit { if (e->flags & EDGE_DFS_BACK) has_backedges = true; - if (! iterate && (e->flags & EDGE_DFS_BACK)) - e->flags |= EDGE_EXECUTABLE; - else - e->flags &= ~EDGE_EXECUTABLE; + e->flags &= ~EDGE_EXECUTABLE; if (e == entry) continue; if (bb_to_rpo[e->src->index] > i) Index: gcc/testsuite/gcc.dg/torture/pr87328.c =================================================================== --- gcc/testsuite/gcc.dg/torture/pr87328.c (nonexistent) +++ gcc/testsuite/gcc.dg/torture/pr87328.c (working copy) @@ -0,0 +1,25 @@ +/* { dg-do compile } */ +/* { dg-additional-options "-fno-tree-ccp -fno-tree-forwprop" } */ + +void +tp (void) +{ + int qt; + + qt = 0; + if (qt != 0) + { + if (0) + { +h5: + qt = 0; + while (qt < 1) + { + } + } + + ++qt; + } + + goto h5; +}