]> gcc.gnu.org Git - gcc.git/commitdiff
loop.c (strength_reduce): Insert sets of derived givs at every biv increment, even...
authorJ"orn Rennecke <amylaar@cygnus.co.uk>
Wed, 16 Jun 1999 11:46:14 +0000 (11:46 +0000)
committerJoern Rennecke <amylaar@gcc.gnu.org>
Wed, 16 Jun 1999 11:46:14 +0000 (12:46 +0100)
* loop.c (strength_reduce): Insert sets of derived givs at every
biv increment, even if it's the only one.

From-SVN: r27549

gcc/ChangeLog
gcc/loop.c

index 56ff7e7c72940b2f864a0f277012badb09bdfad4..6f050bcedcd11698cb84ac100fe7ca75db2811d5 100644 (file)
@@ -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.
index 80b22a7b26ee500815a91f983c208bbabc757fa4..90720c4ec15bae24f8536cfa8f0f4df6860081de 100644 (file)
@@ -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;
                }
This page took 0.076183 seconds and 5 git commands to generate.