https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116896
--- Comment #8 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Though, maybe the integral SPACESHIP pattern matching wouldn't help. Even for
std::partial_ordering
w4 (float const& lhs, float const& rhs) {
return lhs <=> rhs;
}
we pattern recognize it into
_11 = .SPACESHIP (_1, _2);
if (_11 != 0)
goto <bb 3>; [50.00%]
else
goto <bb 5>; [50.00%]
<bb 3> [local count: 536870912]:
if (_11 == 1)
goto <bb 5>; [50.00%]
else
goto <bb 4>; [50.00%]
<bb 4> [local count: 268435456]:
<bb 5> [local count: 1073741824]:
# _10 = PHI <0(2), -1(4), 1(3)>
and then expand
movss (%rdi), %xmm0
comiss (%rsi), %xmm0
je .L2
seta %al
leal -1(%rax,%rax), %eax
ret
.p2align 4,,10
.p2align 3
.L2:
xorl %eax, %eax
ret
so we are there back to what would be ideally turned into 2 setX and sbb.