aboutsummaryrefslogtreecommitdiff
path: root/gcc/reload.c
diff options
context:
space:
mode:
authorJeff Law <law@redhat.com>2011-02-02 09:52:21 -0700
committerJeff Law <law@gcc.gnu.org>2011-02-02 09:52:21 -0700
commit2a737389e462c4d8566cf544365195311e17d614 (patch)
tree58fc51ec9cdef4e637114018446c740238f15bf1 /gcc/reload.c
parent9dac82c4dac4a4e47756c5a16067672339804cf0 (diff)
downloadgcc-2a737389e462c4d8566cf544365195311e17d614.zip
gcc-2a737389e462c4d8566cf544365195311e17d614.tar.gz
gcc-2a737389e462c4d8566cf544365195311e17d614.tar.bz2
re PR target/47543 (ICE: in extract_insn, at recog.c:2109 when building zlib)
PR middle-end/47543 * reload.c (find_reloads_address): Handle reg+d address where both components are invalid by reloading the entire address. From-SVN: r169533
Diffstat (limited to 'gcc/reload.c')
-rw-r--r--gcc/reload.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/gcc/reload.c b/gcc/reload.c
index aa9e68e..714355c3 100644
--- a/gcc/reload.c
+++ b/gcc/reload.c
@@ -5066,8 +5066,13 @@ find_reloads_address (enum machine_mode mode, rtx *memrefloc, rtx ad,
&& REG_P (XEXP (ad, 0))
&& REGNO (XEXP (ad, 0)) < FIRST_PSEUDO_REGISTER
&& CONST_INT_P (XEXP (ad, 1))
- && regno_ok_for_base_p (REGNO (XEXP (ad, 0)), mode, PLUS,
- CONST_INT))
+ && (regno_ok_for_base_p (REGNO (XEXP (ad, 0)), mode, PLUS,
+ CONST_INT)
+ /* Similarly, if we were to reload the base register and the
+ mem+offset address is still invalid, then we want to reload
+ the whole address, not just the base register. */
+ || ! maybe_memory_address_addr_space_p
+ (mode, ad, as, &(XEXP (ad, 0)))))
{
/* Unshare the MEM rtx so we can safely alter it. */
@@ -5079,7 +5084,9 @@ find_reloads_address (enum machine_mode mode, rtx *memrefloc, rtx ad,
loc = &XEXP (*loc, 0);
}
- if (double_reg_address_ok)
+ if (double_reg_address_ok
+ && regno_ok_for_base_p (REGNO (XEXP (ad, 0)), mode,
+ PLUS, CONST_INT))
{
/* Unshare the sum as well. */
*loc = ad = copy_rtx (ad);