diff options
Diffstat (limited to 'gcc/reload.c')
-rw-r--r-- | gcc/reload.c | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/gcc/reload.c b/gcc/reload.c index ee2fa48..d83b1f6 100644 --- a/gcc/reload.c +++ b/gcc/reload.c @@ -4519,7 +4519,7 @@ find_reloads_address (mode, memrefloc, ad, loc, opnum, type, ind_levels, insn) else if (regno < FIRST_PSEUDO_REGISTER && REGNO_MODE_OK_FOR_BASE_P (regno, mode) - && ! regno_clobbered_p (regno, this_insn)) + && ! regno_clobbered_p (regno, this_insn, mode)) return 0; /* If we do not have one of the cases above, we must do the reload. */ @@ -5427,7 +5427,7 @@ find_reloads_address_1 (mode, x, context, loc, opnum, type, ind_levels, insn) in this insn, reload it into some other register to be safe. The CLOBBER is supposed to make the register unavailable from before this insn to after it. */ - if (regno_clobbered_p (regno, this_insn)) + if (regno_clobbered_p (regno, this_insn, GET_MODE (x))) { push_reload (x, NULL_RTX, loc, NULL_PTR, (context ? INDEX_REG_CLASS : BASE_REG_CLASS), @@ -6544,13 +6544,21 @@ find_inc_amount (x, inced) /* Return 1 if register REGNO is the subject of a clobber in insn INSN. */ int -regno_clobbered_p (regno, insn) +regno_clobbered_p (regno, insn, mode) unsigned int regno; rtx insn; + enum machine_mode mode; { + int nregs = HARD_REGNO_NREGS (regno, mode); + int endregno = regno + nregs; + if (GET_CODE (PATTERN (insn)) == CLOBBER && GET_CODE (XEXP (PATTERN (insn), 0)) == REG) - return REGNO (XEXP (PATTERN (insn), 0)) == regno; + { + int test = REGNO (XEXP (PATTERN (insn), 0)); + + return regno >= test && test < endregno; + } if (GET_CODE (PATTERN (insn)) == PARALLEL) { @@ -6559,9 +6567,13 @@ regno_clobbered_p (regno, insn) for (; i >= 0; i--) { rtx elt = XVECEXP (PATTERN (insn), 0, i); - if (GET_CODE (elt) == CLOBBER && GET_CODE (XEXP (elt, 0)) == REG - && REGNO (XEXP (elt, 0)) == regno) - return 1; + if (GET_CODE (elt) == CLOBBER && GET_CODE (XEXP (elt, 0)) == REG) + { + int test = REGNO (XEXP (elt, 0)); + + if (regno >= test && test < endregno) + return 1; + } } } |