https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121572
--- Comment #2 from Sergei Trofimovich <slyfox at gcc dot gnu.org> --- Looking at the output of `$gcc -S a.c -fPIC -o a.S` I think `testl` comparison gets clobbered by a hoisted `__tls_get_addr` call: ``` bug: .LFB2: .cfi_startproc subq $24, %rsp .cfi_def_cfa_offset 32 movl $-1, %edi call val testl %eax, %eax ; %eax contains '-1' je .L14 leaq tv_cache@tlsld(%rip), %rdi call __tls_get_addr@PLT ; %rax is clobbered by a TLS table jg .L16 ; <---- I think it want `testl` here, not __tls_get_addr@PLT movl tv_cache@dtpoff(%rax), %edi addq $24, %rsp .cfi_remember_state .cfi_def_cfa_offset 8 jmp use_cache .p2align 4,,10 .p2align 3 .L16: .cfi_restore_state movl $2, %edi movq %rax, 8(%rsp) call val testl %eax, %eax je .L14 movq 8(%rsp), %rax movl tv_cache@dtpoff(%rax), %edi call use_cache .L14: ud2 .cfi_endproc ```