]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Backport a change to the 2.95 branch
authorBernd Schmidt <bernds@redhat.co.uk>
Thu, 30 Nov 2000 13:01:48 +0000 (13:01 +0000)
committerBernd Schmidt <bernds@gcc.gnu.org>
Thu, 30 Nov 2000 13:01:48 +0000 (13:01 +0000)
From-SVN: r37889

gcc/ChangeLog
gcc/loop.c

index 91456471f256fcc9aa2aea14dc7571528bc87ef5..8082886f767036a7f3482db9f0b0327cf5eefa78 100644 (file)
@@ -1,5 +1,10 @@
 2000-11-30  Bernd Schmidt  <bernds@redhat.co.uk>
 
+       Fri Jul  9 10:48:28 1999  Bernd Schmidt  <bernds@redhat.co.uk>
+       * loop.c (check_dbra_loop): When reversing a loop, delete all
+       REG_EQUAL notes referencing the reversed biv except those which are
+       for a giv based on it.
+
        2000-11-24  Bernd Schmidt  <bernds@redhat.co.uk>
        * reload1.c (conflicts_with_override): New function.
        (emit_input_reload_insns): Use it to tighten test for validity
index 497ac369c2b37a25eadc1063bef7685436677c35..1f6841d5d8d19994ff08d14a0e30ea19346554d2 100644 (file)
@@ -8155,6 +8155,40 @@ check_dbra_loop (loop_end, insn_count, loop_start, loop_info)
                  bl->nonneg = 1;
                }
 
+             /* No insn may reference both the reversed and another biv or it
+                will fail (see comment near the top of the loop reversal
+                code).
+                Earlier on, we have verified that the biv has no use except
+                counting, or it is the only biv in this function.
+                However, the code that computes no_use_except_counting does
+                not verify reg notes.  It's possible to have an insn that
+                references another biv, and has a REG_EQUAL note with an
+                expression based on the reversed biv.  To avoid this case,
+                remove all REG_EQUAL notes based on the reversed biv
+                here.  */
+             for (p = loop_start; p != loop_end; p = NEXT_INSN (p))
+               if (GET_RTX_CLASS (GET_CODE (p)) == 'i')
+                 {
+                   rtx *pnote;
+                   rtx set = single_set (p);
+                   /* If this is a set of a GIV based on the reversed biv, any
+                      REG_EQUAL notes should still be correct.  */
+                   if (! set
+                       || GET_CODE (SET_DEST (set)) != REG
+                       || (size_t) REGNO (SET_DEST (set)) >= reg_iv_type->num_elements
+                       || REG_IV_TYPE (REGNO (SET_DEST (set))) != GENERAL_INDUCT
+                       || REG_IV_INFO (REGNO (SET_DEST (set)))->src_reg != bl->biv->src_reg)
+                     for (pnote = &REG_NOTES (p); *pnote;)
+                       {
+                         if (REG_NOTE_KIND (*pnote) == REG_EQUAL
+                             && reg_mentioned_p (regno_reg_rtx[bl->regno],
+                                                 XEXP (*pnote, 0)))
+                           *pnote = XEXP (*pnote, 1);
+                         else
+                           pnote = &XEXP (*pnote, 1);
+                       }
+                 }
+
              /* Mark that this biv has been reversed.  Each giv which depends
                 on this biv, and which is also live past the end of the loop
                 will have to be fixed up.  */