re PR target/47986 (gcc.c-torture/execute/20040709-1.c fails with non-delegitimized...
authorAlan Modra <amodra@gmail.com>
Fri, 4 Mar 2011 22:59:07 +0000 (09:29 +1030)
committerAlan Modra <amodra@gcc.gnu.org>
Fri, 4 Mar 2011 22:59:07 +0000 (09:29 +1030)
PR target/47986
* config/rs6000/rs6000.c (rs6000_delegitimize_address): Handle
full cmodel medium/large lo_sum + high addresses.

From-SVN: r170687

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

index 76a2bd2b8e9fa7fc8e39cd269983f09612e07448..9cb86c6641d1b1274e86e7344add36ca2fc248d3 100644 (file)
@@ -1,3 +1,9 @@
+2011-03-05  Alan Modra  <amodra@gmail.com>
+
+       PR target/47986
+       * config/rs6000/rs6000.c (rs6000_delegitimize_address): Handle
+       full cmodel medium/large lo_sum + high addresses.
+
 2011-03-04  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>
 
        * config/s390/s390.c (s390_decompose_address): Reject non-literal
index df02bef54dfbcdc00e58f759bac7ad4c1e4ecaf1..fd80f8b8ac28292a9c3c344550df9bec0e9e274a 100644 (file)
@@ -6248,17 +6248,23 @@ rs6000_delegitimize_address (rtx orig_x)
   if (MEM_P (x))
     x = XEXP (x, 0);
 
-  if ((GET_CODE (x) == PLUS
-       || GET_CODE (x) == LO_SUM)
-      && GET_CODE (XEXP (x, 0)) == REG
-      && (REGNO (XEXP (x, 0)) == TOC_REGISTER
-         || TARGET_MINIMAL_TOC
-         || TARGET_CMODEL != CMODEL_SMALL)
+  if (GET_CODE (x) == (TARGET_CMODEL != CMODEL_SMALL ? LO_SUM : PLUS)
       && GET_CODE (XEXP (x, 1)) == CONST)
     {
       y = XEXP (XEXP (x, 1), 0);
       if (GET_CODE (y) == UNSPEC
-          && XINT (y, 1) == UNSPEC_TOCREL)
+          && XINT (y, 1) == UNSPEC_TOCREL
+         && ((GET_CODE (XEXP (x, 0)) == REG
+              && (REGNO (XEXP (x, 0)) == TOC_REGISTER
+                  || TARGET_MINIMAL_TOC
+                  || TARGET_CMODEL != CMODEL_SMALL))
+             || (TARGET_CMODEL != CMODEL_SMALL
+                 && GET_CODE (XEXP (x, 0)) == PLUS
+                 && GET_CODE (XEXP (XEXP (x, 0), 0)) == REG
+                 && REGNO (XEXP (XEXP (x, 0), 0)) == TOC_REGISTER
+                 && GET_CODE (XEXP (XEXP (x, 0), 1)) == HIGH
+                 && rtx_equal_p (XEXP (x, 1),
+                                 XEXP (XEXP (XEXP (x, 0), 1), 0)))))
        {
          y = XVECEXP (y, 0, 0);
          if (!MEM_P (orig_x))