Fix for PR/94542, do not make TLS refs PC-relative
authorAaron Sawdey <acsawdey@linux.ibm.com>
Tue, 14 Apr 2020 19:38:47 +0000 (14:38 -0500)
committerAaron Sawdey <acsawdey@linux.ibm.com>
Tue, 14 Apr 2020 19:38:47 +0000 (14:38 -0500)
For rs6000 target, it is not valid to make PC-relative
references to TLS symbols. So addr_to_insn_form() needs
to check if things are TLS before returning PC-rel forms.

2020-04-14  Aaron Sawdey  <acsawdey@linux.ibm.com>

PR target/94542
* config/rs6000/rs6000.c (address_to_insn_form): Do not attempt to
use PC-relative addressing for TLS references.

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

index 483bd85f65c33b42aae467ed3e9e5bb5fdc6dbf6..e88c0e13d15ff10cc6129a0b014ed2f0074976b6 100644 (file)
@@ -1,3 +1,9 @@
+2020-04-14  Aaron Sawdey  <acsawdey@linux.ibm.com>
+
+       PR target/94542
+       * config/rs6000/rs6000.c (address_to_insn_form): Do not attempt to
+       use PC-relative addressing for TLS references.
+
 2020-04-14  Martin Jambor  <mjambor@suse.cz>
 
        PR ipa/94434
index 2b6613bcb7e9784a87f33efc97ad2ab43b925fe2..4defc1ab52be141ad7a42685a3548c42c6d4c868 100644 (file)
@@ -24824,15 +24824,21 @@ address_to_insn_form (rtx addr,
   if (GET_RTX_CLASS (GET_CODE (addr)) == RTX_AUTOINC)
     return INSN_FORM_UPDATE;
 
-  /* Handle PC-relative symbols and labels.  Check for both local and external
-     symbols.  Assume labels are always local.  */
+  /* Handle PC-relative symbols and labels.  Check for both local and
+     external symbols.  Assume labels are always local.  TLS symbols
+     are not PC-relative for rs6000.  */
   if (TARGET_PCREL)
     {
-      if (SYMBOL_REF_P (addr) && !SYMBOL_REF_LOCAL_P (addr))
-       return INSN_FORM_PCREL_EXTERNAL;
-
-      if (SYMBOL_REF_P (addr) || LABEL_REF_P (addr))
+      if (LABEL_REF_P (addr))
        return INSN_FORM_PCREL_LOCAL;
+
+      if (SYMBOL_REF_P (addr) && !SYMBOL_REF_TLS_MODEL (addr))
+       {
+         if (!SYMBOL_REF_LOCAL_P (addr))
+           return INSN_FORM_PCREL_EXTERNAL;
+         else
+           return INSN_FORM_PCREL_LOCAL;
+       }
     }
 
   if (GET_CODE (addr) == CONST)
@@ -24866,14 +24872,19 @@ address_to_insn_form (rtx addr,
     return INSN_FORM_BAD;
 
   /* Check for local and external PC-relative addresses.  Labels are always
-     local.  */
+     local.  TLS symbols are not PC-relative for rs6000.  */
   if (TARGET_PCREL)
     {
-      if (SYMBOL_REF_P (op0) && !SYMBOL_REF_LOCAL_P (op0))
-       return INSN_FORM_PCREL_EXTERNAL;
-
-      if (SYMBOL_REF_P (op0) || LABEL_REF_P (op0))
+      if (LABEL_REF_P (op0))
        return INSN_FORM_PCREL_LOCAL;
+
+      if (SYMBOL_REF_P (op0) && !SYMBOL_REF_TLS_MODEL (op0))
+       {
+         if (!SYMBOL_REF_LOCAL_P (op0))
+           return INSN_FORM_PCREL_EXTERNAL;
+         else
+           return INSN_FORM_PCREL_LOCAL;
+       }
     }
 
   /* If it isn't PC-relative, the address must use a base register.  */