]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
rs6000.c (find_addr_reg): Do not select r0 as an address register.
authorJeffrey A Law <law@cygnus.com>
Tue, 13 Jul 1999 09:47:07 +0000 (09:47 +0000)
committerJeff Law <law@gcc.gnu.org>
Tue, 13 Jul 1999 09:47:07 +0000 (03:47 -0600)
        * rs6000.c (find_addr_reg): Do not select r0 as an address
        register.

From-SVN: r28083

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

index 24be4bc8bbef9b9fdedaf7995bb4309ddb11c270..3d6f6f19a0f6c881d8c820af7e1665461f9d20dd 100644 (file)
@@ -1,3 +1,8 @@
+Tue Jul 13 10:44:14 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 c1c3726503b80e872882d0b4cc17773713c9a1a0..2af2bf0c655ff621c3e8b1cd1edc7021f6d4e442 100644 (file)
@@ -5692,7 +5692,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)
@@ -5700,9 +5704,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);
@@ -5711,7 +5717,7 @@ find_addr_reg (addr)
       else
        abort ();
     }
-  if (GET_CODE (addr) == REG)
+  if (GET_CODE (addr) == REG && REGNO (addr) != 0)
     return addr;
   abort ();
 }