From b9aba0a05820874b01e67264a02494d5d8d27309 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Fri, 15 Jul 2016 13:05:56 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/torture/pr71881.c | 25 +++++++++++++++++++++++++ gcc/tree-loop-distribution.c | 6 +++++- 4 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr71881.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 318baa20411..9e393803eb2 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 b4892fcd515..c3a56007ac0 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 00000000000..b17db1b21c1 --- /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 9bca56a9b6f..181e4e9ed7d 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, -- 2.30.2