*tls_local_dynamic_64_<mode> uses RDI as the __tls_get_addr argument. Add RDI clobber to tls_local_dynamic_64 patterns to show it.
PR target/120908 * config/i386/i386.cc (legitimize_tls_address): Pass RDI to gen_tls_local_dynamic_64. * config/i386/i386.md (*tls_local_dynamic_64_<mode>): Add RDI clobber and use it to generate LEA. (@tls_local_dynamic_64_<mode>): Add a clobber. OK for master? -- H.J.
From fcd3aedec394b514855a7a408fd20d394f39bbeb Mon Sep 17 00:00:00 2001 From: "H.J. Lu" <hjl.to...@gmail.com> Date: Thu, 3 Jul 2025 10:54:39 +0800 Subject: [PATCH] x86-64: Add RDI clobber to tls_local_dynamic_64 patterns *tls_local_dynamic_64_<mode> uses RDI as the __tls_get_addr argument. Add RDI clobber to tls_local_dynamic_64 patterns to show it. PR target/120908 * config/i386/i386.cc (legitimize_tls_address): Pass RDI to gen_tls_local_dynamic_64. * config/i386/i386.md (*tls_local_dynamic_64_<mode>): Add RDI clobber and use it to generate LEA. (@tls_local_dynamic_64_<mode>): Add a clobber. Signed-off-by: H.J. Lu <hjl.to...@gmail.com> --- 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 9657c6ae31f..24aedc136a6 100644 --- a/gcc/config/i386/i386.cc +++ b/gcc/config/i386/i386.cc @@ -12616,12 +12616,13 @@ 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; rtx eqv; start_sequence (); emit_call_insn - (gen_tls_local_dynamic_base_64 (Pmode, rax, caddr)); + (gen_tls_local_dynamic_base_64 (Pmode, rax, caddr, rdi)); insns = end_sequence (); /* Attach a unique REG_EQUAL, to allow the RTL optimizers to diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 370e79bb511..07d9a4cb653 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -23318,11 +23318,12 @@ (define_insn "*tls_local_dynamic_base_64_<mode>" (call:P (mem:QI (match_operand 1 "constant_call_address_operand" "Bz")) (match_operand 2))) - (unspec:P [(reg:P SP_REG)] UNSPEC_TLS_LD_BASE)] + (unspec:P [(reg:P SP_REG)] UNSPEC_TLS_LD_BASE) + (clobber (match_operand:P 3 "register_operand" "=D"))] "TARGET_64BIT" { output_asm_insn - ("lea{q}\t{%&@tlsld(%%rip), %%rdi|rdi, %&@tlsld[rip]}", operands); + ("lea{q}\t{%&@tlsld(%%rip), %q3|%q3, %&@tlsld[rip]}", operands); if (TARGET_SUN_TLS) return "call\t%p1@plt"; if (flag_plt || !HAVE_AS_IX86_TLS_GET_ADDR_GOT) @@ -23359,7 +23360,8 @@ (define_expand "@tls_local_dynamic_base_64_<mode>" (call:P (mem:QI (match_operand 1)) (const_int 0))) - (unspec:P [(reg:P SP_REG)] UNSPEC_TLS_LD_BASE)])] + (unspec:P [(reg:P SP_REG)] UNSPEC_TLS_LD_BASE) + (clobber (match_operand:P 2 "register_operand"))])] "TARGET_64BIT" "ix86_tls_descriptor_calls_expanded_in_cfun = true;") -- 2.50.0