From d886761fd048a6ad77dc7c927cbedfa503cfe01b Mon Sep 17 00:00:00 2001 From: Michael Matz Date: Mon, 23 Jan 2017 13:57:31 +0000 Subject: [PATCH] fix pr78384 PR tree-optimization/78384 * tree-ssa-loop-split.c (patch_loop_exit): Use correct edge. testsuite/ PR tree-optimization/78384 * gcc.dg/pr78384.c: New test. From-SVN: r244811 --- gcc/ChangeLog | 5 +++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/pr78384.c | 25 +++++++++++++++++++++++++ gcc/tree-ssa-loop-split.c | 2 +- 4 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/pr78384.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 71aaad9bcc4..851fbc5fb19 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2017-01-23 Michael Matz + + PR tree-optimization/78384 + * tree-ssa-loop-split.c (patch_loop_exit): Use correct edge. + 2017-01-23 Richard Biener PR tree-optimization/79186 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c64baf573e3..cb4c19d7642 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-01-23 Michael Matz + + PR tree-optimization/78384 + * gcc.dg/pr78384.c: New test. + 2017-01-23 Richard Biener 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 00000000000..d93437dd26c --- /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 7809db00e12..f104b2621c0 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); -- 2.30.2