<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/135860>135860</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Missed optimization on in-order RISC-V
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
chadaustin
</td>
</tr>
</table>
<pre>
I've observed situations where clang and rustc will generate suboptimal code for in-order RISC-V cores that support multiple parallel loads.
In general, as many clobbered temporary registers as possible should be used to hoist loads before any instructions that use them.
C:
```C
void inc2(int* __restrict a, int* __restrict b, int* __restrict c, int* __restrict d)
{
(*a)++;
(*b)++;
(*c)++;
(*d)++;
}
```
rv64gc gcc:
```
inc2(int*, int*, int*, int*):
lw a7,0(a0)
lw a6,0(a1)
lw a4,0(a2)
lw a5,0(a3)
addiw a7,a7,1
addiw a6,a6,1
addiw a4,a4,1
addiw a5,a5,1
sw a7,0(a0)
sw a6,0(a1)
sw a4,0(a2)
sw a5,0(a3)
ret
```
rv64gc clang:
```
inc2(int*, int*, int*, int*):
lw a4, 0(a0)
lw a5, 0(a1)
addi a4, a4, 1
sw a4, 0(a0)
lw a0, 0(a2)
lw a4, 0(a3)
addi a5, a5, 1
sw a5, 0(a1)
addi a0, a0, 1
addi a4, a4, 1
sw a0, 0(a2)
sw a4, 0(a3)
ret
```
You can see the same issue in rustc's output: https://gcc.godbolt.org/z/b8na96EhW
I apologize if duplicate - could not find another issue about this.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJysVUuP4zYM_jXKhUggy6_44EM22wBz6KUFWvS00IOxVSiSoUeCmV9f-DGZTSbZudQwGIOk-X0f6Yg8BN1ZxJaU30j5fcVT7J1vZc8VTyFquxJOvbYvhNVnBCcC-jMqCDomHrWzAS49egRpuO2AWwU-hSjhoo2BDi16HhFCEm6I-sQNSKcQjs6DtmvnFXr44-XP_fovkM5jgNjzCCENg_MRTslEPRiEgXtuDBowjquwIXRH6O7FLgCGsD3wACduX0EaJwR6VBDxNDjP_St47HSI6MOYNbgQtDAIoXfJKBAIKYzpDnqnQ5wxQODReYSxpLYh-iRnuRPBFBBij6eFyZ7ku_mJVHS-94Tuzk4r0FYywrbaRsJ28OOHxxC9lhH4yPqzWzx2y8duRVgzwtbfCN0BABC2JWzHRzf7Nt75bUQ8jcj7yOxWd25Sf_9Z5yzbn6uik9BJ-bkThO5uevAh5PFTM5cAc4Hp4jVhe0rYltNZLCzXNaF6T8ieJBTvCWxJuEbK90h--ypXSl_ewSeTPYqOyJOZolf3iDeZhy-NmJP5ORqeqg1fyQxPZd4nfFLrMT4d5vSP_v_G-TGTiSf8cqLlNSP7PJer1sVmN136uji9ZrBffC9w06gr7sRstg_H9zXzCX622U3pe0n3pZ_yfqD97nN-OOd_XALJLQScDjMI_ISgQ0gI2s7HOGF1AJfikCLJd9DHOIRxnuxA2KGTctM5JZyJG-c7wg5vhB3E1vKm-q3_ezmkgQ_OuE6_IegjqDQYLceVsAY5Hb_WRThqq4BbF3v0CwMuXIoQex02K9XmqskbvsI2q4uiLlnVFKu-zXOR06qhos5rLsqyKYtK5IWiVFRH1lQr3TLKSlpkJcvyLC82eVlssanzSmVlRimSguKJa7Mx5nwaRawm9DbLy21FV4YLNGFajYxZvMzcCGPjpvTt-NJapC6QghodYvgoE3U02P6uw7hZptWn36Z9Cc7eb75V8qa9a62OfRIb6U6EHcaiy8968O5flJGww0QlEHZYuJ5b9l8AAAD__4gGIIE">