https://gcc.gnu.org/g:3f6e48cdb1969dc718d702d045cc4d349f53f239

commit r15-9966-g3f6e48cdb1969dc718d702d045cc4d349f53f239
Author: H.J. Lu <hjl.to...@gmail.com>
Date:   Tue Jul 1 17:17:06 2025 +0800

    x86-64: Add RDI clobber to tls_global_dynamic_64 patterns
    
    *tls_global_dynamic_64_<mode> uses RDI as the __tls_get_addr argument.
    Add RDI clobber to tls_global_dynamic_64 patterns to show it.
    
            PR target/120908
            * config/i386/i386.cc (legitimize_tls_address): Pass RDI to
            gen_tls_global_dynamic_64.
            * config/i386/i386.md (*tls_global_dynamic_64_<mode>): Add RDI
            clobber and use it to generate LEA.
            (@tls_global_dynamic_64_<mode>): Add a clobber.
    
    Signed-off-by: H.J. Lu <hjl.to...@gmail.com>
    (cherry picked from commit 7710d513a552f1fa1b7485ec6b318bafaa6d4cd7)

Diff:
---
 gcc/config/i386/i386.cc | 3 ++-
 gcc/config/i386/i386.md | 8 +++++---
 2 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc
index a6f0a582c3d2..74f740e75866 100644
--- a/gcc/config/i386/i386.cc
+++ b/gcc/config/i386/i386.cc
@@ -12231,11 +12231,12 @@ legitimize_tls_address (rtx x, enum tls_model model, 
bool for_mov)
          if (TARGET_64BIT)
            {
              rtx rax = gen_rtx_REG (Pmode, AX_REG);
+             rtx rdi = gen_rtx_REG (Pmode, DI_REG);
              rtx_insn *insns;
 
              start_sequence ();
              emit_call_insn
-               (gen_tls_global_dynamic_64 (Pmode, rax, x, caddr));
+               (gen_tls_global_dynamic_64 (Pmode, rax, x, caddr, rdi));
              insns = get_insns ();
              end_sequence ();
 
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index d6b2f2959b23..f92a02a57294 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -22992,7 +22992,8 @@
         (match_operand 3)))
    (unspec:P [(match_operand 1 "tls_symbolic_operand")
              (reg:P SP_REG)]
-            UNSPEC_TLS_GD)]
+            UNSPEC_TLS_GD)
+   (clobber (match_operand:P 4 "register_operand" "=D"))]
   "TARGET_64BIT"
 {
   if (!TARGET_X32)
@@ -23009,7 +23010,7 @@
        Use data16 prefix instead, which doesn't have this problem.  */
     fputs ("\tdata16", asm_out_file);
   output_asm_insn
-    ("lea{q}\t{%E1@tlsgd(%%rip), %%rdi|rdi, %E1@tlsgd[rip]}", operands);
+    ("lea{q}\t{%E1@tlsgd(%%rip), %q4|%q4, %E1@tlsgd[rip]}", operands);
   if (TARGET_SUN_TLS || flag_plt || !HAVE_AS_IX86_TLS_GET_ADDR_GOT)
     fputs (ASM_SHORT "0x6666\n", asm_out_file);
   else
@@ -23056,7 +23057,8 @@
           (const_int 0)))
      (unspec:P [(match_operand 1 "tls_symbolic_operand")
                (reg:P SP_REG)]
-              UNSPEC_TLS_GD)])]
+              UNSPEC_TLS_GD)
+     (clobber (match_operand:P 3 "register_operand"))])]
   "TARGET_64BIT"
   "ix86_tls_descriptor_calls_expanded_in_cfun = true;")

Reply via email to