<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/60663>60663</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[AArch64] Fold cmp+sub into [su]abd
</td>
</tr>
<tr>
<th>Labels</th>
<td>
backend:AArch64,
missed-optimization
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
SamTebbs33
</td>
</tr>
</table>
<pre>
with -Ofast
```
#include <stdint.h>
#include <stdlib.h>
void foo(int n, int32_t *restrict a,
int32_t *restrict b, int32_t *restrict c) {
for (int i = 0; i < n; ++i) {
c[i] = a[i] < b[i] ? b[i] - a[i] : a[i] - b[i];
}
}
```
llvm generates
```
.LBB0_4: // %vector.body
ldp q0, q1, [x10, #-16]
add x10, x10, #32
subs x13, x13, #8
ldp q2, q3, [x11, #-16]
add x11, x11, #32
cmgt v4.4s, v2.4s, v0.4s
sub v6.4s, v2.4s, v0.4s
cmgt v5.4s, v3.4s, v1.4s
sub v7.4s, v3.4s, v1.4s
sub v0.4s, v0.4s, v2.4s
sub v1.4s, v1.4s, v3.4s
bit v0.16b, v6.16b, v4.16b
bit v1.16b, v7.16b, v5.16b
stp q0, q1, [x12, #-16]
add x12, x12, #32
b.ne .LBB0_4
```
but GCC generates
```
.L4:
ldr q0, [x1, x4]
ldr q1, [x2, x4]
sub v3.4s, v1.4s, v0.4s
sub v2.4s, v0.4s, v1.4s
cmgt v0.4s, v1.4s, v0.4s
bsl v0.16b, v3.16b, v2.16b
str q0, [x3, x4]
add x4, x4, 16
cmp x5, x4
bne .L4
```
The compiler could use SABD here, plus UABD for the equivalent unsigned cases.
https://godbolt.org/z/7aKTPPvK8
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyUVl2v4yYQ_TXjFxTLDP5IHvwQJ00ftlJX2u3zCgyJaYnJNTjd7q-vIIlz89W9ta7McH04HObM2OHO6V2vVA1FA8U64aPv7FB_4fuvSgjHWCKs_Kf-W_uOzH7fcuchW0O2hDI7_52myHTfmlEqAmzlvNS9Tztgv7x4bLR4_zjej1ZLsrUWcK57T3rAFdG9Z_jNE8DloJwfdOsJB1ydVpDL9QwmXq1vARcEqubCsbUDOe-pCbA1yYA1MVyRPoSADWCj75YR0kLRaCjWcRG_TlZEXCeb62T2HrS8TmYTBNhED9X6nJwpuEt5vBtz3JOd6tXAvXJPgelvTZN9y8OWP7kAN4AbAlgcVevtkAbvb1Nt5CGOb1lI7xsNdyia7zTOAdmMluEgN4u4lHE8o65ghrdANwp3ArITkJ2B8xcqMKpgkwr6IRX0RE5fqGj3Ox_GY57mLmCOeAmyENxLjuOx_AB4Yi4uGHYJ6Gvm6v-As5vdJz3PwfSGcNriBiy0vzDTMjbVsZyiPEbP8XRCVVNUPOKdPzxWE37IRzz5iC98FGmvyKX6n3WGGD35dbX6af-E3rkvwOFdG0TJUUv-oHZCTofDF8jJFfbgyn-UHT74_VgcU9llH2AWztz7zaYIn_l3nwr24oCTcfkZgCtCy3upp87-Xpwxt9qioTl56tPXTpHW7g_aqIG0djSSjE6RL8tmTTo1qEB4MKMjf4T_hLe-7xRRb6M-cqN6T8Y-fgslablTLj2xdt4fXPA_vht3VgprfGqHHeDmB-Cm4p--fv58_DRPZM3kgi14ompaVmWWV_NqkXR1VVbzXMispSh5ThEZpdtyi7gV-Va0KtE1ZsgypBktC0oXKcsKtUVFRTkvWKEo5Jnac23S8LYPeyfauVHVZVaWLDFcKOPiBxxR8PYv1Utgy-VyaLsyBwz1Boh77ZySM3vweq9_cK9tH54V62SoA-9MjDsHeWa08-66k9fexF8HF75iTTbWyOAUYBPqUPfeBuPdCMWaC5mMg6nv8qZ9N4q0tXvATeA-D7PDYP9UrQfcxCM5wE081b8BAAD__6MSLMU">