aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJ"orn Rennecke <amylaar@cygnus.co.uk>2000-03-03 14:20:28 +0000
committerJoern Rennecke <amylaar@gcc.gnu.org>2000-03-03 14:20:28 +0000
commit6ce7e0f931732023c34bf3e467e79770edc8307a (patch)
tree623d4e9845aae5662a37e5da4a7ef1e2631dd37c /gcc
parent661cb0b76f2c83d6cc45e063cd55dc74fb823bb7 (diff)
downloadgcc-6ce7e0f931732023c34bf3e467e79770edc8307a.zip
gcc-6ce7e0f931732023c34bf3e467e79770edc8307a.tar.gz
gcc-6ce7e0f931732023c34bf3e467e79770edc8307a.tar.bz2
reload1.c (reload_combine_note_use): Handle return register USEs.
* reload1.c (reload_combine_note_use): Handle return register USEs. REG case: Handle multi-hard-register hard regs. From-SVN: r32310
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/reload1.c26
2 files changed, 31 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2517dcb..1d51311 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+Fri Mar 3 12:49:28 2000 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * reload1.c (reload_combine_note_use): Handle return register USEs.
+ REG case: Handle multi-hard-register hard regs.
+
Fri Mar 3 07:38:34 2000 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* md.texi: Document use of '*' in insn pattern name.
diff --git a/gcc/reload1.c b/gcc/reload1.c
index c4fe640..e91cf6f 100644
--- a/gcc/reload1.c
+++ b/gcc/reload1.c
@@ -9253,6 +9253,21 @@ reload_combine_note_use (xp, insn)
}
break;
+ case USE:
+ /* If this is the USE of a return value, we can't change it. */
+ if (GET_CODE (XEXP (x, 0)) == REG && REG_FUNCTION_VALUE_P (XEXP (x, 0)))
+ {
+ /* Mark the return register as used in an unknown fashion. */
+ rtx reg = XEXP (x, 0);
+ int regno = REGNO (reg);
+ int nregs = HARD_REGNO_NREGS (regno, GET_MODE (reg));
+
+ while (--nregs >= 0)
+ reg_state[regno + nregs].use_index = -1;
+ return;
+ }
+ break;
+
case CLOBBER:
if (GET_CODE (SET_DEST (x)) == REG)
return;
@@ -9269,12 +9284,23 @@ reload_combine_note_use (xp, insn)
{
int regno = REGNO (x);
int use_index;
+ int nregs;
/* Some spurious USEs of pseudo registers might remain.
Just ignore them. */
if (regno >= FIRST_PSEUDO_REGISTER)
return;
+ nregs = HARD_REGNO_NREGS (regno, GET_MODE (x));
+
+ /* We can't substitute into multi-hard-reg uses. */
+ if (nregs > 1)
+ {
+ while (--nregs >= 0)
+ reg_state[regno + nregs].use_index = -1;
+ return;
+ }
+
/* If this register is already used in some unknown fashion, we
can't do anything.
If we decrement the index from zero to -1, we can't store more