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