<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/113058>113058</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[RISC-V] A possible miscompilation triggered by Indexed Store RVV Intrinsics
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
Yibo-He
</td>
</tr>
</table>
<pre>
For the following code with rvv intrinsics, there seems to be a miscompilation:
```
#include <riscv_vector.h>
int printf(const char *, ...);
#define dataLen 12
int8_t data_mask[dataLen];
uint8_t data_idx[dataLen];
uint8_t a[dataLen];
uint8_t b[dataLen];
uint8_t c[dataLen];
void initialize(){
int8_t tmp_mask[dataLen] = {1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, };
uint8_t tmp_idx[dataLen] = {0, 0, 3, 8, 4, 6, 11, 5, 9, 4, 10, 6, };
uint8_t tmp_a[dataLen] = {165, 94, 49, 133, 214, 73, 163, 67, 191, 227, 214, 101, };
uint8_t tmp_b[dataLen] = {138, 171, 158, 140, 240, 123, 237, 53, 70, 254, 196, 240, };
for (int i = 0; i < dataLen; ++i) { data_mask[i] = tmp_mask[i]; }
for (int i = 0; i < dataLen; ++i) { data_idx[i] = tmp_idx[i]; }
for (int i = 0; i < dataLen; ++i) { a[i] = tmp_a[i]; }
for (int i = 0; i < dataLen; ++i) { b[i] = tmp_b[i]; }
for (int i = 0; i < dataLen; ++i) { c[i] = 0; }
}
int main(){
initialize();
int placeholder0 = dataLen;
int8_t* ptr_mask = data_mask;
uint8_t* ptr_idx = data_idx;
uint8_t* ptr_a = a;
uint8_t* ptr_b = b;
uint8_t* ptr_c = c;
for (size_t vl; placeholder0 > 0; placeholder0 -= vl){
vl = __riscv_vsetvl_e8m4(placeholder0);
vbool2_t vmask= __riscv_vmseq_vx_i8m4_b2(__riscv_vle8_v_i8m4(ptr_mask, vl), 1, vl);
vuint8m4_t va = __riscv_vle8_v_u8m4_m(vmask, ptr_a, vl);
vuint8m4_t vb = __riscv_vle8_v_u8m4_m(vmask, ptr_b, vl);
va = __riscv_vasubu_vv_u8m4_m(vmask, va, vb, __RISCV_VXRM_RNU, vl);
__riscv_vsuxei8_v_u8m4(ptr_c, __riscv_vle8_v_u8m4(ptr_idx, vl), va, vl);
// __riscv_vsoxei8_v_u8m4(ptr_c, __riscv_vle8_v_u8m4(ptr_idx, vl), va, vl); // the same error
ptr_mask += vl; ptr_idx += vl;
ptr_a += vl; ptr_b += vl; ptr_c += vl;
}
if(c[data_idx[0]] != 14) __builtin_abort(); // roundoff_unsigned(165-138, 1)
return 0;
}
```
The code can be executed successfully by GCC 14.2.0 and qemu 9.1.0.
However, the code failed when compiled by Clang 19.1.0:
```
$ clang -march=rv64gcv_zvfh -mabi=lp64d -Wno-psabi -static -O 0.c -o a.out && qemu-riscv64 a.out
Aborted (core dumped)
$ clang --version
clang version 19.1.0
Target: riscv64-unknown-linux-gnu
Thread model: posix
InstalledDir: ...
$ qemu-riscv64 --version
qemu-riscv64 version 9.1.0
Copyright (c) 2003-2024 Fabrice Bellard and the QEMU Project developers
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysV11z4yoS_TX4pUsuCdmy_OCHOJnspGpnPzI72d0nFZLaNjsIPIAUZ379FiDZ8kdyb907VS5k6OacQ9OgFjOGbyXiiszXZP4wYa3dKb36Ly9V9BknparfVo9Kg90hbJQQ6pXLLVSqRnjldge664BLq7k0vDKE3jtPjWAQGwNWQYnAoOGmUs2eC2a5kiS9I_EDie9IFve_0KUpl5VoawSS3mtuqq7osLJKT3ck_RScuLSw11zaDaF5paSxUO2YBkLvHPt0OiV0SdJ1DzkA17jhEqFmlv0VJST0iJYX1g8XDTPfyXzdu5D5wxGlHbvx-vCxF_vYXH5srm6bQ9spXgOX3HIm-E8kNHeLXfQ-AD2GbfbXqwGSPgBZrBMXptg1yXkT_7aBLE6KANoR3WVUBrbT3NQ1uWtmrsk8vMefu2Z5tCTx0f4-H7u9tixgeZyZh0xST0wTP7bwnSTzj2zhO0svgtLFyC-Jk4_5y9v8qV9gsgjBm4fezC-IhkdCg57U0819ZxEc5oF6mY3czxVslEv03J0B7jljkq793_shtd0AoWtC15zQpRN1lt18UDvKER4SzXP9eaKQCWc8p6FfQsMu8dmvRC8v0cub6H8MvBqDx2eIpz_He65hXF6e8avTn45PP-wFq3CnRI069iQnLeeXBKF3sLfa58DRMWTEVcYPvrw-nFzdpr7rybwfOzlc2EtvL98HqLxDdZ37hv_EwkInXPAuVvsphPRsNHI4nTi_JwE64QmKon_NGLSdKDBvZoTmY4DzEAN0pVKCOgUhViOMxuCPojsUPG9mRUkJzY8mgXnReYOD78PuzndQNty0oXek63xQmpljY-d6A2DrjA2heTfg-eDfgHLKR2jl70cr30G7EMRMW7ZFdwulC4I8UFE8P329fyle_vP8pXj-27cb4Kc9aQ_IB2F93KoAcqW7N7ukHEe1uxULQh8JfRzxqF_MMzC4osmwBgG1VvoUu9O5o-s-PV3aDidsNHg-h11PKK-HqpsIo3uR-9Kpf4H1l3PsLjh3L9HETXVvwSUURdlyYbksWKm0PV44w_q0amWtNpuilb6KrAnNk2weDa9B591zarStlv58Xl5350Xgv3YYysuKSVc84gGr1mINpq0qNGbTCvEG5Rv85d69Wqd0GgOTNfzApoXlNJnG0wD0Wb1ih7ovSQPmhnGBNbzuUEIoSLF2WPeCyS0kfvr71ekMKu8XNUxXO5I-6C6bbauu-Nltdm605CR9EPtsVkP0b6mivWElh8hYZnkF0d8hnlYQKWBT1VogNCM088Ijn2fZLFgC350LOdbgy1yNULfN3kV4eSUn6lAbV1d7Qxjsh4Y1hdAyvUVL0jvo6aJWfpfqVUaCy_YQbWU77IFGVkOjahTOfa8MPwTTkzSWCYH1A9fO5Orto56zpVzIOrMN6kbi7tX-TfPtzvoFu-yjcZxGNKYzeGSl5hXCGoVguvb77fb0n5--fIN_aPU_rCzU2KFQe9TmYvsm9Sqtl-mSTXCVLOgyzZJ4kU12qyzNFzFjy6SMY1zE82yDmzjPNulyk80wX0z4ytEncbJM8niWZtNswfI8Y2WVLetNTRMyi7FhXEyF6Jqp0tsJN6bFVZKk8TyfCFaiMP7TilKJr-CthFL3paVXblJUtltDZrHgxpoTjOVW-G8yd1tGL-5k-m0wvBR48TkFVvPtFnVI5SdZ4wFr-Gpd0jy_vMDT8fNs0mqx2lm7Ny7J_Rnecrtry2mlGkIfHX3_iPYhrIQ-etGG0Md-Vd2K_j8AAP__yIoQ1w">