https://gcc.gnu.org/g:a9509987d137bea52b7df8adc58c2c89902fb937

commit r16-3409-ga9509987d137bea52b7df8adc58c2c89902fb937
Author: H.J. Lu <hjl.to...@gmail.com>
Date:   Tue Aug 26 15:29:25 2025 -0700

    x86-64: Emit the TLS call after debug marker
    
    For a basic block with only a debug marker:
    
    (note 3 0 2 2 [bb 2] NOTE_INSN_BASIC_BLOCK)
    (note 2 3 5 2 NOTE_INSN_FUNCTION_BEG)
    (debug_insn 5 2 16 2 (debug_marker) "x.c":6:3 -1 (nil))
    
    emit the TLS call after debug marker.
    
    gcc/
    
            PR target/121668
            * config/i386/i386-features.cc (ix86_emit_tls_call): Emit the
            TLS call after debug marker.
    
    gcc/testsuite/
    
            PR target/121668
            * gcc.target/i386/pr121668-1a.c: New test.
    
    Signed-off-by: H.J. Lu <hjl.to...@gmail.com>

Diff:
---
 gcc/config/i386/i386-features.cc            | 26 +++++++++++++++++++++-----
 gcc/testsuite/gcc.target/i386/pr121668-1a.c | 13 +++++++++++++
 2 files changed, 34 insertions(+), 5 deletions(-)

diff --git a/gcc/config/i386/i386-features.cc b/gcc/config/i386/i386-features.cc
index cdb2a0b34b27..93e20947edf3 100644
--- a/gcc/config/i386/i386-features.cc
+++ b/gcc/config/i386/i386-features.cc
@@ -3806,10 +3806,19 @@ ix86_emit_tls_call (rtx tls_set, x86_cse_kind kind, 
basic_block bb,
                 (code_label 78 11 77 3 14 (nil) [1 uses])
                 (note 77 78 54 3 [bb 3] NOTE_INSN_BASIC_BLOCK)
 
+                or a basic block with only a debug marker:
+
+                (note 3 0 2 2 [bb 2] NOTE_INSN_BASIC_BLOCK)
+                (note 2 3 5 2 NOTE_INSN_FUNCTION_BEG)
+                (debug_insn 5 2 16 2 (debug_marker) "x.c":6:3 -1 (nil))
+
               */
-             gcc_assert (NOTE_P (insn)
-                         && (NOTE_KIND (insn) == NOTE_INSN_FUNCTION_BEG
-                             || NOTE_KIND (insn) == NOTE_INSN_BASIC_BLOCK));
+             gcc_assert (DEBUG_INSN_P (insn)
+                         || (NOTE_P (insn)
+                             && ((NOTE_KIND (insn)
+                                  == NOTE_INSN_FUNCTION_BEG)
+                                 || (NOTE_KIND (insn)
+                                     == NOTE_INSN_BASIC_BLOCK))));
              insn = NULL;
              break;
            }
@@ -3854,12 +3863,19 @@ ix86_emit_tls_call (rtx tls_set, x86_cse_kind kind, 
basic_block bb,
                 (note 4 0 2 2 [bb 2] NOTE_INSN_BASIC_BLOCK)
                 (note 2 4 26 2 NOTE_INSN_FUNCTION_BEG)
 
-                or after NOTE_INSN_BASIC_BLOCK a basic block with only
-                a label:
+                or after NOTE_INSN_BASIC_BLOCK in a basic block with
+                only a label:
 
                 (code_label 78 11 77 3 14 (nil) [1 uses])
                 (note 77 78 54 3 [bb 3] NOTE_INSN_BASIC_BLOCK)
 
+                or after debug marker in a basic block with only a
+                debug marker:
+
+                (note 3 0 2 2 [bb 2] NOTE_INSN_BASIC_BLOCK)
+                (note 2 3 5 2 NOTE_INSN_FUNCTION_BEG)
+                (debug_insn 5 2 16 2 (debug_marker) "x.c":6:3 -1 (nil))
+
               */
              insn = insn ? PREV_INSN (insn) : BB_END (bb);
              *after_p = insn;
diff --git a/gcc/testsuite/gcc.target/i386/pr121668-1a.c 
b/gcc/testsuite/gcc.target/i386/pr121668-1a.c
new file mode 100644
index 000000000000..eb553081eb31
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr121668-1a.c
@@ -0,0 +1,13 @@
+/* { dg-do compile { target *-*-linux* } } */
+/* { dg-options "-Og -g -fpic -fplt -mtls-dialect=gnu" } */
+
+typedef int caml_domain_state;
+thread_local caml_domain_state caml_state;
+void
+caml_empty_mark_stack ()
+{
+  while (caml_state)
+    caml_state = 0;
+}
+
+/* { dg-final { scan-assembler-times "call\[ \t\]__tls_get_addr@PLT" 1 { 
target { ! ia32 } } } } */

Reply via email to