<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/60012>60012</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[X86] Recognize Clang's `<=>` code pattern
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
scottmcm
</td>
</tr>
</table>
<pre>
Today, this code <https://cpp.godbolt.org/z/e8q15zzK1>
```cpp
#include <compare>
std::strong_ordering cmp(int a, int b) {
return a <=> b;
}
```
gives this select chain
```llvm
define dso_local i8 @_Z3cmpii(i32 noundef %0, i32 noundef %1) local_unnamed_addr #0 {
%3 = icmp slt i32 %0, %1
%4 = select i1 %3, i8 -1, i8 1
%5 = icmp eq i32 %0, %1
%6 = select i1 %5, i8 0, i8 %4
ret i8 %6
}
```
which compiles to some pretty verbose assembly:
```asm
cmp(int, int): # @cmp(int, int)
cmp edi, esi
setl al
neg al
or al, 1
xor ecx, ecx
cmp edi, esi
movzx eax, al
cmove eax, ecx
ret
```
There are other ways of doing this that are definitely better for size, and probably better for speed too <https://graphics.stanford.edu/~seander/bithacks.html#CopyIntegerSign>
For example, it could be
```asm
cmp(int, int): # @cmp(int, int)
cmp edi, esi
setg al
setl cl
sub al, cl
ret
```
(I've filed this as x86-specific because the `select`s in LLVM-IR might be better for optimizations to use, as more obvious that the subtraction. The specific pattern that Clang emits for `<=>` is most important, but it would be nice if it also recognized -- or canonicalized in IR -- the [bunch of equivalent](https://discourse.llvm.org/t/representing-in-ir/67369/3?u=scottmcm) select chains.)
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysVk1v4zYT_jX0ZWBDIiN_HHzYjddA8O572S6KopeAIsfStBSpJSkn9qG_vSAlx4mzSFGgRGAp8_HMiM_DDxkCNRZxy6rPrNrN5BBb57dBuRg71c1qp0_b707LE-P3EFsKoJxGYOK-jbEPTHxifM_4XvX9onG6diYunG8Y358Z3-P6R1mdz_8rmfjCih0rPrFlMf6pvp8sXJBVZhhRlet66fElPkSdaohPIXpnm0fnNXqyDaiuZ3xNNoJMraWXmvENsNXnMRMAwGMcvAWZkJnYMfEFaiamALba3fQ0_tvQEcP4rQENqgiqlWRvYo05dqNJ44Esgg7u0TglDdAa2F3x-LtQXU-UuhQcrBusxgMwXhW54be2MvWe0x8Ha2WH-lFq7YFxUbz-JsYrAUzsgFTXQzAxA11AM9A18i5HTh9BZU7OtdcwL6eX1_HVFRl_fAS8fA9cTXjF9EzlLxke42Rafjz1Ty2pFpIGyCQOHATXIfQeYzzBEX3tAoIMAbvanJIw3qLIMHHyoo5JG4xvmMiS-GAwLhJxP8t9UVQaaX7SQE0pBAO99QeMJj2lmewWG3hjmIbzcLHz-ysT43ievKiecxX1PPn_qXznjufn5Jc58bao6twRr-4rrsf4U1LG3-8tegTpEVxs0cOTPAVwB9Aurca8WmIrY47IK4IimhPUGCN6ODgPgc6YG7Iaeu9qWd_4e0QN0bn3u0vjZd-SCosQpT04rxeoB8b3fwWUVqNnfF9TbKX6Myza2BnGxb3rTw82YoP-F2rsdQPKv3vnAZ9l15vcEkVQbjAaavyXivoPNdO8kchFROqGvjDUrzRz6_2YQ8bXD4yvjggHMmmuE2sywPN6OQ89KjqQghqVHAJCbBHYshgXeXoBsvD166__nz98g46aNkKNr_lzfaSOzjKSs3ntDmHkO0Dnkm7qI7lhkklCD0MdvVQpfgHwPVkuTfQywdox9t5I2wB2FEMulL7qsp-zZQGUCoQI1PXORzmSUA8x0fo00QqWFAIdkk2a4MCjco2lM2qYz9NKVNI6S0qabCMLD9-SJ09D9bkerGqT3vHHQEdp0EZW7RhfvxWqpqDc4AMu0vkwnYSR8b3H3mNAG8k2c7JzSppdrsRyw_heMLEfmNhdjt10Frw-esKC8c1Mb4XeiI2c4bZMmWItymrWbhVypWrUAjebTbESd0JUWMlyWawk3q2WM9rygouiLEW5EWVVLSSvVtWhLvhBF4dVjeyuwE6SeWl6RiEMuF0WRclnRtZoQr4hcG7xCbKTcZ4uDH6bcub10AR2VxgKMVxRIkWTrxa_rZes2sG3y5yPlDK-Cu_IzNeLif7Z4M32Zieg2A71QrmO8X0-g8fHvPfujyRUvs_thTS9qf2_AwAA__9Pm5Xq">