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