From b3423339d35b592f470183adaf79526bbf45ac3e Mon Sep 17 00:00:00 2001 From: law Date: Tue, 13 Jul 1999 09:48:04 +0000 Subject: [PATCH] * rs6000.c (find_addr_reg): Do not select r0 as an address register. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@28084 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 5 +++++ gcc/config/rs6000/rs6000.c | 14 ++++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a356b64b56e..423cc0d9333 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +Tue Jul 13 10:45:58 1999 Jeffrey A Law (law@cygnus.com) + + * rs6000.c (find_addr_reg): Do not select r0 as an address + register. + Tue Jul 13 00:46:18 1999 Philippe De Muyter * m68k/x-mot3300 (XCFLAGS): List of big files now includes `cse.o'. diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index c49fd0735a2..f568bed9a4c 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -5697,7 +5697,11 @@ rs6000_encode_section_info (decl) /* Return a REG that occurs in ADDR with coefficient 1. - ADDR can be effectively incremented by incrementing REG. */ + ADDR can be effectively incremented by incrementing REG. + + r0 is special and we must not select it as an address + register by this routine since our caller will try to + increment the returned register via an "la" instruction. */ struct rtx_def * find_addr_reg (addr) @@ -5705,9 +5709,11 @@ find_addr_reg (addr) { while (GET_CODE (addr) == PLUS) { - if (GET_CODE (XEXP (addr, 0)) == REG) + if (GET_CODE (XEXP (addr, 0)) == REG + && REGNO (XEXP (addr, 0)) != 0) addr = XEXP (addr, 0); - else if (GET_CODE (XEXP (addr, 1)) == REG) + else if (GET_CODE (XEXP (addr, 1)) == REG + && REGNO (XEXP (addr, 1)) != 0) addr = XEXP (addr, 1); else if (CONSTANT_P (XEXP (addr, 0))) addr = XEXP (addr, 1); @@ -5716,7 +5722,7 @@ find_addr_reg (addr) else abort (); } - if (GET_CODE (addr) == REG) + if (GET_CODE (addr) == REG && REGNO (addr) != 0) return addr; abort (); } -- 2.11.4.GIT