[Bug target/100354] [9/10/11/12 regression] aarch64: non-deligitimized UNSPEC UNSPEC_TLS (76) found in variable location

jakub at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Tue Feb 8 18:54:50 GMT 2022


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100354

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |ktkachov at gcc dot gnu.org,
                   |                            |rearnsha at gcc dot gnu.org,
                   |                            |rsandifo at gcc dot gnu.org

--- Comment #7 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
It could be e.g. done by having the targetm.const_not_ok_for_debug_p target
hook not return true for the UNSPEC_TLS case and have some new target hook that
would handle emitting debug info for an UNSPEC.

Or a way to just quiet the note (I'll repeat it is -fchecking only) would be to
use as the operand of UNSPEC_TLS not const0_rtx as it does, but some magic
SYMBOL_REF with SYMBOL_REF_TLS_MODEL non-zero on it.  Say like:
--- gcc/config/aarch64/aarch64.md.jj    2022-01-11 23:11:21.682300103 +0100
+++ gcc/config/aarch64/aarch64.md       2022-02-08 19:51:00.581676457 +0100
@@ -6833,7 +6833,8 @@ (define_insn "ldr_got_tiny_sidi"

 (define_insn "aarch64_load_tp_hard"
   [(set (match_operand:DI 0 "register_operand" "=r")
-       (unspec:DI [(const_int 0)] UNSPEC_TLS))]
+       (unspec:DI [(match_operand 1 "aarch64_tls_le_symref" "S")]
+                  UNSPEC_TLS))]
   ""
   "mrs\\t%0, tpidr_el0"
   [(set_attr "type" "mrs")]
--- gcc/config/aarch64/aarch64.cc.jj    2022-02-04 14:36:54.262615676 +0100
+++ gcc/config/aarch64/aarch64.cc       2022-02-08 19:46:58.206051731 +0100
@@ -18474,7 +18474,9 @@ aarch64_load_tp (rtx target)
     target = gen_reg_rtx (Pmode);

   /* Can return in any reg.  */
-  emit_insn (gen_aarch64_load_tp_hard (target));
+  rtx sym = gen_rtx_SYMBOL_REF (Pmode, "");
+  SYMBOL_REF_FLAGS (sym) = TLS_MODEL_LOCAL_EXEC << SYMBOL_FLAG_TLS_SHIFT;
+  emit_insn (gen_aarch64_load_tp_hard (target, sym));
   return target;
 }


More information about the Gcc-bugs mailing list