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

    <tr>
        <th>Summary</th>
        <td>
            Suboptimal code for storing double to global (trunk regression)
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            backend:X86
      </td>
    </tr>

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

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

<pre>
    ```
double a[64], b[64];

void foo (int k)
{
   a[k] += b[k];
}
```

LLVM trunk:
```
foo:                                    # @foo
        movsxd  rax, edi
        lea     rcx, [rip + b]
        movsd   xmm0, qword ptr [rcx + 8*rax]   # xmm0 = mem[0],zero
        lea     rcx, [rip + a]
        addsd   xmm0, qword ptr [rcx + 8*rax]
        movsd   qword ptr [rcx + 8*rax], xmm0
        ret
b:
        .zero   512

a:
        .zero   512
```

GCC/ICX/LLVM 14
```
foo:                                    # 
        movsxd  rax, edi
        movsd   xmm0, qword ptr [8*rax + a]     # xmm0 = mem[0],zero
        addsd   xmm0, qword ptr [8*rax + b]
        movsd   qword ptr [8*rax + a], xmm0
        ret
b:
        .zero   512

a:
        .zero   512
```
https://godbolt.org/z/15nMMKGof


Possible caused by opaque pointers? cc @nikic 
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzFVFtvmzAU_jXmxVpkTALkgYc2UatprTRp0tRX30I8Lqa2ydL--h2bNG3WrkulSUNgY87tO-c7HG7kQ4VycrjJGpELaUbeKszQ4jKfo8Ua0RXmx0N2OWlN685oiTfGYERL3XvcILo8yIuDIsbRVQPGoHWJsnX01pw4K9aHl1Mo03pz8_0Wezv2Dcou3tQDBCDCZ1yIZhjNSTB4QhevzuzcXmJs2T7kq6Q-lbeKxd2KKIcErB5CPiGZ9Wtf4Arvu44E5fufxko8eBvNxD6alYhehGBQlQlV0MahOp3qQI9MlX9U1pyLhL1CwqT8CJK30_ibEfiN_k-MrfLTB37k7Ek0CznBvkjpS5bZGYpvdcf1aoXo1efVHayxU9L5v-iRD3XHu4wfSnWk6BjjXMbfZfGl9z-34ruA_h-DW-8HF6zoFdy1kdy0fmZsDadHeNJFf3v75dpsXoaZ1q_GOR3mlGCjUxLzB2wGdj8qPBiYRMqC3yssRPjbe91ogRNVpXmelsUiK0kiq0wusyVLvPatqr6N3Axed6zFwkgFM81i543VfY0PA9EbXLeGgwYMuziOoEa1VYDD9DD3ktG21W8Zab8d-UyYDg5tu3vaPg3W_FDCw1E7NyoHL4tiPl8m2ypjgIorJjgp-EZRWRCVp6KkRGzmXGVJC9LWVUAkopQz0aheQsS7Mocz0JnoihJKSZmRNCcZIbOiXKYbzrNyUwoJYaAkqmO6nQUsodyJrSIsPtYOhK123j0LGWRY90rFkOCfjX5rbCXZTgfCdqx3zUMSE6liFr8AbRStSA">