aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZdenek Dvorak <ook@ucw.cz>2011-03-05 15:28:14 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2011-03-05 15:28:14 +0100
commit634ee309bb7a6ece7b02ccb86aec0061d7e5e444 (patch)
tree8380a4d0ef4aacbc3059d789c8ee2360c0c3d0fc
parent6fe471c8ca8eddcfa7ed64b290e24758bbca669e (diff)
downloadgcc-634ee309bb7a6ece7b02ccb86aec0061d7e5e444.zip
gcc-634ee309bb7a6ece7b02ccb86aec0061d7e5e444.tar.gz
gcc-634ee309bb7a6ece7b02ccb86aec0061d7e5e444.tar.bz2
re PR rtl-optimization/47899 (ICE in get_loop_body, at cfgloop.c:831)
PR rtl-optimization/47899 * cfgloopmanip.c (fix_bb_placements): Fix first argument to flow_loop_nested_p when moving the loop upward. * gcc.dg/pr47899.c: New test. From-SVN: r170699
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/cfgloopmanip.c13
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/gcc.dg/pr47899.c26
4 files changed, 44 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7a723c8..9fd15c4 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2011-03-05 Zdenek Dvorak <ook@ucw.cz>
+
+ PR rtl-optimization/47899
+ * cfgloopmanip.c (fix_bb_placements): Fix first argument
+ to flow_loop_nested_p when moving the loop upward.
+
2011-03-05 Richard Earnshaw <rearnsha@arm.com>
PR target/47719
diff --git a/gcc/cfgloopmanip.c b/gcc/cfgloopmanip.c
index aa9ab66..3802f9c 100644
--- a/gcc/cfgloopmanip.c
+++ b/gcc/cfgloopmanip.c
@@ -1,5 +1,5 @@
/* Loop manipulation code for GNU compiler.
- Copyright (C) 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010
+ Copyright (C) 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010, 2011
Free Software Foundation, Inc.
This file is part of GCC.
@@ -174,7 +174,7 @@ fix_bb_placements (basic_block from,
{
sbitmap in_queue;
basic_block *queue, *qtop, *qbeg, *qend;
- struct loop *base_loop;
+ struct loop *base_loop, *target_loop;
edge e;
/* We pass through blocks back-reachable from FROM, testing whether some
@@ -214,12 +214,14 @@ fix_bb_placements (basic_block from,
/* Subloop header, maybe move the loop upward. */
if (!fix_loop_placement (from->loop_father))
continue;
+ target_loop = loop_outer (from->loop_father);
}
else
{
/* Ordinary basic block. */
if (!fix_bb_placement (from))
continue;
+ target_loop = from->loop_father;
}
FOR_EACH_EDGE (e, ei, from->succs)
@@ -248,9 +250,12 @@ fix_bb_placements (basic_block from,
&& (nca == base_loop
|| nca != pred->loop_father))
pred = pred->loop_father->header;
- else if (!flow_loop_nested_p (from->loop_father, pred->loop_father))
+ else if (!flow_loop_nested_p (target_loop, pred->loop_father))
{
- /* No point in processing it. */
+ /* If PRED is already higher in the loop hierarchy than the
+ TARGET_LOOP to that we moved FROM, the change of the position
+ of FROM does not affect the position of PRED, so there is no
+ point in processing it. */
continue;
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 8b09c99..6edf8e2 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,8 @@
2011-03-05 Jakub Jelinek <jakub@redhat.com>
+ PR rtl-optimization/47899
+ * gcc.dg/pr47899.c: New test.
+
* gcc.dg/torture/pr47968.c: Ignore warnings.
PR tree-optimization/47967
diff --git a/gcc/testsuite/gcc.dg/pr47899.c b/gcc/testsuite/gcc.dg/pr47899.c
new file mode 100644
index 0000000..c83bb85
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr47899.c
@@ -0,0 +1,26 @@
+/* PR rtl-optimization/47899 */
+/* { dg-do compile } */
+/* { dg-options "-O -funroll-loops" } */
+
+extern unsigned int a, b, c;
+extern int d;
+
+static int
+foo (void)
+{
+lab:
+ if (b)
+ for (d = 0; d >= 0; d--)
+ if (a || c)
+ for (; c; c++)
+ ;
+ else
+ goto lab;
+}
+
+int
+main ()
+{
+ foo ();
+ return 0;
+}