<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/61505>61505</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[AArch64] [SVE] ratio of svcntb() to svcnth()
</td>
</tr>
<tr>
<th>Labels</th>
<td>
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
k-arrows
</td>
</tr>
</table>
<pre>
Test code:
```console
#include <arm_sve.h>
uint64_t f1()
{
return svcntb() / svcnth();
}
uint64_t f2()
{
return (2 * svcntb()) / (2 * svcnth());
}
uint64_t f3()
{
return (3 * svcntb()) / (3 * svcnth());
}
uint64_t f4()
{
return (4 * svcntb()) / (4 * svcnth());
}
```
armv8-a clang (trunk) generates:
```console
f1(): // @f1()
rdvl x8, #1
cnth x9
udiv x0, x8, x9
ret
f2(): // @f2()
rdvl x8, #2
rdvl x9, #1
udiv x0, x8, x9
ret
f3(): // @f3()
mov w0, #2 // =0x2
ret
f4(): // @f4()
rdvl x8, #4
rdvl x9, #2
udiv x0, x8, x9
ret
```
Only f3 is optimized as expected.
Godbolt:
https://godbolt.org/z/rze6bKj5s
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJykVU-T4i4Q_TSdC6WFQGI45KDj5Hf4HfawW3udIoEYZkiwgDh_Pv1WonEmrjvOupYlFK-732t4gvBeb1ulMojXEG8i0YXauuxpJpyzzz4qrHzNfigfUGmlAroCvAG8ggQfvqVtvTXquEqobkvTSYWA3gnXPPi9mtdA74_48NvpNiTsIaBqASQFwo_gcn2YIKdC51rk92UbikMIApIfFupjDl2PaZvLxcnl4mN1IClBQFYTmpFpCtYn8DorvcpKP2Olt7Gyq6zsM1b2Rdbx0D-KEK7ZpzOBSiPabV8suK596otvVaucCMpfcc3JBnSFrn2A5INmhqfmGXEn96YfX1IgdwgIXUzxvsMBP8vrpN4P67jPO2SfxzgVjoLJTYInhvxdKflDJ_xyJ3-nmN6keGJm1NiBED3jUfH1InSDX84bO4li76I-kLIvnSu7gJ-2ivzDVl00-bfWvKKKIu2R3QXd6DclkfBIvexUGZScfwz-z8rCmnByfR3CbvgPDD1uD-jcui2Q_A1I7t5UUvz_GPtIZlRyykWkskWy5GRBSRpHdVYJipeYFFyUXHBBJeZ8KdKkwgnmWLJIZwQTiumC4xSnOJ6ruJI4TqWoSpZQxYBh1Qht5sbsm5470t53KksWMY4jIwpl_PgEuKwPmhXd1gPDRvvg39OCDmZ4LFYrV9YJg3iDIF5__3nfz5wI2iJbTe_uYCd3S9Q5k51tig51V8xL2wDJe67jMNs5-6jKACQf9Hog-SD5VwAAAP__LWevlQ">