optabs.c (no_conflict_move_test): Check if a result of a to-be-moved insn would be...
authorJ"orn Rennecke <joern.rennecke@st.com>
Tue, 27 Sep 2005 21:09:28 +0000 (21:09 +0000)
committerJoern Rennecke <amylaar@gcc.gnu.org>
Tue, 27 Sep 2005 21:09:28 +0000 (22:09 +0100)
* optabs.c (no_conflict_move_test): Check if a result of a
to-be-moved insn would be clobbered by an originally
preceding insn.

From-SVN: r104709

gcc/ChangeLog
gcc/optabs.c

index fd231baa49680d14cfb0550837070e063409bb7a..d1db15ee0910dc0e9cfb0ca91b566629b71ed433 100644 (file)
@@ -1,3 +1,9 @@
+2005-09-27  J"orn Rennecke <joern.rennecke@st.com>
+
+       * optabs.c (no_conflict_move_test): Check if a result of a
+       to-be-moved insn would be clobbered by an originally
+       preceding insn.
+
 2005-09-27  Jeff Law  <law@redhat.com>
 
        * passes.c (init_optimization_passes): Replace copy propagation
index 7ca39167390f074998da687bd55a549645bd4cda..31212cbc007f4056318cc3ad2f6d3c27ec3e0697 100644 (file)
@@ -3026,10 +3026,16 @@ no_conflict_move_test (rtx dest, rtx set, void *p0)
           || (CALL_P (p->first) && (find_reg_fusage (p->first, USE, dest)))
           || reg_used_between_p (dest, p->first, p->insn)
           /* Likewise if this insn depends on a register set by a previous
-             insn in the list.  */
+             insn in the list, or if it sets a result (presumably a hard
+             register) that is set or clobbered by a previous insn.
+             N.B. the modified_*_p (SET_DEST...) tests applied to a MEM
+             SET_DEST perform the former check on the address, and the latter
+             check on the MEM.  */
           || (GET_CODE (set) == SET
               && (modified_in_p (SET_SRC (set), p->first)
-                  || modified_between_p (SET_SRC (set), p->first, p->insn))))
+                  || modified_in_p (SET_DEST (set), p->first)
+                  || modified_between_p (SET_SRC (set), p->first, p->insn)
+                  || modified_between_p (SET_DEST (set), p->first, p->insn))))
     p->must_stay = true;
 }