summaryrefslogtreecommitdiff
path: root/gcc/reload.c
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2002-01-13 14:57:29 -0800
committerRichard Henderson <rth@gcc.gnu.org>2002-01-13 14:57:29 -0800
commit02a10130ff7e8ba65646253a4fea78aeef6ab5c2 (patch)
treecdb00d7ae5e8bd6bc909fd17b7eca220c7d0c493 /gcc/reload.c
parent332a685b951775219ed01e637d4856d4c6f04c8b (diff)
downloadgcc-02a10130ff7e8ba65646253a4fea78aeef6ab5c2.tar.gz
reload.c (find_reloads): Use a hard reg destination as reload reg for an input reload of the source.
* reload.c (find_reloads): Use a hard reg destination as reload reg for an input reload of the source. From-SVN: r48822
Diffstat (limited to 'gcc/reload.c')
-rw-r--r--gcc/reload.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/gcc/reload.c b/gcc/reload.c
index 39960509af9..8f82c9341f5 100644
--- a/gcc/reload.c
+++ b/gcc/reload.c
@@ -4241,6 +4241,23 @@ find_reloads (insn, replace, ind_levels, live_known, reload_reg_p)
rld[i].nregs = CLASS_MAX_NREGS (rld[i].class, rld[i].mode);
}
+ /* Special case a simple move with an input reload and a
+ destination of a hard reg, if the hard reg is ok, use it. */
+ for (i = 0; i < n_reloads; i++)
+ if (rld[i].when_needed == RELOAD_FOR_INPUT
+ && GET_CODE (PATTERN (insn)) == SET
+ && GET_CODE (SET_DEST (PATTERN (insn))) == REG
+ && SET_SRC (PATTERN (insn)) == rld[i].in)
+ {
+ rtx dest = SET_DEST (PATTERN (insn));
+ unsigned int regno = REGNO (dest);
+
+ if (regno < FIRST_PSEUDO_REGISTER
+ && TEST_HARD_REG_BIT (reg_class_contents[rld[i].class], regno)
+ && HARD_REGNO_MODE_OK (regno, rld[i].mode))
+ rld[i].reg_rtx = dest;
+ }
+
return retval;
}