<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/59594>59594</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
miscompilation? with 3010f60381bcd828d1b409cfaa576328bcd05bbc on RISCV
</td>
</tr>
<tr>
<th>Labels</th>
<td>
backend:RISC-V,
regression,
miscompilation
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
compnerd
</td>
</tr>
</table>
<pre>
With 3010f60381bcd828d1b409cfaa576328bcd05bbc the following code seems to yield unexpected results:
```
void Fill(unsigned char* buffer, int n) {
for (int i = 0; i < n; i++)
buffer[i] = (i & 0xff);
}
```
This behavioural change only appears on optimized builds with the v extension).
BB2 seems to loose the advancement of the indicies value (`vadd.vx v8, v8, a3`).
Before:
```
_Z4FillPhi:
blez a1, .LBB0_3
li a2, 0
csrr a3, vlenb
add a4, a3, a1
addi a4, a4, -1
neg a5, a3
and a4, a4, a5
vsetvli a5, zero, e8, m1, ta, ma
vid.v v8
vsetvli zero, zero, e64, m8, ta, ma
vid.v v16
.LBB0_2:
vsetvli zero, zero, e64, m8, ta, ma
vsaddu.vx v24, v16, a2
vmsltu.vx v0, v24, a1
add a5, a0, a2
vse8.v v8, (a5), v0.t
add a2, a2, a3
vsetvli zero, zero, e8, m1, ta, ma
vadd.vx v8, v8, a3
bne a4, a2, .LBB0_2
.LBB0_3:
ret
.Lfunc_end0:
.size _Z4FillPhi, .Lfunc_end0-_Z4FillPhi
```
After:
```
_Z4FillPhi:
blez a1, .LBB0_3
li a2, 0
csrr a3, vlenb
add a4, a3, a1
addi a4, a4, -1
neg a5, a3
and a4, a4, a5
vsetvli a5, zero, e8, m1, ta, ma
vid.v v8
vsetvli zero, zero, e64, m8, ta, ma
vid.v v16
.LBB0_2:
vsaddu.vx v24, v16, a2
vmsltu.vx v0, v24, a1
add a5, a0, a2
add a2, a2, a3
vse8.v v8, (a5), v0.t
bne a4, a2, .LBB0_2
.LBB0_3:
ret
.Lfunc_end0:
.size _Z4FillPhi, .Lfunc_end0-_Z4FillPhi
```
The removals of the `vsetvli` should be harmless as the vtype is not changing (questionable if it is correct due to the tail handling, but lets ignore that). The `add a2, a2, a3` is being scheduled differently but that should be save as the `vse8.v` is not impacted by that. At that point, the only difference is the `vadd.vx v8, v8, a3`, where `a3` is `vlenb` which would be the stride, and thus is simply forwarding the index base by the stride which is being unrolled here through the vector unit.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysV81u4zYQfhr6MohAUZYsHXyIExgo0EPRLrZALwtKHFlsKdIlKSXO0xekZMf2OpvsdgWDVMiZb_74iRPunNxpxDXJNyR_XPDBd8auG9PvNVqxqI04rP-UvoOMprQtaFamdSNKVoq0XtKqaTnPV0XGyroRNK_rBnyH0BqlzJPUO2iMQHCIvQNv4CBRCRg0Pu-x8SjAohuUdyS7J_SR0ONY0PkX_xyNFLCVShFWDjo6LKDpuCXsHuqhbdES9gBSe9CEVUBWm0kRoDUWCCvDlgSSPQIl2Sa-PoCOr4Rt4q86qsARMt9Ikj9GrQABhBVAn9s2yGazBbJ6vOnyNH7qpIMaOz5KM1iugtN6h2C0OgDf75FbB0aD2XvZyxcUUA9SCQdPIeMhkSPgs0ftpAmRJefgmw17TawyxmHU4GLkusEetQfTxiWphWwkOhi5GjAEQwo6ciGS8RnGMuRuGnkWAri2g62x-Fqhy0C__LUMlfmtkycJmJ9a4UuYeRqwk183G_olm0WUnGQ4C3v0UrFx1sbNLLqmUNeXAlyIaV7OXocx_UpGnsnE8e5KRuNuks1nnEsELS60eX65Pzr0o5Kz9gtaE2aMmexjzJ7Hd36lJ0UyhozfRDvinPCKaLwv3wVMi2l5yjT7qh4_YmF0XIghnJMZg0XZYCtkhF1Z6J3y59I0Ck86pwKdqjdlnd5EclgmI8znkrAyCFcRjSb-jdPAZqQbtXwz9verdZsnlydd4_l5ZK_nnZ2XJHstiUV_3GkH3XxBLehXBUucfAnAZxyLwCeNu7Odt79C961H-z38_RZx5-cH-fszifs2aa-1fy5x4adQ94T1Pms_xMCPUe-aMd9gYJB5h1EfZuj382N-voMm_5MknzoEi70ZuXLHezPcklNpSUHBdWZQAmqEjtteoXPA3XRJ-8MeQTrQxk9XfOh8CCv_HdB5aTSvFYJsQfog1RhrsfEgBgxXd0DwXCrouBZK6l3wvx48KPQO5E4bG2527sPFDPBpcuxGeQoKsd0Ixl3ToRgUChAyNDOovTpE1IB0FovjIx7jmOItk3GGCuHIfs9jp1YfomoCcD-D7I3UPh7tbm5pjraamI0j5NuNxgM8dWineI7-B434xSgoPHWy6eDp6GsAdN5KgRFDC_Dd4IKSk_1eHUK398StCAmY-x58hpo7nLw_as-4p2QN2hoVchWd8Z01w25uv7DxxsKgpU8WYp2JKqv4AtdpsUqXRZlldNGtadq2bZNltCxZiozlgqdlVa9WVcXytmoXcs0oYylLq7RY5hlNVkVZtstqWYh6lWZNQZYUey5VotTYJ8buFtK5Add5lVfLheI1Khc7dMZq3vyDWpDs_vdf_ni4-0xYKD9hzOLOopsaxXmply408lJxPy_njwu7Dkbu6mHnyJIq6bx7NeulV7i-0su2Uz_64f8AjIbg3OfFYNW6834f-3u2JWy7k74b6qQxPWHbYHae7vbW_I2NJ2wbQ3eEbWP0_wUAAP__5emAGw">