<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/90936>90936</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
miscompile related to coalescing stores in AArch64 SDAG backend
</td>
</tr>
<tr>
<th>Labels</th>
<td>
backend:AArch64,
llvm:codegen,
miscompilation,
llvm:SelectionDAG
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
regehr
</td>
</tr>
</table>
<pre>
here's a function:
```llvm
define void @f(i16 %0, ptr %1) {
%3 = trunc i16 %0 to i8
%4 = trunc i16 %0 to i14
%new0 = lshr i14 %4, 8
store i8 %3, ptr %1, align 1
%5 = getelementptr i8, ptr %1, i64 1
%6 = trunc i14 %new0 to i8
store i8 %6, ptr %5, align 1
ret void
}
```
during codegen, the two 8-bit stores are getting merged:
```
_f:
strh w0, [x1]
ret
```
but the backend seems to miss that the trunc changed the value, it dropped those 2 high bits.
I also have versions of this that improperly merge 16-bit stores and 32-bit stores.
we can demonstrate using this driver:
```c
#include <stdio.h>
void f(unsigned short, unsigned char *);
int main(void) {
unsigned char mem[8];
for (int i=0; i<8; ++i)
mem[i] = 0xee;
f(0xFFFF, mem);
for (int i=0; i<8; ++i)
printf("%x\n", mem[i]);
}
```
```
Johns-MacBook-Pro:tmp regehr$ ~/llvm-project/for-alive/bin/llc foo.ll
Johns-MacBook-Pro:tmp regehr$ clang driver.c foo.s && ./a.out
ff
ff
ee
ee
ee
ee
ee
ee
Johns-MacBook-Pro:tmp regehr$
```
in contrast, global isel properly notices that those high bits were chopped off:
```
Johns-MacBook-Pro:tmp regehr$ ~/llvm-project/for-alive/bin/llc foo.ll -global-isel
Johns-MacBook-Pro:tmp regehr$ clang driver.c foo.s && ./a.out
ff
3f
ee
ee
ee
ee
ee
ee
```
cc @hatsunespica
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0Vt2O47YOfhrmhkhgS7bjXOQimZwsToECBfYBClmmbXVlKZDkzOxNn72Q7EmTmd1pu2iBAJEp8uMn_knCe9Uboj2URyhPKzGFwbq9o54Gt2ps-3U_kCNgW48Cu8nIoKwBfoDsBNkBqmz-aX0dZ1FLnTKEV6tahCLrgNUqrxBYmQF7wktwcZ0D2yFsj7MNRhFH4CcMbjISXy0wWFT1nVLxPaW8uNMy9JwlRe0HF_eSaXT_iuWDdYSqTo4feT2h0Ko3mN8Blgmtp0CaRjIhaqv6rZ2qipsVsLJ64FrciD2c6Z5IdQdYfoOIo5DiusR-e3qThOVzTsPklOlR2pZ6MhEsDITh2WK9blSY_XoUjuKxQtQdyfXUvs_t_PlrB_yAiPjqZeeDGyDbPae8Qnl8yaE83XYdhQ_oNVNIhBohv5Bp0RONPkZmVN5jGMS8PQdPDsL01CbJVeiJUrADts5eLkluPSHDQfUDNir4zULy_yi0tziIK-GVnFfWeLQdhkEtTtR4cfZCTn-dj4959RAe0yJnd5LN_SGeCaUw2NJojQ9OBMLJx0gm_NapK7n34ZTLN-PKSD21hMCffGiV3QzA_3fvIDVR7KDJpDZt0Q_WhXj8m0QOIhbMAdgO-PHeWpmAo1AGWJ2q5rHjHgFGGqE81jGBjyCInY34dURTwE8Z8GNcPNVxAewI7Kii80UdFywF5Sk1QPZC9B4UWJ29nM_nczxMtHhH_wc8X5wyIUIDY8DKFyifTFo-3ZF68PRhD70R_mQH49c_C3m09sv6F2eBH8J4wXlYAivwd2DnOAnXF2d_IxmAnTvr1kKrKwE7NzEXZ60ldtZutP67sFIL0y_1tJmNPQKrgFW4AXYWGzuFpeS77vGf6J_9_zWbDwKmDEprghM-1WivbSM0Kk8ab21mbFCSbj0eO_fWt_hMjlAOc1vbrvveMPrXU4Hrmew6kv0v88J_MC_fjLeU8YodRPCTIX9RUszyVbvn7Y7vxIr2-TYvtlm93bHVsM-ass2rts2KvOBFIzNiVVZwWfDtNs92-UrtWcaKrMx4xstdyTaFyKpa5g2ru12R8w6KjEah9CYGd2Ndv1LeT7TfZTterbRoSPv0mGBsme3AD4eDk0NVzK0IjKXXAj_cLqdFPCov7XhRWqRHxhvtz6QpvT5Oh09xrzyt3D6luJl6D0WmlQ_-T15BBU37GyahIy1CvC4sSis0eRln9TLplcGFJX4-HT69Xkyryen9EMLFx1JkZ2DnXoVhajbSjkuJva-0FBIP7Jyi8kcAAAD__9JmtMk">