aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBernd Schmidt <bernds@cygnus.co.uk>1999-07-09 03:34:26 +0000
committerBernd Schmidt <crux@gcc.gnu.org>1999-07-09 03:34:26 +0000
commit22b452e755aa611d40f7c9317686ce50ce5c6fff (patch)
tree5d92a5c589eaa63f98f1803b49166ef740fe7116
parent4470c3998c2c00f7e6cff775cb2c6e332610ae8d (diff)
downloadgcc-22b452e755aa611d40f7c9317686ce50ce5c6fff.zip
gcc-22b452e755aa611d40f7c9317686ce50ce5c6fff.tar.gz
gcc-22b452e755aa611d40f7c9317686ce50ce5c6fff.tar.bz2
loop.c (check_dbra_loop): When reversing a loop...
* 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. From-SVN: r28043
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/loop.c34
2 files changed, 40 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7703a24..4632ffc 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+Fri Jul 9 10:48:28 1999 Bernd Schmidt <bernds@cygnus.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.
+
Fri Jul 9 03:51:52 1999 Jeffrey A Law (law@cygnus.com)
* version.c: Drop "gcc-" prefix from version #.
diff --git a/gcc/loop.c b/gcc/loop.c
index ef64fd0..db50a18 100644
--- a/gcc/loop.c
+++ b/gcc/loop.c
@@ -8107,6 +8107,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
+ || 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. */