sparc.c (parc_delegitimize_address): Recognize the GOT register and decoded HIGH...
authorEric Botcazou <ebotcazou@adacore.com>
Tue, 22 Jan 2019 10:20:00 +0000 (10:20 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Tue, 22 Jan 2019 10:20:00 +0000 (10:20 +0000)
* config/sparc/sparc.c (parc_delegitimize_address): Recognize the GOT
register and decoded HIGH/LO_SUM combinations for labels in PIC mode.

From-SVN: r268145

gcc/ChangeLog
gcc/config/sparc/sparc.c

index feda772ffc6d674f75514f4bdddbbc7bd5af78c4..e45075c7e62a1a5c2d0209f3aea59500c876a93f 100644 (file)
@@ -1,3 +1,8 @@
+2019-01-22  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * config/sparc/sparc.c (parc_delegitimize_address): Recognize the GOT
+       register and decoded HIGH/LO_SUM combinations for labels in PIC mode.
+
 2019-01-22  Jakub Jelinek  <jakub@redhat.com>
 
        PR tree-optimization/88044
index dc6f94d1906957df53727262ac0064dcd0e74db1..da909c0c6e7c42e8cb5015c09299f57578c12017 100644 (file)
@@ -4995,17 +4995,23 @@ sparc_delegitimize_address (rtx x)
 
   /* This is generated by mov{si,di}_pic_label_ref in PIC mode.  */
   if (GET_CODE (x) == MINUS
-      && sparc_pic_register_p (XEXP (x, 0))
-      && GET_CODE (XEXP (x, 1)) == LO_SUM
-      && GET_CODE (XEXP (XEXP (x, 1), 1)) == UNSPEC
-      && XINT (XEXP (XEXP (x, 1), 1), 1) == UNSPEC_MOVE_PIC_LABEL)
-    {
-      x = XVECEXP (XEXP (XEXP (x, 1), 1), 0, 0);
-      gcc_assert (GET_CODE (x) == LABEL_REF
-                 || (GET_CODE (x) == CONST
-                     && GET_CODE (XEXP (x, 0)) == PLUS
-                     && GET_CODE (XEXP (XEXP (x, 0), 0)) == LABEL_REF
-                     && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT));
+      && (XEXP (x, 0) == global_offset_table_rtx
+         || sparc_pic_register_p (XEXP (x, 0))))
+    {
+      rtx y = XEXP (x, 1);
+
+      if (GET_CODE (y) == LO_SUM)
+       y = XEXP (y, 1);
+
+      if (GET_CODE (y) == UNSPEC && XINT (y, 1) == UNSPEC_MOVE_PIC_LABEL)
+       {
+         x = XVECEXP (y, 0, 0);
+         gcc_assert (GET_CODE (x) == LABEL_REF
+                     || (GET_CODE (x) == CONST
+                         && GET_CODE (XEXP (x, 0)) == PLUS
+                         && GET_CODE (XEXP (XEXP (x, 0), 0)) == LABEL_REF
+                         && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT));
+       }
     }
 
   return x;