diff options
author | Ulrich Weigand <uweigand@de.ibm.com> | 2002-01-25 20:22:31 +0000 |
---|---|---|
committer | Ulrich Weigand <uweigand@gcc.gnu.org> | 2002-01-25 20:22:31 +0000 |
commit | 75eefe3fe069dc5affd43dd51acfff6c5a974f2d (patch) | |
tree | c8f651042a043ae5af3976029b4e4fe3589fd046 /gcc | |
parent | 5a133afd40b3a39a7d19ac1204d8d9849f671444 (diff) | |
download | gcc-75eefe3fe069dc5affd43dd51acfff6c5a974f2d.zip gcc-75eefe3fe069dc5affd43dd51acfff6c5a974f2d.tar.gz gcc-75eefe3fe069dc5affd43dd51acfff6c5a974f2d.tar.bz2 |
reload1.c (eliminate_regs_in_insn): Recognize frame pointer adjustments even if...
* reload1.c (eliminate_regs_in_insn): Recognize frame pointer
adjustments even if they are implemented by more than two insns.
From-SVN: r49221
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/reload1.c | 52 |
2 files changed, 28 insertions, 29 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 75a1007..bec4e64 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2002-01-25 Ulrich Weigand <uweigand@de.ibm.com> + + * reload1.c (eliminate_regs_in_insn): Recognize frame pointer + adjustments even if they are implemented by more than two insns. + Fri Jan 25 20:43:56 CET 2002 Jan Hubicka <jh@suse.cz> * df.c (df_ref_create, df_ref_record_1, df_ref_record): Kill BB argument. diff --git a/gcc/reload1.c b/gcc/reload1.c index 521e482..5211b5f 100644 --- a/gcc/reload1.c +++ b/gcc/reload1.c @@ -2932,38 +2932,32 @@ eliminate_regs_in_insn (insn, replace) if (ep->from == FRAME_POINTER_REGNUM && ep->to == HARD_FRAME_POINTER_REGNUM) { - rtx src = SET_SRC (old_set); - int offset = 0, 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 - && 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; - else if ((prev_insn = prev_nonnote_insn (insn)) != 0 - && (prev_set = single_set (prev_insn)) != 0 - && rtx_equal_p (SET_DEST (prev_set), src)) + rtx base = SET_SRC (old_set); + rtx base_insn = insn; + int offset = 0; + + while (base != ep->to_rtx) { - 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; + rtx prev_insn, prev_set; + + if (GET_CODE (base) == PLUS + && GET_CODE (XEXP (base, 1)) == CONST_INT) + { + offset += INTVAL (XEXP (base, 1)); + base = XEXP (base, 0); + } + else if ((prev_insn = prev_nonnote_insn (base_insn)) != 0 + && (prev_set = single_set (prev_insn)) != 0 + && rtx_equal_p (SET_DEST (prev_set), base)) + { + base = SET_SRC (prev_set); + base_insn = prev_insn; + } + else + break; } - if (ok) + if (base == ep->to_rtx) { rtx src = plus_constant (ep->to_rtx, offset - ep->offset); |