OSDN Git Service

* reload.c (find_reloads_address): Split addresses of type
authoruweigand <uweigand@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 1 Dec 2003 16:17:32 +0000 (16:17 +0000)
committeruweigand <uweigand@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 1 Dec 2003 16:17:32 +0000 (16:17 +0000)
(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).

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@74107 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/reload.c

index 0e743a2..545d9f1 100644 (file)
@@ -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.
index 33167ea..b448ff2 100644 (file)
@@ -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),