(can_combine_p): Allow an insn with a REG_EQUIV note that reads memory
authorRichard Kenner <kenner@gcc.gnu.org>
Sat, 2 Oct 1993 18:10:47 +0000 (14:10 -0400)
committerRichard Kenner <kenner@gcc.gnu.org>
Sat, 2 Oct 1993 18:10:47 +0000 (14:10 -0400)
to be moved past an insn that writes memory.

From-SVN: r5562

gcc/combine.c

index 45d572a7addcfd35f5e3b5e3d926a26716a892e2..c50265681b0c40456d108e7a54ed5ff6cc20e664 100644 (file)
@@ -855,10 +855,14 @@ can_combine_p (insn, i3, pred, succ, pdest, psrc)
         If the insns are adjacent, a use can't cross a set even though we
         think it might (this can happen for a sequence of insns each setting
         the same destination; reg_last_set of that register might point to
-        a NOTE).  Also, don't move a volatile asm or UNSPEC_VOLATILE across
-        any other insns.  */
+        a NOTE).  If INSN has a REG_EQUIV note, the register is always
+        equivalent to the memory so the substitution is valid even if there
+        are intervening stores.  Also, don't move a volatile asm or
+        UNSPEC_VOLATILE across any other insns.  */
       || (! all_adjacent
-         && (use_crosses_set_p (src, INSN_CUID (insn))
+         && (((GET_CODE (src) != MEM
+               || ! find_reg_note (insn, REG_EQUIV, src))
+              && use_crosses_set_p (src, INSN_CUID (insn)))
              || (GET_CODE (src) == ASM_OPERANDS && MEM_VOLATILE_P (src))
              || GET_CODE (src) == UNSPEC_VOLATILE))
       /* If there is a REG_NO_CONFLICT note for DEST in I3 or SUCC, we get