diff options
author | Yuri Rumyantsev <ysrumyan@gmail.com> | 2015-12-18 10:16:56 +0000 |
---|---|---|
committer | Ilya Enkovich <ienkovich@gcc.gnu.org> | 2015-12-18 10:16:56 +0000 |
commit | 5c846df71f33216fa8b5ccf21e88ee64b58b678a (patch) | |
tree | f1d8e45b62b6d4c701c6a9043e57dedb159179af /gcc | |
parent | b3d51f238b954ccab35dfcbebf5321bc91106a40 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr68906.c | 24 | ||||
-rw-r--r-- | gcc/tree-ssa-loop-unswitch.c | 4 |
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)) |