aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr78384.c25
-rw-r--r--gcc/tree-ssa-loop-split.c2
4 files changed, 36 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 71aaad9..851fbc5 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2017-01-23 Michael Matz <matz@suse.de>
+
+ PR tree-optimization/78384
+ * tree-ssa-loop-split.c (patch_loop_exit): Use correct edge.
+
2017-01-23 Richard Biener <rguenther@suse.de>
PR tree-optimization/79186
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c64baf5..cb4c19d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2017-01-23 Michael Matz <matz@suse.de>
+
+ PR tree-optimization/78384
+ * gcc.dg/pr78384.c: New test.
+
2017-01-23 Richard Biener <rguenther@suse.de>
PR tree-optimization/79186
diff --git a/gcc/testsuite/gcc.dg/pr78384.c b/gcc/testsuite/gcc.dg/pr78384.c
new file mode 100644
index 0000000..d93437d
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr78384.c
@@ -0,0 +1,25 @@
+/* PR tree-optimization/78384
+ { dg-do compile }
+ { dg-options "-O3 -w -fsplit-loops" } */
+void
+a2 (int wv, int yg, int r9)
+{
+ while (wv < 1)
+ {
+ int vn = r9 % 0;
+
+ while (yg < 1)
+ {
+ int lz;
+
+ for (r9 = 0; r9 < 17; ++r9)
+ {
+ }
+
+ it:
+ lz = (yg++ >= 0) ? 2 : 0;
+ wv = vn < lz;
+ }
+ }
+ goto it;
+}
diff --git a/gcc/tree-ssa-loop-split.c b/gcc/tree-ssa-loop-split.c
index 7809db0..f104b26 100644
--- a/gcc/tree-ssa-loop-split.c
+++ b/gcc/tree-ssa-loop-split.c
@@ -159,7 +159,7 @@ patch_loop_exit (struct loop *loop, gcond *guard, tree nextval, tree newbound,
nextval, newbound);
update_stmt (stmt);
- edge stay = single_pred_edge (loop->latch);
+ edge stay = EDGE_SUCC (exit->src, EDGE_SUCC (exit->src, 0) == exit);
exit->flags &= ~(EDGE_TRUE_VALUE | EDGE_FALSE_VALUE);
stay->flags &= ~(EDGE_TRUE_VALUE | EDGE_FALSE_VALUE);