aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@gcc.gnu.org>1997-01-14 20:35:27 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>1997-01-14 20:35:27 +0000
commit8026ebba9914ccc5526ecd5c848fc14100a1bb69 (patch)
treec957670d0d1dcb2706d41598f4d60259d8f8d956
parentc0560887e8974b500bf3d240f4f9e9d296071f0d (diff)
downloadgcc-8026ebba9914ccc5526ecd5c848fc14100a1bb69.zip
gcc-8026ebba9914ccc5526ecd5c848fc14100a1bb69.tar.gz
gcc-8026ebba9914ccc5526ecd5c848fc14100a1bb69.tar.bz2
Handle more cases when eliminating the FP to the hard FP
From-SVN: r13491
-rw-r--r--gcc/reload1.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/gcc/reload1.c b/gcc/reload1.c
index a102ccb..85ac6f8 100644
--- a/gcc/reload1.c
+++ b/gcc/reload1.c
@@ -1,5 +1,5 @@
/* Reload pseudo regs into hard regs for insns that require hard regs.
- Copyright (C) 1987, 88, 89, 92-5, 1996 Free Software Foundation, Inc.
+ Copyright (C) 1987, 88, 89, 92-6, 1997 Free Software Foundation, Inc.
This file is part of GNU CC.
@@ -3237,12 +3237,29 @@ eliminate_regs_in_insn (insn, replace)
{
rtx src = SET_SRC (old_set);
int offset, ok = 0;
+ rtx prev_insn, prev_set;
if (src == ep->to_rtx)
offset = 0, ok = 1;
else if (GET_CODE (src) == PLUS
&& GET_CODE (XEXP (src, 0)) == CONST_INT)
offset = INTVAL (XEXP (src, 0)), ok = 1;
+ else if ((prev_insn = prev_nonnote_insn (insn)) != 0
+ && (prev_set = single_set (prev_insn)) != 0
+ && rtx_equal_p (SET_DEST (prev_set), src))
+ {
+ src = SET_SRC (prev_set);
+ if (src == ep->to_rtx)
+ offset = 0, ok = 1;
+ else if (GET_CODE (src) == PLUS
+ && GET_CODE (XEXP (src, 0)) == CONST_INT
+ && XEXP (src, 1) == ep->to_rtx)
+ offset = INTVAL (XEXP (src, 0)), ok = 1;
+ else if (GET_CODE (src) == PLUS
+ && GET_CODE (XEXP (src, 1)) == CONST_INT
+ && XEXP (src, 0) == ep->to_rtx)
+ offset = INTVAL (XEXP (src, 1)), ok = 1;
+ }
if (ok)
{