aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorYuri Rumyantsev <ysrumyan@gmail.com>2015-12-18 10:16:56 +0000
committerIlya Enkovich <ienkovich@gcc.gnu.org>2015-12-18 10:16:56 +0000
commit5c846df71f33216fa8b5ccf21e88ee64b58b678a (patch)
treef1d8e45b62b6d4c701c6a9043e57dedb159179af /gcc
parentb3d51f238b954ccab35dfcbebf5321bc91106a40 (diff)
downloadgcc-5c846df71f33216fa8b5ccf21e88ee64b58b678a.zip
gcc-5c846df71f33216fa8b5ccf21e88ee64b58b678a.tar.gz
gcc-5c846df71f33216fa8b5ccf21e88ee64b58b678a.tar.bz2
re PR tree-optimization/68906 (ICE at -O3 on x86_64-linux-gnu: verify_ssa failed)
gcc/ 2015-12-18 Yuri Rumyantsev <ysrumyan@gmail.com> PR tree-optimization/68906 * tree-ssa-loop-unswitch.c (tree_unswitch_outer_loop): Add check that an exit block belongs to LOOP. gcc/testsuite/ 2015-12-18 Yuri Rumyantsev <ysrumyan@gmail.com> PR tree-optimization/68906 * gcc.dg/torture/pr68906.c: New test. From-SVN: r231812
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr68906.c24
-rw-r--r--gcc/tree-ssa-loop-unswitch.c4
4 files changed, 37 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 32a94eb..aab0e3a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2015-12-18 Yuri Rumyantsev <ysrumyan@gmail.com>
+
+ PR tree-optimization/68906
+ * tree-ssa-loop-unswitch.c (tree_unswitch_outer_loop): Add check
+ that an exit block belongs to LOOP.
+
2015-12-18 Ilya Enkovich <enkovich.gnu@gmail.com>
PR tree-optimization/68956
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 6120ed1..eee0434 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2015-12-18 Yuri Rumyantsev <ysrumyan@gmail.com>
+
+ PR tree-optimization/68906
+ * gcc.dg/torture/pr68906.c: New test.
+
2015-12-18 Ilya Enkovich <enkovich.gnu@gmail.com>
PR tree-optimization/68956
diff --git a/gcc/testsuite/gcc.dg/torture/pr68906.c b/gcc/testsuite/gcc.dg/torture/pr68906.c
new file mode 100644
index 0000000..8c89bbd
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr68906.c
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-options "-O3" } */
+
+int a;
+volatile int b;
+short c, d;
+int
+fn1 ()
+{
+ int e;
+ for (;;)
+ {
+ a = 3;
+ if (c)
+ continue;
+ e = 0;
+ for (; e > -30; e--)
+ if (b)
+ {
+ int f = e;
+ return d;
+ }
+ }
+}
diff --git a/gcc/tree-ssa-loop-unswitch.c b/gcc/tree-ssa-loop-unswitch.c
index c340bcb..a17c60e 100644
--- a/gcc/tree-ssa-loop-unswitch.c
+++ b/gcc/tree-ssa-loop-unswitch.c
@@ -429,9 +429,9 @@ tree_unswitch_outer_loop (struct loop *loop)
gcc_assert (loop->inner);
if (loop->inner->next)
return false;
- /* Accept loops with single exit only. */
+ /* Accept loops with single exit only which is not from inner loop. */
exit = single_exit (loop);
- if (!exit)
+ if (!exit || exit->src->loop_father != loop)
return false;
/* Check that phi argument of exit edge is not defined inside loop. */
if (!check_exit_phi (loop))