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