rs6000.c (find_addr_reg): Do not select r0 as an address register.
authorJeffrey A Law <law@cygnus.com>
Tue, 13 Jul 1999 09:48:04 +0000 (09:48 +0000)
committerJeff Law <law@gcc.gnu.org>
Tue, 13 Jul 1999 09:48:04 +0000 (03:48 -0600)
        * rs6000.c (find_addr_reg): Do not select r0 as an address
        register.

From-SVN: r28084

gcc/ChangeLog
gcc/config/rs6000/rs6000.c

index a356b64b56edb82274f317e952233b33d31497c1..423cc0d93332c332d1a57f02f8c94adb497c11c4 100644 (file)
@@ -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  <phdm@macqel.be>
 
        * m68k/x-mot3300 (XCFLAGS): List of big files now includes `cse.o'.
index c49fd0735a2189f13fef475004e43eaa797ca5b6..f568bed9a4cc355a4de1b6fae182c005667ffba2 100644 (file)
@@ -5697,7 +5697,11 @@ rs6000_encode_section_info (decl)
 
 \f
 /* 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 ();
 }