From 0422e94065d77179d610740f8d27dc6fb31685ae Mon Sep 17 00:00:00 2001
From: Ulrich Weigand <uweigand@de.ibm.com>
Date: Mon, 1 Dec 2003 16:17:32 +0000
Subject: [PATCH] reload.c (find_reloads_address): Split addresses of type
 (plus (plus (reg) (reg)) (const_int)) only if...

	* 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).

From-SVN: r74107
---
 gcc/ChangeLog |  7 +++++++
 gcc/reload.c  | 18 ++++++++++++++++++
 2 files changed, 25 insertions(+)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 0e743a2e6888..545d9f11c3c2 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 33167eaed2f7..b448ff2d967f 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),
-- 
GitLab