aboutsummaryrefslogtreecommitdiff
path: root/gcc/reload.c
diff options
context:
space:
mode:
authorBernd Schmidt <bernds@redhat.co.uk>2000-09-07 11:07:07 +0000
committerBernd Schmidt <crux@gcc.gnu.org>2000-09-07 11:07:07 +0000
commit8441bc30354967518401cd47ff5355cc2e3abbfe (patch)
tree65b445029f288c5e129d33bebd33211ec797ee74 /gcc/reload.c
parentff42776491b30801b8c4f04085761856f38ffc09 (diff)
downloadgcc-8441bc30354967518401cd47ff5355cc2e3abbfe.zip
gcc-8441bc30354967518401cd47ff5355cc2e3abbfe.tar.gz
gcc-8441bc30354967518401cd47ff5355cc2e3abbfe.tar.bz2
Handle multiword modes in regno_clobbered_p
From-SVN: r36233
Diffstat (limited to 'gcc/reload.c')
-rw-r--r--gcc/reload.c26
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;
+ }
}
}