On Sat, Aug 16, 2025 at 5:48 PM H.J. Lu <hjl.to...@gmail.com> wrote: > > We can't place a TLS call before a conditional jump in a basic block like > > (code_label 13 11 14 4 2 (nil) [1 uses]) > (note 14 13 16 4 [bb 4] NOTE_INSN_BASIC_BLOCK) > (jump_insn 16 14 17 4 (set (pc) > (if_then_else (le (reg:CCNO 17 flags) > (const_int 0 [0])) > (label_ref 27) > (pc))) "x.c":10:21 discrim 1 1462 {*jcc} > (expr_list:REG_DEAD (reg:CCNO 17 flags) > (int_list:REG_BR_PROB 628353713 (nil))) > -> 27) > > since the TLS call will clobber flags register. Instead, we should place > such call before all register setting basic blocks which dominate the > current basic block. > > NB: GNU2 TLS: > > (insn 66 2 5 2 (parallel [ > (set (reg:DI 116) > (plus:DI (unspec:DI [ > (symbol_ref:DI ("_TLS_MODULE_BASE_") [flags 0x10]) > (unspec:DI [ > (symbol_ref:DI ("_TLS_MODULE_BASE_") [flags 0x10]) > ] UNSPEC_TLSDESC) > (reg/f:DI 7 sp)] UNSPEC_TLSDESC) > (const:DI (unspec:DI [ > (symbol_ref:DI ("tv_cache") [flags 0x5a]) > ] UNSPEC_DTPOFF)))) > (clobber (reg:CC 17 flags))]) 1678 {*tls_dynamic_gnu2_combine_64_di} > (nil)) > > only clobbers flags register. > > gcc/ > > PR target/121572 > * config/i386/i386-features.cc (ix86_place_single_tls_call): Also > search for REG_DEAD notes if flag register is alive. Place the > TLS call before all FLAGS_REG setting BBs for conditional jump. > > gcc/testsuite/ > > PR target/121572 > * gcc.target/i386/pr121572-1a.c: New test. > * gcc.target/i386/pr121572-1b.c: Likewise.
The v2 patch is at https://patchwork.sourceware.org/project/gcc/list/?series=50903 -- H.J.