<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/113489>113489</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
RISC-V: RVV register allocation problem causes costly and unecessary spill
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
camel-cdr
</td>
</tr>
</table>
<pre>
Hi, I ran into a problem, where reordering a single RVV intrinsic without changing the program logic caused llvm to spill a vector register, suggesting that the register allocation has trouble reordering in this case:
```c
#include <riscv_vector.h>
void test(int *out, const int *in, size_t n)
{
for (size_t vl; n > 0; n -= vl, out += vl, in += vl) {
vl = __riscv_vsetvl_e32m8(n);
vint32m8_t v1 = __riscv_vle32_v_i32m8(in, vl);
vint32m8_t v2 = __riscv_vadd(v1, v1, vl);
vbool4_t mlt = __riscv_vmslt(v1, 0, vl);
#ifdef REORDER
vint32m8_t v4 = __riscv_vmerge(v2, v1, mlt, vl);
#endif
vint32m8_t v3 = __riscv_vadd(v1, 3, vl);
#ifndef REORDER
vint32m8_t v4 = __riscv_vmerge(v2, v1, mlt, vl);
#endif
vbool4_t mgt = __riscv_vmsgt(v1, 4, vl);
v1 = __riscv_vadd_mu(__riscv_vmor(mlt, mgt, vl), v1, v3, v4, vl);
__riscv_vse32(out, v1, vl);
}
}
```
See also the godbolt link: https://godbolt.org/z/6vdf4vEjn
This example was adapted from real code, and minimized while still retaining the problematic behavior.
gcc manages to figure out the proper register allocation.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysVUFv6jgQ_jXmMipK7LTAIYe2FO07rdS36hUN9pDMW8dGtpNu--tXDmGhLd3TQwhsj-ebb8b2NxgjN46oFrcP4nY9wz61PtQaO7I32oTZzpu3-g8W8hF-QEAH7JIHhEPwO0tdXn9tKRAE8sFQYNcAQmTXWILnl5e8P7CLrOGVU-v7BLpF1-R9qaWM0wTswPqGNWjsIxmwduggeYgHthYQBtLJBwjUcEwUctDYNw3FdITBNGKd7IDWeo2JvYMWI6Tg-539QJEdpJYjaIwk1L0o1qI4_d4Vx6-e5lKx07Y3BEI9Bo562B4JzVuhni5dB88GEsUk5JJdAiHvfZ8yXe1dTDCtsRsz4HfaJnBCriaMxcNxAACw9wGEXE6bBivUAzgQ6gmK4_BGqHVel4-Qiyrkw3mB3eV8BR-Q82ewkK3b7ZROpDTYLSnZLYVcjpTUyWVgl7Ih0yg_ullScjtsefI75jWGPLufIl6gyI8oaIyQy6Ecncv_gdh5b6ttgs6mjwhdtOk_iOIrwvkg94b28Pz05_P66flkW11yqz4hU2goQ8szu86mKyGkImd4_33W6vus1VU83rsvbK8B_x7K39W6-VLr5lzr6sppfb4kaMy264VcniF8EHI5ceqaC2rnG3AsyRX8KcrF1VVSyOX0zr67P2KxPj2y9adnfpz-JAK00Y9C0niz8zaBZfe3UPfQpnSIWSbkRsjNZJ370Ai5eRdyczeYfTU8_XKXFP_K-kL_YHewBK8YAQ0eEhnYB99BILSgvaHMF52Bjh13_E4GXlu2BDFl7QuUkN2FWGbRxcQadtTiwD7ML2M2WkOHDhuKWT_33PSBRn2Y3A8UrsnkfGZqZVZqhTOqy4VcLUpVLIpZWxdaYqUNqt2-UittFrdGLbBcaqUKVEbPuJaFrMpCqnJ1W5bF_E5VBpHM_naBFaIWVUEdsp1nVc9Fm3GMPdVlqarlamZxRzaO_UdKR68wWoWUuR2FOjvd7PomiqqwHFM8wyROlurnHz8fb17yKeVuc60FTFU7NpcI2sdk38aa9440xYjh7dhqZn2w9afD5tT2u7n2nZCbHHr6uzkE_4t0EnIzEo5CbqaMhlr-GwAA___i6Tzf">