<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/103485>103485</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            clang-cl generates suboptimal code for __declspec(thread) thread-local variables that have constructor
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          mcfi
      </td>
    </tr>
</table>

<pre>
    Consider this example https://godbolt.org/z/x7jjavdjP
```
struct A {
    A(){ a = 0; }

    int a;
};

extern __declspec(thread) struct A a;

struct A&
getA(void)
{
    return a;
}
```
clang-cl generates the following code.
```
getA: # @getA
.seh_proc getA
# %bb.0:
        sub     rsp, 40
        .seh_stackalloc 40
        .seh_endprologue
        mov     eax, dword ptr [rip + _tls_index]
        mov     rcx, qword ptr gs:[88]
        mov     rax, qword ptr [rcx + 8*rax]
        cmp     byte ptr [rax + __tls_guard@SECREL32], 0
        jne     .LBB0_2
# %bb.1:
        call    __dyn_tls_on_demand_init
.LBB0_2:
        mov     eax, dword ptr [rip + _tls_index]
        mov     rcx, qword ptr gs:[88]
        mov     rax, qword ptr [rcx + 8*rax]
        mov     eax, dword ptr [rax + a@SECREL32]
        add     rsp, 40
        ret
```
The problem is that if `cmp     byte ptr [rax + __tls_guard@SECREL32], 0` results in a unequal result, it jumps to `.LBB0_2`, which then repeats three instructions that have already been executed above. This is not as efficient as what MSVC generates.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzMVUGP6jYQ_jXmMlpkHALJIQfYfZxeparvqddoYg-JqWNnbYdl--srZ7MsorSHniohiGfmm_lmxvnAEHRriSqW71n-ssAxds5XvTzqRePUe_XsbNCKPMROB6AL9oMh6GIcAst2TByYOLRONc7EpfMtE4c_mThctqcTntXpV8ZfGN-xDZ8_0zFEP8oIO2Db_YcFAGDHRMFEybZ7QGDZC3CW7YFtX-Yc10BtIyDLZmgKuD5P33SJ5C3UtSJpwkCSiSJ2nlAxUcK1ON7BPh1MbD4MLcXE6ex0An5Wu2HsKY7e3nF51LA0aNsnaaAlSx4jBYgdwdEZ4960bUE6RcuH0IlEtgMmMmBrPh0nxzJQVw_eSfiyTUEib5olT8uZmyvD2DBe-jAw8QxrfrVPKUJE-Qca4-TfXGTV4J1x7UhXR-_OjJeEl5RLvTmvYIgeWL73egAm9lBHE2ptFV1Y_nKH83LCvV5x7XSL8n1RPAjGu-BURF6mIgUTu-S_Acl-YLxs3iNdg_EjuJ4otSN6xdb8x7fn3759z0TCimf46vlkKXX-fb_ntbgf6Op2oBKNYbysa_Vup9zO1op6tKrWVsd5QXOiG9z_d3j_wmweIt6N7hOJSj28XJ7iwwv9syMYvGsM9aDTe4AR9BHYhv_nBW44eAqjiQG0BYTR0uuIZjamGB3hNPZDgOhSpc_VbHhyvnVadumFtOBpIIyJlScCbT80QTs7E-3wTIAmack7NEQW6EJyjKQAG3emJfxMMqkDWBcBA9DxqKUmOx3eUopffvz-_KUDy4WqMlVmJS6oWm1FlhelEGLRVUfcZsVKFXhU-WottgLzfFvgKttIVaLcLHQluFjzYpUJsd5ysTxyKRDXudg0yBWt2JpTj9osjTn3SZwXOoSRqhXP1kW-MNiQCZPwC2HpDSYvE2muC18l0FMztoGtudEhhq80UUdD1QNRC2Pjhqh7NJOiwdH5f5Lhj6cn4yQaOKPX2Bi6nbJ08_SdX4zeVHd_OTp2Y7OUrmfikIjNP0-DdyeSkYnD1E5g4jD3e67EXwEAAP__AiQQBg">