From 79ed0259864de6cf4149637ce03be376a4d6a353 Mon Sep 17 00:00:00 2001 From: uweigand Date: Fri, 25 Jan 2002 20:22:31 +0000 Subject: [PATCH] * reload1.c (eliminate_regs_in_insn): Recognize frame pointer adjustments even if they are implemented by more than two insns. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@49221 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 5 +++++ 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 + + * 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 * 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); -- 2.7.4