<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/106118>106118</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Poor codegen with __builtin_subcll
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
bmaurer
</td>
</tr>
</table>
<pre>
In using __builtin_subcll to do a multi-precision comparison, clang fails to optimize to use a `cmp` and `sbb` operation. This seems to be a regression for trunk vs clang15.
https://godbolt.org/z/dsheW9YbK
```
bool edata_cmp_summary_less(edata_cmp_summary_t a, edata_cmp_summary_t b) {
unsigned long long borrow = 0;
__builtin_subcll(a.addr, b.addr, borrow, &borrow);
__builtin_subcll(a.sn, b.sn, borrow, &borrow);
return borrow != 0;
}
```
Clang trunk:
```
edata_cmp_summary_less(edata_cmp_summary_s, edata_cmp_summary_s):
cmp rsi, rcx
setb cl
cmp rdi, rdx
setb dl
sete al
and al, cl
or al, dl
ret
```
Optimal assembly (gcc / clang 15.0):
```
edata_cmp_summary_less(edata_cmp_summary_s, edata_cmp_summary_s):
cmp rsi, rcx
sbb rdi, rdx
setb al
ret
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzMVMtu6zYQ_RpqM4ggUbIsLbRIYggoumgXBYquDD7GMluKFDhU0uTrC8rO0-7NvbtrGHzNnMPRGc4IIjM6xJ5t7thml4klHn3o5SSWgCGTXj_1vzhYyLgR9nu5GBuN29MilbUQPWgPAqbFRnMzB1SGjHeg_DSLYMg7xu9BWeFGOAhjKSH8HM1knjGtF0IQwJpCTTNrChBOpx1JmXZ-xiCi8S6HP46GgBCnlUImVMAxIK33HXyAGBb3DzzQ6bpyk7Nix4rb03iMcSZW3TI-MD6MXktvY-7DyPjwzPig6Yh_dn_JX9-DWFOc_-tWem8BtYhir6Z5T8s0ifC0t0jEeHtpiCDS118zSMY7YNu7EzEsbk2CBuvdeBqkD8E_Aqt2ULDqxRHgIgeMtyIXWod0l3xbrfi0Yrx52XRfM5E78ZznL1gCxiW412B5-TFett1dVfI03q_PYk1bysw1xx9Qm65rTWu8t29fnX5qmtc5kEmooP79aCeMcvWz5_NXgD4B9P8AtL04xzSLl_P0vs8Ha2F8dPcB3lk_kwWM31Dzt1RVwoIgwknaJ2C8HZUCxodzAZabvHivxk-luJTfJbD4UpNM95Xuqk5k2JdbXjfddtvx7NirbYeHSlc1SlnJwxZV21a1wBIV54p3mel5weui5U3Z1lVZ5g3XqtJlrcqqbDtZsLrASRibW_swpeaRGaIF-7JoyrLNrJBoaW2knDt8hNXKOE99NfQJdCOXkVhdWEOR3miiiRb7370PoLzGER08mni8qNBsCbb_1MpMPC4yV35ifEiE5-lmDv5vVJHxYQ2DGB_OcT70_L8AAAD___ClyU0">