<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">