aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJ"orn Rennecke <amylaar@cygnus.co.uk>1999-06-16 11:46:14 +0000
committerJoern Rennecke <amylaar@gcc.gnu.org>1999-06-16 12:46:14 +0100
commit1b786838b14ff6ff0f8afd211275baaa1e76f4d6 (patch)
tree8b724e498ebb99933897fa2187e3f932587d6869
parent4e61a9695a2292d4ba89a32a198606ef8bdced35 (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/loop.c36
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.
diff --git a/gcc/loop.c b/gcc/loop.c
index 80b22a7..90720c4 100644
--- a/gcc/loop.c
+++ b/gcc/loop.c
@@ -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;
}