aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/cfgexpand.c9
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr80901.c32
4 files changed, 48 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 433c15a..932ab69 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2017-05-30 Richard Biener <rguenther@suse.de>
+
+ PR middle-end/80901
+ * cfgexpand.c (expand_gimple_cond): Match up loop fixup with
+ split_edge code.
+
2017-05-24 Robin Dapp <rdapp@linux.vnet.ibm.com>
* tree-vect-data-refs.c (vect_get_peeling_costs_all_drs):
diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c
index c5b4d70..698d43b 100644
--- a/gcc/cfgexpand.c
+++ b/gcc/cfgexpand.c
@@ -2503,10 +2503,11 @@ expand_gimple_cond (basic_block bb, gcond *stmt)
false_edge->flags |= EDGE_FALLTHRU;
new_bb->count = false_edge->count;
new_bb->frequency = EDGE_FREQUENCY (false_edge);
- add_bb_to_loop (new_bb, dest->loop_father);
- if (dest->loop_father->latch == bb
- && dest->loop_father->header == dest)
- dest->loop_father->latch = new_bb;
+ loop_p loop = find_common_loop (bb->loop_father, dest->loop_father);
+ add_bb_to_loop (new_bb, loop);
+ if (loop->latch == bb
+ && loop->header == dest)
+ loop->latch = new_bb;
new_edge = make_edge (new_bb, dest, 0);
new_edge->probability = REG_BR_PROB_BASE;
new_edge->count = new_bb->count;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 79bb197..e40a3ed 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2017-05-30 Richard Biener <rguenther@suse.de>
+
+ PR middle-end/80901
+ * gcc.dg/torture/pr80901.c: New testcase.
+
2017-05-30 Robin Dapp <rdapp@linux.vnet.ibm.com>
* gcc.target/s390/vector/vec-nopeel-2.c: New test.
diff --git a/gcc/testsuite/gcc.dg/torture/pr80901.c b/gcc/testsuite/gcc.dg/torture/pr80901.c
new file mode 100644
index 0000000..635d939
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr80901.c
@@ -0,0 +1,32 @@
+/* { dg-do compile } */
+
+int a, b, c, d;
+
+int fn1 ()
+{
+ int f;
+ if (d)
+ while (c)
+ {
+ for (f = 0; f < 1; f++)
+ {
+ int g[70] = { 0 };
+ if (b)
+ ;
+ else
+ {
+ int h = !b;
+ for (; h; h = 1)
+ ;
+ }
+ }
+ return 0;
+ }
+ return a;
+}
+
+int main ()
+{
+ fn1 ();
+ return 0;
+}