diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0e743a2e6888973c3d850b20b9675318f37b11ab..545d9f11c3c28228c06aa5ac27550b5784b1af52 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2003-12-01 Ulrich Weigand <uweigand@de.ibm.com> + + * reload.c (find_reloads_address): Split addresses of type + (plus (plus (reg) (reg)) (const_int)) only if one register + is either a valid base register or else one of the stack + frame related registers (sp/fp/ap). + 2003-12-01 Steven Bosscher <stevenb@suse.de> * function.c (update_epilogue_consts): Don't use PARAMS. diff --git a/gcc/reload.c b/gcc/reload.c index 33167eaed2f7e4adb86b600e6e9e1ee58ce363eb..b448ff2d967f87b0bea59190d41b7468fa016840 100644 --- a/gcc/reload.c +++ b/gcc/reload.c @@ -4905,6 +4905,15 @@ find_reloads_address (enum machine_mode mode, rtx *memrefloc, rtx ad, && GET_CODE (XEXP (ad, 0)) == PLUS && GET_CODE (XEXP (XEXP (ad, 0), 0)) == REG && REGNO (XEXP (XEXP (ad, 0), 0)) < FIRST_PSEUDO_REGISTER + && (REG_MODE_OK_FOR_BASE_P (XEXP (XEXP (ad, 0), 0), mode) + || XEXP (XEXP (ad, 0), 0) == frame_pointer_rtx +#if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM + || XEXP (XEXP (ad, 0), 0) == hard_frame_pointer_rtx +#endif +#if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM + || XEXP (XEXP (ad, 0), 0) == arg_pointer_rtx +#endif + || XEXP (XEXP (ad, 0), 0) == stack_pointer_rtx) && ! maybe_memory_address_p (mode, ad, &XEXP (XEXP (ad, 0), 1))) { *loc = ad = gen_rtx_PLUS (GET_MODE (ad), @@ -4924,6 +4933,15 @@ find_reloads_address (enum machine_mode mode, rtx *memrefloc, rtx ad, && GET_CODE (XEXP (ad, 0)) == PLUS && GET_CODE (XEXP (XEXP (ad, 0), 1)) == REG && REGNO (XEXP (XEXP (ad, 0), 1)) < FIRST_PSEUDO_REGISTER + && (REG_MODE_OK_FOR_BASE_P (XEXP (XEXP (ad, 0), 1), mode) + || XEXP (XEXP (ad, 0), 1) == frame_pointer_rtx +#if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM + || XEXP (XEXP (ad, 0), 1) == hard_frame_pointer_rtx +#endif +#if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM + || XEXP (XEXP (ad, 0), 1) == arg_pointer_rtx +#endif + || XEXP (XEXP (ad, 0), 1) == stack_pointer_rtx) && ! maybe_memory_address_p (mode, ad, &XEXP (XEXP (ad, 0), 0))) { *loc = ad = gen_rtx_PLUS (GET_MODE (ad),