aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorZdenek Dvorak <dvorakz@suse.cz>2006-05-09 11:10:15 +0200
committerZdenek Dvorak <rakdver@gcc.gnu.org>2006-05-09 09:10:15 +0000
commit2c790a28841f2a404f1f6e96d07041138583788a (patch)
treeaabd0f9c50090c14bb5730b3f5bec41c2e9be980 /gcc
parentec4fc7edafe1c67b09d5462efe3beb8bcc1e6732 (diff)
downloadgcc-2c790a28841f2a404f1f6e96d07041138583788a.zip
gcc-2c790a28841f2a404f1f6e96d07041138583788a.tar.gz
gcc-2c790a28841f2a404f1f6e96d07041138583788a.tar.bz2
re PR rtl-optimization/27335 (ICE in get_loop_body)
PR rtl-optimization/27335 * loop-unroll.c (peel_loops_completely): Use loops->parray to walk the loops. * gcc.dg/pr27335.c: New test. From-SVN: r113648
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/loop-unroll.c22
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr27335.c27
4 files changed, 45 insertions, 15 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d245c38..c1896d9 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2006-05-09 Zdenek Dvorak <dvorakz@suse.cz>
+
+ PR rtl-optimization/27335
+ * loop-unroll.c (peel_loops_completely): Use loops->parray to walk the
+ loops.
+
2006-05-08 Chao-ying Fu <fu@mips.com>
Richard Sandiford <richard@codesourcery.com>
diff --git a/gcc/loop-unroll.c b/gcc/loop-unroll.c
index 5c28eaf..156f688 100644
--- a/gcc/loop-unroll.c
+++ b/gcc/loop-unroll.c
@@ -233,22 +233,15 @@ loop_exit_at_end_p (struct loop *loop)
static void
peel_loops_completely (struct loops *loops, int flags)
{
- struct loop *loop, *next;
-
- loop = loops->tree_root;
- while (loop->inner)
- loop = loop->inner;
+ struct loop *loop;
+ unsigned i;
- while (loop != loops->tree_root)
+ /* Scan the loops, the inner ones first. */
+ for (i = loops->num - 1; i > 0; i--)
{
- if (loop->next)
- {
- next = loop->next;
- while (next->inner)
- next = next->inner;
- }
- else
- next = loop->outer;
+ loop = loops->parray[i];
+ if (!loop)
+ continue;
loop->lpt_decision.decision = LPT_NONE;
@@ -271,7 +264,6 @@ peel_loops_completely (struct loops *loops, int flags)
verify_loop_structure (loops);
#endif
}
- loop = next;
}
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 32927ff..a3f49f7 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2006-05-09 Zdenek Dvorak <dvorakz@suse.cz>
+
+ PR rtl-optimization/27335
+ * gcc.dg/pr27335.c: New test.
+
2006-05-06 Richard Sandiford <richard@codesourcery.com>
* gcc.target/mips/mips-ps-5.c: New file.
diff --git a/gcc/testsuite/gcc.dg/pr27335.c b/gcc/testsuite/gcc.dg/pr27335.c
new file mode 100644
index 0000000..d08db30
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr27335.c
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -funroll-loops" } */
+
+extern void bar () __attribute__ ((noreturn));
+
+inline double
+baz (double *x, unsigned int y)
+{
+ if (y >= 6)
+ bar ();
+ return x[y];
+}
+
+double *a, *b;
+
+void
+foo ()
+{
+ unsigned int r, s, t;
+
+ for (r = 0; r < 2; r++)
+ for (t = 0; t < 2; t++)
+ {
+ for (s = 0; s < 3; s++)
+ b[r * 2 + t] += baz (a, 3 * s + t);
+ }
+}