diff options
author | J"orn Rennecke <amylaar@cygnus.co.uk> | 1999-06-16 11:46:14 +0000 |
---|---|---|
committer | Joern Rennecke <amylaar@gcc.gnu.org> | 1999-06-16 12:46:14 +0100 |
commit | 1b786838b14ff6ff0f8afd211275baaa1e76f4d6 (patch) | |
tree | 8b724e498ebb99933897fa2187e3f932587d6869 | |
parent | 4e61a9695a2292d4ba89a32a198606ef8bdced35 (diff) | |
download | gcc-1b786838b14ff6ff0f8afd211275baaa1e76f4d6.zip gcc-1b786838b14ff6ff0f8afd211275baaa1e76f4d6.tar.gz gcc-1b786838b14ff6ff0f8afd211275baaa1e76f4d6.tar.bz2 |
loop.c (strength_reduce): Insert sets of derived givs at every biv increment, even if it's the only one.
* loop.c (strength_reduce): Insert sets of derived givs at every
biv increment, even if it's the only one.
From-SVN: r27549
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/loop.c | 36 |
2 files changed, 27 insertions, 14 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 56ff7e7..6f050bc 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +Wed Jun 16 19:44:33 1999 J"orn Rennecke <amylaar@cygnus.co.uk> + + * loop.c (strength_reduce): Insert sets of derived givs at every + biv increment, even if it's the only one. + Wed Jun 16 10:33:02 1999 Jason Merrill <jason@yorick.cygnus.com> * dwarfout.c (add_incomplete_type): New fn. @@ -4768,21 +4768,29 @@ strength_reduce (scan_start, end, loop_top, insn_count, = replace_rtx (PATTERN (v->insn), d->dest_reg, d->new_reg); PATTERN (v->insn) = replace_rtx (PATTERN (v->insn), v->dest_reg, v->new_reg); - if (bl->biv_count != 1) + /* For each place where the biv is incremented, add an + insn to set the new, reduced reg for the giv. + We used to do this only for biv_count != 1, but + this fails when there is a giv after a single biv + increment, e.g. when the last giv was expressed as + pre-decrement. */ + for (tv = bl->biv; tv; tv = tv->next_iv) { - /* For each place where the biv is incremented, add an - insn to set the new, reduced reg for the giv. */ - for (tv = bl->biv; tv; tv = tv->next_iv) - { - /* We always emit reduced giv increments before the - biv increment when bl->biv_count != 1. So by - emitting the add insns for derived givs after the - biv increment, they pick up the updated value of - the reduced giv. */ - emit_insn_after (copy_rtx (PATTERN (v->insn)), - tv->insn); - - } + /* We always emit reduced giv increments before the + biv increment when bl->biv_count != 1. So by + emitting the add insns for derived givs after the + biv increment, they pick up the updated value of + the reduced giv. + If the reduced giv is processed with + auto_inc_opt == 1, then it is incremented earlier + than the biv, hence we'll still pick up the right + value. + If it's processed with auto_inc_opt == -1, + that implies that the biv increment is before the + first reduced giv's use. The derived giv's lifetime + is after the reduced giv's lifetime, hence in this + case, the biv increment doesn't matter. */ + emit_insn_after (copy_rtx (PATTERN (v->insn)), tv->insn); } continue; } |