<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/63532>63532</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Miscompilation of __builtin_usub_overflow / __builtin_usubc (regression in LLVM 15)
</td>
</tr>
<tr>
<th>Labels</th>
<td>
backend:ARM,
regression,
miscompilation
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
chfast
</td>
</tr>
</table>
<pre>
In clang/LLVM 15 (also XCode 14.3.1) the `__builtin_usubc` is mis-compiled on arm64 / aarch64.
This is the test reproducing the bug:
```cpp
using u64 = unsigned long long;
[[gnu::noinline]] auto sub(const u64 x[3], const u64 y[3])
{
u64 k = 0;
__builtin_subcll(x[0], y[0], k, &k);
__builtin_subcll(x[1], y[1], k, &k);
return __builtin_subcll(x[2], y[2], k, &k);
}
int main()
{
const u64 x[] = {0, 0, 0};
const u64 y[] = {1, 0, 0};
if (sub(x, y) != ~u64(0))
return 1; // Return 1 if result is incorrect.
return 0;
}
```
The incorrect assembly is:
```asm
ldp x8, x9, [x0]
ldp x10, x11, [x1]
cmp x8, x10
sbcs xzr, x9, x11
cset w8, lo
ldr x9, [x0, #16]
ldr x10, [x1, #16]
sub x9, x9, x10
sub x0, x9, x8
ret
```
In LLVM 16 the issue seems to be fixed. We get the following assembly:
```asm
ldp x8, x9, [x0]
ldp x10, x11, [x1]
cmp x8, x10
cset w8, lo
cmp x9, x11
csel w8, wzr, w8, ne
csinc w8, w8, wzr, hs
ldr x9, [x0, #16]
ldr x10, [x1, #16]
sub x9, x9, x10
sub x0, x9, x8
ret
```
https://godbolt.org/z/n4oxq5cz5
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzMVk1v4zYQ_TXUZRCDpCzZOugQxzCwwOayKNreAoqiZTYU6fJj4-TQ316Q8ofkxO6lhzUCOh7NvHl680SROSc7LUSNihUq1hkLfmdszXdb5nzWmPa9_qaBK6Y7RDffv__-DKQARJdMOQN_PplWAJnP8hlBtAK_E4BK_PLSBKm81C_BhYajEoN00Ev3wE2_l0q0YDQw25dzQHQDjFm-K-czhNcIPw7rbzvpYlWE9MJ5sGJvTRu41F0KNqFD-eO4BJV4-OP7_RAJLmaH2CZfQ9DpXltQRndpQflqAhA1WHU6ROD8URupldQCFWtUrIEFb8CFBtElN9r5hHtAxSqPCfQJLtH3c7Q6Ii-OjQAgZbwmRvhMIMYvskXVlEJ0GeHxEf599P9rXBAtX2OHM8YNADICIHcBAMAKH6y-BUVHUPQeFFqsx8pK7aFnUiO6_FqTqaJR7qgPWqxwRD8ui_WE6lTvUQ25XSO30bzDFA_DndAKECWx9J9QzhFd4kjxxPIkCEH5CqJbo2F_HGMRzgoXlI9WlZobawX3s09y4i-EObl16npxgQHmnOgb9Q7S3bI6c_2lWfyodg-HZbyzQ5UGU6wOyTWfsuLnQJJMB0JOueRTLu-PuQMqwdPLruEuXf6wl64RcArihI_fbwlEmWs6dkI3GSon5Re87Zj3QPhmtgvNkF2NmV3zPyXhUdJymmOFvzO0bxqGjbFMG5N0LghwQvQOvIFGwFYeRDuDPwR0wqecrVHKvMXN6TTj_x7weWb_-3RvTPb-zM62uDlwdax8G5wx_NDiOk9qfm4yKdi5G8P_FZ1y3yI77_fpGU77R2faxig_Mza-VD8Q3ei5Ofxd8I8ia-u8rfKKZaIm5XKxJHNCq2xXC8Ypo6ytWlqUC4xxKeYEc7atmu2iFTyTNcU0xyUtKSEFrWa0KdsKb8sFLkraVgs0x6JnUs2U-tnH3llyal3mRU4zxRqhXDoGUNow_ip0i_LHxx_PiFJEnxClVnRWOCeNPod66YZXOvPHcLHObB07PDShc2iOlXTeXXp66ZWonyd1YLYwPTO8mJ_CbpV5S-eDq_NE3MEvXECeHr8C0SoLVtVXaku_C82Mmx7RTeRx_HrYW_OX4B7RTRLCIbpJWvwbAAD__5tGaes">