OSDN Git Service

* reorg.c (fill_slots_from_thread): When considering changing the
authorhp <hp@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 8 Apr 2003 20:16:54 +0000 (20:16 +0000)
committerhp <hp@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 8 Apr 2003 20:16:54 +0000 (20:16 +0000)
insn following a reg-to-reg copy insn to use the source reg of the
copy, bail out if there's overlap between the registers.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@65381 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/reorg.c

index 7533314..b0f45f6 100644 (file)
@@ -1,3 +1,9 @@
+2003-04-08  Hans-Peter Nilsson  <hp@axis.com>
+
+       * reorg.c (fill_slots_from_thread): When considering changing the
+       insn following a reg-to-reg copy insn to use the source reg of the
+       copy, bail out if there's overlap between the registers.
+
 2003-04-08  Zdenek Dvorak  <rakdver@atrey.karlin.mff.cuni.cz>
 
        * function.c (postponed_insns): New.
index e3859a6..161e7b0 100644 (file)
@@ -2813,11 +2813,13 @@ fill_slots_from_thread (insn, condition, thread, opposite_thread, likely,
         that would make the replacement into the insn invalid.  We also can't
         do this if it modifies our source, because it might be an earlyclobber
         operand.  This latter test also prevents updating the contents of
-        a PRE_INC.  */
+        a PRE_INC.  We also can't do this if there's overlap of source and
+        destination.  Overlap may happen for larger-than-register-size modes.  */
 
       if (GET_CODE (trial) == INSN && GET_CODE (pat) == SET
          && GET_CODE (SET_SRC (pat)) == REG
-         && GET_CODE (SET_DEST (pat)) == REG)
+         && GET_CODE (SET_DEST (pat)) == REG
+         && !reg_overlap_mentioned_p (SET_DEST (pat), SET_SRC (pat)))
        {
          rtx next = next_nonnote_insn (trial);