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.

Reply via email to