aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@libertysurf.fr>2003-07-21 18:52:38 +0200
committerMark Mitchell <mmitchel@gcc.gnu.org>2003-07-21 16:52:38 +0000
commitbbda30a4aae700f963fd164edbeac4f4688bf2a0 (patch)
tree012a183ac137fb8f46d0f240aabffa82cb691b8e /gcc
parent9ef2dd1fad3a6e04366c236a29d4377812e4bccd (diff)
downloadgcc-bbda30a4aae700f963fd164edbeac4f4688bf2a0.zip
gcc-bbda30a4aae700f963fd164edbeac4f4688bf2a0.tar.gz
gcc-bbda30a4aae700f963fd164edbeac4f4688bf2a0.tar.bz2
re PR rtl-optimization/11536 ([strength-reduce] -O2 optimalization produces wrong code)
PR optimization/11536 * unroll.c (loop_iterations): Do not replace a register holding the final value by its equivalent before the loop if it is not invariant. PR optimization/11536 * gcc.dg/20030721-1.c: New test. From-SVN: r69635
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/20030721-1.c41
-rw-r--r--gcc/unroll.c2
4 files changed, 54 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b120c15..180fc69 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2003-07-17 Eric Botcazou <ebotcazou@libertysurf.fr>
+
+ PR optimization/11536
+ * unroll.c (loop_iterations): Do not replace a register holding
+ the final value by its equivalent before the loop if it is not
+ invariant.
+
2003-07-21 Dave Fluri <dave.fluri@onlink.net>
* doc/extend.texi: Fixes to spelling, grammar, and diction.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 96b04a5..1cfa936 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2003-07-21 Eric Botcazou <ebotcazou@libertysurf.fr>
+
+ PR optimization/11536
+ * gcc.dg/20030721-1.c: New test.
+
2003-07-19 Mark Mitchell <mark@codesourcery.com>
PR c++/11546
diff --git a/gcc/testsuite/gcc.dg/20030721-1.c b/gcc/testsuite/gcc.dg/20030721-1.c
new file mode 100644
index 0000000..5e8ed0b
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/20030721-1.c
@@ -0,0 +1,41 @@
+/* { dg-options "-O2" } */
+/* PR optimization/11536 */
+/* Origin: samal@kam.mff.cuni.cz <samal@kam.mff.cuni.cz> */
+/* Testcase by Andrew Pinski <pinskia@physics.uc.edu> */
+
+/* Verify that the loop optimizer doesn't use moving targets
+ to calculate the number of iterations of a loop. */
+
+extern void abort(void);
+
+void foo(int) __attribute__((__noinline__));
+
+void foo(int i)
+{
+ abort();
+}
+
+int main()
+{
+ int i;
+ int first= 0;
+ int last= 0;
+
+ while (last<3) {
+ last = first;
+
+ while (first<=last) {
+ first++;
+
+ for (i=0;i<3;i++)
+ last++;
+
+ if (last>10)
+ return 0;
+ }
+
+ foo(first);
+ }
+
+ return 0;
+}
diff --git a/gcc/unroll.c b/gcc/unroll.c
index 62b8152..1c66b13 100644
--- a/gcc/unroll.c
+++ b/gcc/unroll.c
@@ -3618,7 +3618,7 @@ loop_iterations (struct loop *loop)
if (find_common_reg_term (temp, reg2))
initial_value = temp;
- else
+ else if (loop_invariant_p (loop, reg2))
{
/* Find what reg2 is equivalent to. Hopefully it will
either be reg1 or reg1 plus a constant. Let's ignore