Bootstrapped / tested on x86_64-unknown-linux-gnu, applied.
Richard. 2018-10-23 Richard Biener <rguent...@suse.de> PR tree-optimization/87693 * tree-ssa-threadedge.c (thread_around_empty_blocks): Handle the case we do not find the taken edge. * gcc.dg/torture/pr87693.c: New testcase. diff --git a/gcc/testsuite/gcc.dg/torture/pr87693.c b/gcc/testsuite/gcc.dg/torture/pr87693.c new file mode 100644 index 00000000000..802560dd347 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr87693.c @@ -0,0 +1,17 @@ +/* { dg-do compile } */ + +void f (void); +void g (void); +void h (int a) +{ + void *p, **q; + if (a) + p = (void *)f; + else + p = (void *)g; + q = (void *)p; + if (*q == (void *)0) + goto *p; +L0: + return; +} diff --git a/gcc/tree-ssa-threadedge.c b/gcc/tree-ssa-threadedge.c index 0b1f9733fdd..330ba153e37 100644 --- a/gcc/tree-ssa-threadedge.c +++ b/gcc/tree-ssa-threadedge.c @@ -981,7 +981,8 @@ thread_around_empty_blocks (edge taken_edge, else taken_edge = find_taken_edge (bb, cond); - if ((taken_edge->flags & EDGE_DFS_BACK) != 0) + if (!taken_edge + || (taken_edge->flags & EDGE_DFS_BACK) != 0) return false; if (bitmap_bit_p (visited, taken_edge->dest->index))