summaryrefslogtreecommitdiff
path: root/gcc/reorg.c
diff options
context:
space:
mode:
authorhp <hp@138bc75d-0d04-0410-961f-82ee72b054a4>2003-04-08 20:16:54 +0000
committerhp <hp@138bc75d-0d04-0410-961f-82ee72b054a4>2003-04-08 20:16:54 +0000
commit973c73e7ecca14d52d4f7772169d5e9f8e7ff933 (patch)
tree86f219c53777bb206099b1ca39b7026fb2c5cbe4 /gcc/reorg.c
parenta86366382058dd0a02a19e987a1af0286168db71 (diff)
downloadgcc-973c73e7ecca14d52d4f7772169d5e9f8e7ff933.tar.gz
* 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@65381 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/reorg.c')
-rw-r--r--gcc/reorg.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/gcc/reorg.c b/gcc/reorg.c
index e3859a6db41..161e7b03ab2 100644
--- a/gcc/reorg.c
+++ b/gcc/reorg.c
@@ -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);