diff options
author | Eric Botcazou <ebotcazou@libertysurf.fr> | 2003-07-21 18:52:38 +0200 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 2003-07-21 16:52:38 +0000 |
commit | bbda30a4aae700f963fd164edbeac4f4688bf2a0 (patch) | |
tree | 012a183ac137fb8f46d0f240aabffa82cb691b8e /gcc | |
parent | 9ef2dd1fad3a6e04366c236a29d4377812e4bccd (diff) | |
download | gcc-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/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/20030721-1.c | 41 | ||||
-rw-r--r-- | gcc/unroll.c | 2 |
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 |