aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2015-05-12 13:28:33 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2015-05-12 13:28:33 +0000
commit7e37fe6f628dc0063a36fbed59a2dcf74e88cce5 (patch)
treef486f78e5f57c2fb12fcb8b4580366a8208a78fc /gcc
parentcaf07df9db933fc7c97c41060dfa940fa78bb345 (diff)
downloadgcc-7e37fe6f628dc0063a36fbed59a2dcf74e88cce5.zip
gcc-7e37fe6f628dc0063a36fbed59a2dcf74e88cce5.tar.gz
gcc-7e37fe6f628dc0063a36fbed59a2dcf74e88cce5.tar.bz2
re PR tree-optimization/66101 (internal compiler error: in verify_loop_structure, at cfgloop.c:1662)
2015-05-12 Richard Biener <rguenther@suse.de> PR tree-optimization/66101 * tree-ssa-dce.c (remove_dead_stmt): Properly mark loops for fixup if we turn a loop exit edge to a fallthru edge. * gcc.dg/torture/pr66101.c: New testcase. From-SVN: r223065
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr66101.c35
-rw-r--r--gcc/tree-ssa-dce.c7
4 files changed, 52 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index adc96c3..d3739c2 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
2015-05-12 Richard Biener <rguenther@suse.de>
+ PR tree-optimization/66101
+ * tree-ssa-dce.c (remove_dead_stmt): Properly mark loops for
+ fixup if we turn a loop exit edge to a fallthru edge.
+
+2015-05-12 Richard Biener <rguenther@suse.de>
+
PR tree-optimization/37021
* tree-vectorizer.h (struct _slp_tree): Add two_operators flag.
(SLP_TREE_TWO_OPERATORS): New define.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 9819e2a..558a676 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2015-05-12 Richard Biener <rguenther@suse.de>
+ PR tree-optimization/66101
+ * gcc.dg/torture/pr66101.c: New testcase.
+
+2015-05-12 Richard Biener <rguenther@suse.de>
+
PR tree-optimization/37021
* gcc.target/i386/vect-addsub.c: New testcase.
diff --git a/gcc/testsuite/gcc.dg/torture/pr66101.c b/gcc/testsuite/gcc.dg/torture/pr66101.c
new file mode 100644
index 0000000..f3ef5e5
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr66101.c
@@ -0,0 +1,35 @@
+/* { dg-do compile } */
+
+#include <setjmp.h>
+
+jmp_buf env;
+
+int a, c, d, e;
+
+int
+bar ()
+{
+ int b = *(long *) 7 == 5 ? : 0;
+ if (a || a > b)
+ longjmp (env, 0);
+ return 1;
+}
+
+void
+foo ()
+{
+ long f;
+ setjmp (env);
+ for (; d; c++)
+ switch (c)
+case 0:
+ {
+ f = bar () >> 1;
+ if (e)
+ goto L;
+ if (bar () >> 1)
+ goto L;
+ }
+L:
+ ;
+}
diff --git a/gcc/tree-ssa-dce.c b/gcc/tree-ssa-dce.c
index c9cb0e4..df30614 100644
--- a/gcc/tree-ssa-dce.c
+++ b/gcc/tree-ssa-dce.c
@@ -1149,7 +1149,12 @@ remove_dead_stmt (gimple_stmt_iterator *i, basic_block bb)
if (e != e2)
{
cfg_altered = true;
- remove_edge (e2);
+ /* If we made a BB unconditionally exit a loop then this
+ transform alters the set of BBs in the loop. Schedule
+ a fixup. */
+ if (loop_exit_edge_p (bb->loop_father, e))
+ loops_state_set (LOOPS_NEED_FIXUP);
+ remove_edge (e2);
}
else
ei_next (&ei);