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

    <tr>
        <th>Summary</th>
        <td>
            Aliasing failure to remove unnecessary store/reload
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

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

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

<pre>
    https://gcc.godbolt.org/z/j77ePhjaT
```c
struct Cache {
  static int k_ref;
  int m_data;

  Cache& init() {
 __builtin_memcpy(&m_data, &k_ref, sizeof(m_data));
    return *this;
 }

  Cache& set(int i) {
    m_data = k_ref + i;
    return *this;
  }    
};

void reset(Cache &data) {
 data.init().set(1);
}

void alias() {
  Cache *data = (Cache *)&Cache::k_ref;
  reset(*data);
}
```
clang -g0 -O2
```asm
reset(Cache&):                        # @reset(Cache&)
 movq    Cache::k_ref@GOTPCREL(%rip), %rax
        movl    (%rax), %ecx
        movl    %ecx, (%rdi)
        movl    (%rax), %eax // <-- UNNECESSARY RELOAD OF k_ref ???
        incl    %eax
        movl %eax, (%rdi)
        retq
alias():                              # @alias()
        movq    Cache::k_ref@GOTPCREL(%rip), %rax
        incl (%rax)
        retq
```
In this reduced test case, the reset() call fails to recognise that the static k_ref value and m_data shouldn't alias (as this would be UB via the __builtin_memcpy), meaning that it shouldn't be necessary to reload the k_ref value after the initial copy, meaning that the original store would be entirely superfluous.

Interestingly the alias() call, which I THINK counts as UB, gets a lot closer to what I'd expect the codegen to simplify to.

(I might have missed some particular hidden lore regarding c/c++ aliasing here.....)
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysVk1v4zgM_TXKhUjg0ImdHHLIR7MbzGA66LSHPRWKzNjqylJGktN2fv1CstN8tB3MYQMDgUnq8T2Sps2dk6UmmrHxgo1XPd74ytjZ3Zcfsja6tzXF66zyfu9YOme4ZrguhRiUptga5QfGlgzXvxiun_KcvldP_J4lK5bMWZa0l2jvnbeN8LDkoiJg-aK1AjjPvRQgtYd_Hy3tWPrmCrb6seCevxmPrgjDMAOppWc4YTg9A3183DZSeakfa6rF_jUGZB0ULoFh1ubCJTj5i8yO4eTonobrRALAkm-sBoZzX0l3crF89QkpR4FToC8viQF0goClq1YvMFyA_KOEIWPwd1nz1VVZDkYWYKnN3hUas07VGYtgGZwKN2gPDM91X2mLyFxJ7t7V-thRnL_pOss-j_XM2sqkc5bOr5t85NsBfEziOEvtrVBcl9AvE-jf4lUEd3VruagDwywCx_J-9GOYAhslHx1qedbm8DMEvlMySv66vf--vLv5GkWMrdxHzWHKxpa_nNoau28Oqs036dxvsSQ-jY2-GBVPFfLE6w9w-Qu0zy2wdNnvw8O3bzfLmx8_5nf_wN3N19v5Cm7Xx2FM1911AS-1eKPyoaTO8VuOlvzP1nI2Sb_pyUVnzo9cp_8_GhMVXlTvE-5Xs7jREB5SsFQ0ggrw5DwI7igk8hWdzfcUBFcKdlwqB96AJWFKLR2Br7iPwd0ybHtx4Koh4Lo47gxXmUYVmmHu24cxEOauJfAcfLAleFjAQfII934PRv01cS112aaV_gJ3S6BJkHPcvrYkleFFRLtgtfNkozXsEckVCBPwr8BDgLGylJorcN5YOvEk7aUl9Qqu2ZPdqcY0bnC-dDbakyXnpS7Va4Q630ChliHfcyVFBRu4_3vz7QsI02jvgDt4WARvSeEOlPEglHGBs4HnQG3DMC-AXvYkWp7CFFSSDgFO1nsld6EAF4wYTjZQy7LyUPEDQS2dowKcqQn23HopGsUtVLIoSIMKci2V3BahIILhWjBchH0fhQRjRZYG4cdw2itmaTFNp7xHs2GWT0fTNJmMe9VsvENeCBrxDEdDmiIX-XTHeTZGvuUZDntyhgmmSYo4TMdDHA8ynE52YiTSbZbn-ZazUUI1l2qg1KEO7-yedK6hWTbMMOkpviXl4vsfUdMzRCdDDJ8DdhbO9LdN6dgoUdJ5d0Lx0iuazY9qwmg3ltq5qc2BoNGnaYr9Z7huR6rXWHX9XSF91WwHwtQM1yFH99ffW_NEwjNcR2aO4Toy_y8AAP__syCD4Q">