diff options
author | Ian Lance Taylor <ian@gcc.gnu.org> | 1997-01-14 20:35:27 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 1997-01-14 20:35:27 +0000 |
commit | 8026ebba9914ccc5526ecd5c848fc14100a1bb69 (patch) | |
tree | c957670d0d1dcb2706d41598f4d60259d8f8d956 | |
parent | c0560887e8974b500bf3d240f4f9e9d296071f0d (diff) | |
download | gcc-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.c | 19 |
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) { |