aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorUlrich Weigand <uweigand@de.ibm.com>2002-01-25 20:22:31 +0000
committerUlrich Weigand <uweigand@gcc.gnu.org>2002-01-25 20:22:31 +0000
commit75eefe3fe069dc5affd43dd51acfff6c5a974f2d (patch)
treec8f651042a043ae5af3976029b4e4fe3589fd046 /gcc
parent5a133afd40b3a39a7d19ac1204d8d9849f671444 (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/reload1.c52
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);