<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/142323>142323</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            bad codegen for `sqsub` on `aarch64`
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          folkertdev
      </td>
    </tr>
</table>

<pre>
    There appears to be a regression for this code between trunk and 20.1.0:

https://godbolt.org/z/9sa318eEn

```llvm
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32"
target triple = "aarch64-unknown-linux-gnu"

define void @foo(ptr dead_on_unwind noalias nocapture noundef writable writeonly sret([8 x i8]) align 8 dereferenceable(8) initializes((0, 8)) %_0, ptr noalias nocapture noundef readonly align 8 dereferenceable(8) %a, ptr noalias nocapture noundef readonly align 8 dereferenceable(8) %b) unnamed_addr {
start:
  %0 = load <1 x i64>, ptr %a, align 8
  %1 = load <1 x i64>, ptr %b, align 8
  %2 = tail call <1 x i64> @llvm.aarch64.neon.sqsub.v1i64(<1 x i64> %0, <1 x i64> %1) #3
  store <1 x i64> %2, ptr %_0, align 8
  ret void
}

define void @bar(ptr dead_on_unwind noalias nocapture noundef writable writeonly sret([8 x i8]) align 8 dereferenceable(8) initializes((0, 8)) %_0, ptr noalias nocapture noundef readonly align 8 dereferenceable(8) %a, ptr noalias nocapture noundef readonly align 8 dereferenceable(8) %b) unnamed_addr {
start:
  %0 = load <1 x i64>, ptr %a, align 8
  %1 = load <1 x i64>, ptr %b, align 8
  %2 = tail call <1 x i64> @llvm.ssub.sat.v1i64(<1 x i64> %0, <1 x i64> %1)
  store <1 x i64> %2, ptr %_0, align 8
  ret void
}

declare <1 x i64> @llvm.aarch64.neon.sqsub.v1i64(<1 x i64>, <1 x i64>) unnamed_addr #1

declare <1 x i64> @llvm.ssub.sat.v1i64(<1 x i64>, <1 x i64>) #2
```

on trunk

```asm
foo:                                    // @foo
        ldr     d0, [x0]
        ldr     d1, [x1]
        fmov    x9, d1
        fmov    x10, d0
        subs    x9, x10, x9
        asr x10, x9, #63
        eor     x10, x10, #0x8000000000000000
        csel x9, x10, x9, vs
        fmov    d0, x9
        str     d0, [x8]
 ret
bar:                                    // @bar
        ldr     x9, [x1]
        ldr     x10, [x0]
        subs    x9, x10, x9
        asr x10, x9, #63
        eor     x10, x10, #0x8000000000000000
        csel x9, x10, x9, vs
        fmov    d0, x9
        str     d0, [x8]
 ret
```

on 20.1.0

```asm
foo:                                    // @foo
        ldr     d0, [x0]
        ldr     d1, [x1]
        sqsub   d0, d0, d1
        str     d0, [x8]
        ret
bar: // @bar
        ldr     x9, [x1]
        ldr     x10, [x0]
 subs    x9, x10, x9
        asr     x10, x9, #63
        eor     x10, x10, #0x8000000000000000
        csel    x9, x10, x9, vs
        fmov    d0, x9
        str     d0, [x8]
        ret
``` 

The target-independent version should emit the same as the neon version, but not like that!

cc https://github.com/llvm/llvm-project/issues/94463 https://github.com/llvm/llvm-project/pull/140454 @davemgreen 
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzsV1Fz4yYQ_jX4hbEHFkmRHvTgXM5_oPeeQWJt02BwATm--_UdkJyzY18vuUlnOm01GhDiW3bZ_dBqZQh6YxFbUt6T8mEmh7h1vl0784Q-KjzMOqe-tl-26JHK_R6lDzQ62iGV1OPGYwjaWbp2nsatDrR3CmmH8RnR0ugH-0SlVRTYgi8YEUvC0r2NcR_SCFYEVhunOmfiwvkNgdU3AqsmSMFr_GxHOKnYeBtz2BG2jNJvMFIlozTyqxsiJeKBEgCc74hY4nwPd0mZgNykIb8cpqeqyM1c10Qs63FK84qIZW7S6AXCIQE41HMrRtn5b2m0SkOA7zZFr_cGT_ZI6fttVcwH-2Tds50bbYfjfGOHUYawpcK1tkgPTitKCrZ2jkC9j54qlOrR2cfBPmurqHXSaBmodb3cx8EjtW6wCtf02esoO4P5AZ01X2nwGAnUpLyv6ZHqmpQPBBoqjd5YWlOFHtfo0faYBAnUdZrWVkctjf6GIQlDzQh8omkqzRIoH_OLZNyPrfEoVbbhJ8oIlPJDV-tSP1grd6gepVKekrt7wpYhSh9H4tGEYzk2xklFifjEk39SlD-fjDkZNmk8ifGfi3U3xCCLRakN7aUxl7Ip4InRi4kmC4vOLsIfYegWB54wiXUXAlDmGFy95aMXhMiKQ3Qer0FwZuwYy3NrPcZMw8TLu4eb7Oyk_5-d_zl2hsTHIOOvcPKj6dgbeb3UO0_RlbHXsQHB36Lxrz1zUw8BAecZbVTjplz5Kt3JkLJdygliSd9wjen0lEfYi4xRPvdqDFR5f2Tp0N0A8BOAXwLWO3dI_bFJAMVvTfG8umJnc2HownexCXFszhAy-LP3STmISpwB0I2mnUBjR0CwY80urzOpPqC50gqf6CHcsFxdmxXia4_Vk0PSx4st05fwvTFJMtcun3Z97fIXAP9R1P613r0-HdP_4z_1eOSvzcsKU8vftOPpuqDV38GZt5HlnAsfTZgbyj-EMxcefCEHHcnyZYt0_DWfa6twj1ahjfSAPtctYesGoyjudKRxizTIHVIZ8nPKIydg0tkNkVoXqdFPSONWRgJTluh7-qqi0XE7dIve7QisctEydvO9d79jHwmsdAhD-pVZNUVRiffL7wdjCKx4wYqySFRR8oC7jU9110y1QjWikTNs-V1R17yChs-2rZC9LEVTNn1TM1nLEsqK3dWN5Jj6aqZbYFCyinEAXnO-YCAqBCh6xZquUxUpGO6kNoucAJ3fzPJGWl6AADEzskMTcjUJYPGZ5tlU7ZQPM9_mPXTDJqQMqkMM35eJOhpsO6lyCbnBsaYkFctnKwXU2TScsjyp2Gzwpv11v08WH1r4MwAA___wohgd">