<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/127978>127978</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Missed optimization: failed to optimize loads with restrict qualifiers (aliasing issue)
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
3y3p4tch
</td>
</tr>
</table>
<pre>
Code to reproduce:
```c++
#include <cstddef>
#include <atomic>
#include <cstring>
#include <atomic>
struct S {
public:
S(std::byte* a, uint64_t b, uint64_t c);
public:
void write(std::byte* __restrict__ ptr, const std::byte* __restrict__ data, std::size_t size) {
// since ptr is restrict, it cannot alias `this` pointer.
std::memcpy(ptr, data, size);
b += size;
/* std::atomic_ref{b}.store(b + size, std::memory_order_release); */
}
template <typename T>
void write(const T& value) {
write(a + (b & c), reinterpret_cast<const std::byte*>(&value), sizeof(T));
}
private:
std::byte* a;
uint64_t b;
uint64_t c;
};
void foo(S& s) {
const auto iterations = 100;
for (uint32_t i = 0; i < iterations; i++) s.write(i);
}
```
generated assembly:
```asm
foo(S&):
mov rax, qword ptr [rdi + 8]
xor ecx, ecx
.LBB0_1:
mov rdx, qword ptr [rdi] # s.a -> should be hoisted out of the loop
mov rsi, qword ptr [rdi + 16] # s.c -> should be hoisted out of the loop
and rsi, rax
mov dword ptr [rdx + rsi], ecx
lea rdx, [rax + 4]
mov rsi, qword ptr [rdi]
and rdx, qword ptr [rdi + 16]
lea r8d, [rcx + 1]
mov dword ptr [rsi + rdx], r8d
add rax, 8
add ecx, 2
cmp ecx, 100
jne .LBB0_1
mov qword ptr [rdi + 8], rax
ret
```
See [live example at Compiler Explorer](https://llvm.godbolt.org/z/nTW8b1Ks5)
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJyUVk2PozgQ_TXOpTSRMUmAAweSTC67e-qW9ogMriQeGczYJt2ZX7-ygYRs0vsxiuRpyvXeq1dlA7dWnlrEnKy3ZL1f8N6dtcnja9ytXH1eVFpc850WCE6Dwc5o0ddI4oLQgmzo8KsJ2_ofLQiLZVurXiCQeFdbJwQeSfz9KcSdbmT9KlJbZ2R7-tckWlhn-trBG5DEc3d9pXzUhwAA3ghLrRP-QVxUV4eEFcAJ20EvW7dZlQ6qh79qwjISbwfwB7SLlgI-jPQYz5hladCLrl1ZQueMB611ax3881bBXZBz22XlLywd-IWwbCwLxn-EHQg7gJVtjZ4FpIUJzKNIBzVvW-2AK8ktkA11Z2nJhkKnZevQLGdoN84Gm7q7EpaOwm-iBhGDH1NWBb7N8X6IDqGgq7gDDk0qDR5Jsq1Isl9ap403LmSPwLsHBdpcS20EmtKgQm5HZiCs8PCeJdkPffEyHDad4i7MhLt22PIG4X2YCx9_aNfQiXfCNnDhqp87O23hQdiocDPMAduBwWBbZ9CVNbfOD-fLtnpmlhK2mQgmA_WRsPQ9PJicvBXSGXnhDu_z-mJWb-bPJvb5WT0ObbK_TW9w4Kg1YembL8k-ztNQBu-dBunQcCd1a8E3NqL0znDUxrviiWJWOpBhi98Q_rubJYdn4zXAMrDLyVt5P1RD5dOlMQg9YeshUAC3FptKXf92t3DbEFrcSwlwxWwmG30Jq-Gf3vafH9qIcD7IemuEDK1Nydpzw6c2YS_WYa9faLH8fbulZfQFqniJStZ7uB_MGOySwzcSfwd71r0SUCGctbS-Lt070EdwZwSldfeKw8ovlUebkWpgqf8_C2_FnMXb9CxBPHJ_Bm6fsd7fjZqSFPK5Nz6DDxmr0ef_VuDj5pvO147f3XilJBWTknpQEr1W8linHVA941Cnx5kpEmI-WemL0DhIbBaqm24e8gfqHvzRYlinmXtW-PX83ptn0D2fpDdEn6LkBQE_edMpBO5gp5tOKjTw_bNT2qAJUOnZuc76kQ9vFaUuzfKkRaWVW2pzIuzwi7BD-_5nWkW_2TVh2ULkscjijC8wj5IVpatVvEoX55zFVbZZU7ZKMKuiKok2KaM8WfE4YtE6qhYyZ5StKWOUZnFG02VyjKI6w0xsKE_TiJMVxYZLtQwytDktpLU95hFLsiRdKF6hsuEDhbEWPyBECWP-e8XkPulb1Z8sWVElrbN3GCedwvwPaa0_IZ2TjfwVrisSF3DkUqHwnzVjxJ8cLix8SHe-vVnhZ8-VPEo01l-F4dUq29OkIVv0RuWPZp6kO_fVstbN6Oy4fOuM_oH-ZX0I2Zaww1jiJWd_BQAA__8qPLqq">