OSDN Git Service

PR target/47986
authoramodra <amodra@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 4 Mar 2011 22:59:07 +0000 (22:59 +0000)
committeramodra <amodra@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 4 Mar 2011 22:59:07 +0000 (22:59 +0000)
* config/rs6000/rs6000.c (rs6000_delegitimize_address): Handle
full cmodel medium/large lo_sum + high addresses.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@170687 138bc75d-0d04-0410-961f-82ee72b054a4

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

index 76a2bd2..9cb86c6 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 df02bef..fd80f8b 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))