On Wed, 27 Aug 2025 at 15:53, Tomasz Kamiński <[email protected]> wrote:
>
> The patch r16-3414-gfcb3009a32dc33 changed the representation of unordered to
> optimize reversing of order, but it did not update implementation of reversing
> operator<=>(0, partial_order).
>
> libstdc++-v3/ChangeLog:
>
> * libsupc++/compare
> (operator<=>(__cmp_cat::__unspec, partial_ordering)):
> Implement using _M_reverse.
>
> Signed-off-by: Tomasz Kamiński <[email protected]>
> ---
> I have forgotten that we have reverse operation. It is used when
> operator<=> is rewriten by compiler, where b <=> a, becomes 0 <=> (a <=> b),
> so it should have real impact.
>
> Testing on x86_64-linux. OK for trunk?
Oh nice, so we might get better codegen thanks to the new
representation of partial_ordering::unordered.
If we remove the _Ncmp type (as I suggested in the other thread) then
this would need to use _Ord instead of _Ncmp but that's an easy
change.
OK for trunk.
>
> libstdc++-v3/libsupc++/compare | 7 +------
> 1 file changed, 1 insertion(+), 6 deletions(-)
>
> diff --git a/libstdc++-v3/libsupc++/compare b/libstdc++-v3/libsupc++/compare
> index 2624fa9144f..ef0f0376964 100644
> --- a/libstdc++-v3/libsupc++/compare
> +++ b/libstdc++-v3/libsupc++/compare
> @@ -155,12 +155,7 @@ namespace std _GLIBCXX_VISIBILITY(default)
> [[nodiscard]]
> friend constexpr partial_ordering
> operator<=>(__cmp_cat::__unspec, partial_ordering __v) noexcept
> - {
> - if (__v._M_value & 1)
> - return partial_ordering(__cmp_cat::_Ord(-__v._M_value));
> - else
> - return __v;
> - }
> + { return partial_ordering(__cmp_cat::_Ncmp(__v._M_reverse())); }
> };
>
> // valid values' definitions
> --
> 2.50.1
>