On Thu, Aug 21, 2025 at 3:46 AM H.J. Lu <hjl.to...@gmail.com> wrote: > > For 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) > > emit the TLS call after NOTE_INSN_BASIC_BLOCK, instead of before > NOTE_INSN_BASIC_BLOCK, to avoid > > x.c: In function ‘aout_16_write_syms’: > x.c:54:1: error: NOTE_INSN_BASIC_BLOCK is missing for block 3 > 54 | } > | ^ > x.c:54:1: error: NOTE_INSN_BASIC_BLOCK 77 in middle of basic block 3 > during RTL pass: x86_cse > x.c:54:1: internal compiler error: verify_flow_info failed
Ok. > > gcc/ > > PR target/121607 > * config/i386/i386-features.cc (ix86_emit_tls_call): Emit the > TLS call after NOTE_INSN_BASIC_BLOCK in a basic block with only > a label. > > gcc/testsuite/ > > PR target/121607 > * gcc.target/i386/pr121607-1a.c: New test. > * gcc.target/i386/pr121607-1b.c: Likewise. > > Signed-off-by: H.J. Lu <hjl.to...@gmail.com> > --- > gcc/config/i386/i386-features.cc | 24 +++++++-- > gcc/testsuite/gcc.target/i386/pr121607-1a.c | 59 +++++++++++++++++++++ > gcc/testsuite/gcc.target/i386/pr121607-1b.c | 6 +++ > 3 files changed, 86 insertions(+), 3 deletions(-) > create mode 100644 gcc/testsuite/gcc.target/i386/pr121607-1a.c > create mode 100644 gcc/testsuite/gcc.target/i386/pr121607-1b.c > > diff --git a/gcc/config/i386/i386-features.cc > b/gcc/config/i386/i386-features.cc > index 7869ee22b67..514d2a5d378 100644 > --- a/gcc/config/i386/i386-features.cc > +++ b/gcc/config/i386/i386-features.cc > @@ -3795,7 +3795,18 @@ ix86_emit_tls_call (rtx tls_set, x86_cse_kind kind, > basic_block bb, > while (insn && !NONDEBUG_INSN_P (insn)) > { > if (insn == BB_END (bb)) > - break; > + { > + /* This must be 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) > + > + */ > + gcc_assert (NOTE_P (insn) > + && NOTE_KIND (insn) == NOTE_INSN_BASIC_BLOCK); > + insn = NULL; > + break; > + } > insn = NEXT_INSN (insn); > } > > @@ -3824,14 +3835,21 @@ ix86_emit_tls_call (rtx tls_set, x86_cse_kind kind, > basic_block bb, > > if (bitmap_empty_p (live_caller_saved_regs)) > { > - if (insn == BB_HEAD (bb) || insn == BB_END (bb)) > + if (insn == BB_HEAD (bb)) > { > *before_p = insn; > tls_insn = emit_insn_before (tls_set, insn); > } > else > { > - insn = PREV_INSN (insn); > + /* Emit the TLS call 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) > + > + */ > + insn = insn ? PREV_INSN (insn) : BB_END (bb); > *after_p = insn; > tls_insn = emit_insn_after (tls_set, insn); > } > diff --git a/gcc/testsuite/gcc.target/i386/pr121607-1a.c > b/gcc/testsuite/gcc.target/i386/pr121607-1a.c > new file mode 100644 > index 00000000000..4c047068e3a > --- /dev/null > +++ b/gcc/testsuite/gcc.target/i386/pr121607-1a.c > @@ -0,0 +1,59 @@ > +/* { dg-do compile { target *-*-linux* } } */ > +/* { dg-options "-O2 -fpic -fplt -mtls-dialect=gnu > -fno-semantic-interposition -fstack-protector" } */ > + > +typedef enum > +{ > + bfd_error_invalid_error_code > +} bfd_error_type; > +thread_local bfd_error_type bfd_error; > +int aout_16_write_syms___trans_tmp_1; > +short aout_16_write_syms_g_0_0; > +void xvec_0 (long, void *); > + > +typedef struct > +{ > + int output_section; > +} asection; > + > +void bfd_asymbol_section (); > + > +struct pdp11_external_nlist > +{ > + char e_desc[2]; > + char e_type[1]; > + char e_ovly[10]; > +} translate_to_native_sym_flags (struct pdp11_external_nlist *sym_pointer) > +{ > + asection *sec; > + sym_pointer->e_type[0] &= 5; > + bfd_asymbol_section (); > + if (sec == 0) > + { > + bfd_error_type error_tag; > + bfd_error = error_tag; > + } > + if (sec->output_section) > + { > + bfd_error_type error_tag; > + bfd_error = error_tag; > + } > +} > + > +bool > +aout_16_write_syms (void *abfd) > +{ > + for (; aout_16_write_syms___trans_tmp_1;) > + { > + struct pdp11_external_nlist nsp; > + if (abfd) > + { > + xvec_0 (aout_16_write_syms_g_0_0, nsp.e_desc); > + nsp.e_ovly[0] = 0; > + } > + else > + nsp.e_type[0] = 0; > + translate_to_native_sym_flags (&nsp); > + } > +} > + > +/* { dg-final { scan-assembler-times "call\[ \t\]__tls_get_addr@PLT" 2 { > target { ! ia32 } } } } */ > diff --git a/gcc/testsuite/gcc.target/i386/pr121607-1b.c > b/gcc/testsuite/gcc.target/i386/pr121607-1b.c > new file mode 100644 > index 00000000000..366306702c7 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/i386/pr121607-1b.c > @@ -0,0 +1,6 @@ > +/* { dg-do compile { target *-*-linux* } } */ > +/* { dg-options "-O2 -fpic -fplt -mtls-dialect=gnu2 > -fno-semantic-interposition -fstack-protector" } */ > + > +#include "pr121607-1a.c" > + > +/* { dg-final { scan-assembler-times "call\[ > \t\]\\*bfd_error@TLSCALL\\(%(?:r|e)ax\\)" 2 { target { ! ia32 } } } } */ > -- > 2.50.1 > -- BR, Hongtao