[Bug middle-end/99619] New: fails to infer local-dynamic TLS model from hidden visibility

amonakov at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Tue Mar 16 15:29:33 GMT 2021


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99619

            Bug ID: 99619
           Summary: fails to infer local-dynamic TLS model from hidden
                    visibility
           Product: gcc
           Version: 11.0
            Status: UNCONFIRMED
          Keywords: missed-optimization
          Severity: normal
          Priority: P3
         Component: middle-end
          Assignee: unassigned at gcc dot gnu.org
          Reporter: amonakov at gcc dot gnu.org
  Target Milestone: ---

Thread-local variables with hidden visibility don't need to use the
"general-dynamic" TLS model: they can use "local-dynamic" model, which is more
efficient when more than one variable is accessed. This is documented in "ELF
handling for thread-local storage".

Testcase:

__attribute__((visibility("hidden")))
extern __thread int a, b;

int f()
{
    return a + b;
}

clang -O2 -fpic emits:
f:
        .cfi_startproc
        push    rax
        .cfi_def_cfa_offset 16
        lea     rdi, [rip + a@TLSLD]
        call    __tls_get_addr@PLT
        mov     rcx, rax
        mov     eax, dword ptr [rax + b@DTPOFF]
        add     eax, dword ptr [rcx + a@DTPOFF]
        pop     rcx
        .cfi_def_cfa_offset 8
        ret

gcc -O2 -fpic emits:
f:
        .cfi_startproc
        push    rbx
        .cfi_def_cfa_offset 16
        .cfi_offset 3, -16
        data16  lea rdi, a@tlsgd[rip]
        .value  0x6666
        rex64
        call    __tls_get_addr@PLT
        mov     rbx, rax
        data16  lea rdi, b@tlsgd[rip]
        .value  0x6666
        rex64
        call    __tls_get_addr@PLT
        mov     eax, DWORD PTR [rax]
        add     eax, DWORD PTR [rbx]
        pop     rbx
        .cfi_def_cfa_offset 8
        ret


More information about the Gcc-bugs mailing list