From: Richard Biener Date: Fri, 15 Jul 2016 13:05:56 +0000 (+0000) Subject: re PR tree-optimization/71881 (ICE on valid code at -O3 with -g enabled on x86_64... X-Git-Tag: basepoints/gcc-8~5681 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b9aba0a05820874b01e67264a02494d5d8d27309;p=thirdparty%2Fgcc.git re PR tree-optimization/71881 (ICE on valid code at -O3 with -g enabled on x86_64-linux-gnu: cannot update SSA form) 2016-07-15 Richard Biener PR tree-optimization/71881 * tree-loop-distribution.c (destroy_loop): Remove blocks in reverse DOM order to make debug temp generation happy. * gcc.dg/torture/pr71881.c: New testcase. From-SVN: r238374 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 318baa204113..9e393803eb23 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2016-07-15 Richard Biener + + PR tree-optimization/71881 + * tree-loop-distribution.c (destroy_loop): Remove blocks in + reverse DOM order to make debug temp generation happy. + 2016-07-15 Richard Biener PR tree-optimization/71887 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b4892fcd5151..c3a56007ac07 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-07-15 Richard Biener + + PR tree-optimization/71881 + * gcc.dg/torture/pr71881.c: New testcase. + 2016-07-15 Richard Biener PR tree-optimization/71887 diff --git a/gcc/testsuite/gcc.dg/torture/pr71881.c b/gcc/testsuite/gcc.dg/torture/pr71881.c new file mode 100644 index 000000000000..b17db1b21c1c --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr71881.c @@ -0,0 +1,25 @@ +/* { dg-do compile } */ +/* { dg-additional-options "-g" } */ + +int a, b, c, d, *e, f, g; + +int fn1 () +{ + char h[2]; + int i = 0; + for (; i < 2; i++) + { + if (c) + for (*e = 0; *e;) + { + int j[f]; + i = *e; + } + h[i] = 0; + } + for (; a;) + return h[0]; + for (b = 0; b;) + i = g = (1 & i) < d; + return 0; +} diff --git a/gcc/tree-loop-distribution.c b/gcc/tree-loop-distribution.c index 9bca56a9b6f6..181e4e9ed7d8 100644 --- a/gcc/tree-loop-distribution.c +++ b/gcc/tree-loop-distribution.c @@ -888,13 +888,15 @@ destroy_loop (struct loop *loop) cancel_loop_tree (loop); rescan_loop_exit (exit, false, true); - for (i = 0; i < nbbs; i++) + i = nbbs; + do { /* We have made sure to not leave any dangling uses of SSA names defined in the loop. With the exception of virtuals. Make sure we replace all uses of virtual defs that will remain outside of the loop with the bare symbol as delete_basic_block will release them. */ + --i; for (gphi_iterator gsi = gsi_start_phis (bbs[i]); !gsi_end_p (gsi); gsi_next (&gsi)) { @@ -912,6 +914,8 @@ destroy_loop (struct loop *loop) } delete_basic_block (bbs[i]); } + while (i != 0); + free (bbs); set_immediate_dominator (CDI_DOMINATORS, dest,