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

    <tr>
        <th>Summary</th>
        <td>
            Missed optimization: unnecessary TLS address calculations
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            backend:X86,
            llvm:optimizations
      </td>
    </tr>

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

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

<pre>
    2 similar functions:
```
void foo() {
    long tmp;
    asm volatile(
        "movq %[x], %[tmp];"
        "movq %[tmp], %[y];"
        : [tmp] "=&r"(tmp)
        : [x]"m"(x), [y]"m"(y));
    asm volatile(
        "movq %[x], %[tmp];"
 "movq %[tmp], %[y];"
        : [tmp] "=&r"(tmp)
        : [x]"m"(x), [y]"m"(y));
}

void bar() {
    long tmp;
 asm goto(
        "movq %[x], %[tmp];"
        "movq %[tmp], %[y];"
        : [tmp] "=&r"(tmp)
        : [x]"m"(x), [y]"m"(y)
        :: label);
    return;
    label: __attribute__((cold));
    asm volatile(
        "movq %[x], %[tmp];"
        "movq %[tmp], %[y];"
        : [tmp] "=&r"(tmp)
        : [x]"m"(x), [y]"m"(y));
}
```

For the first clang generates expected:
```
 mov %fs:0xfffffffffffffff0,%rax
 mov    %rax,%fs:0xfffffffffffffff8
 mov %fs:0xfffffffffffffff0,%rax
 mov %rax,%fs:0xfffffffffffffff8
```

But for the second clang adds unnecessary mov+lea+lea on the "fast path" of the function:
```
 mov %fs:0x0,%rcx
 lea    -0x10(%rcx),%rax
 lea    -0x8(%rcx),%rcx
 mov %fs:0xfffffffffffffff0,%rdx
 mov    %rdx,%fs:0xfffffffffffffff8
 ret
 mov    (%rax),%rdx
 mov    %rdx,(%rcx)
 ret
```

https://godbolt.org/z/PEhK1xhde
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzcVkGPqzYQ_jXDxdoVDBDgwCHZlEtbqVJ76C0y2ID7DE5tE5H36ysbNptEeW1aaaW2KCIwM98M8_ljMDVGdCPnJaQ7SPcBnWyvdMlO5-mLOgW1YucSiRGDkFSTdhobK9RoIN5CuIdwC5tw_fnbkxKMtEoB5oAFgWy32AkhRKqxI3Y4QnxlpGYgJyWpFZI70MXhDkAc1Ol3AphCupsh3QO-rXcuUbp3uRD_DLXGXXDnb6HiLbmEuxwQ7wE32l1h7sxYPEQsj4XDEji7MFdsrXRxnL2j-LTm_xtdQ7ZfLz7kUlP9nFwcXZ2y6v-vk3u8SyFpzeW9gjS3kx5vTEtcvCWHA7VWi3qy_HDwDOeNkuyTdfjvJ_ehHG_H2HKulCa256QV2ljSSDp2pOMj19RyQ_h85I3l7FujkAzq5Npt3bAM5_b2CAHfAFNN56toz5u3eedjZP6P0z-d-yEbu8mSdmXE8EaNbKWEMmbINI684cZQfXa1AHeS0-VM1OhBgNhSY8mR2h4QiWoXdtdvypM8vnfWvHfmKhBCXsI5Cr3Kvc8L4IaBj7j8QVgz_x1a2YNVY0-tmub2Hpq_r0vx19mvnvsu38M16609-m81VoBVp1itpH1VugOsvgJWP33Xfx_NPeMBK2NWxAUNeBllYZRtkjzKgr7Ms6zGKK6LNEmxSdqspUm-SWm7SWjbIg9EiSHGEYZpmOMmzV55yPK0bbIkioq8SBgkIR-okK9SngZXOxDGTLzMkiTGwE8r43cfiDVtvvDRvVG_5hv_xr4BosNBvFVHKwbxlS77D0S3W9Glc77UU2cgCaUw1nyUscJKXv4ojOGMXKPdzLjW6y8__OxErLkxpKGymeRSJJi0LO8oFLaf6tdGDYCVf7Dl7-Wo1W-8sYCV784AVr7BPwIAAP__yKV5vw">