<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">