https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117612

            Bug ID: 117612
           Summary: spaceship codegen is inferior to hand written operator
                    when comparing doubles
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: cuzdav at gmail dot com
  Target Milestone: ---

Codegen for using spaceship operator is not as good as normal operators with
obvious implementations with -std=c++20 and -O3

This code was run on Linux X86_64.  This is the same code output from gcc 11.2
through the trunk.  This code demonstrates:

    #include <compare>

    struct CustomOperators {
        double value;
        friend bool operator<(const CustomOperators& a, 
                              const CustomOperators& b) {
            return a.value < b.value;
        }
    };

    struct SpaceOperators {
        double value;
        friend auto operator<=>(SpaceOperators, SpaceOperators) = default;
    };

    bool lt(CustomOperators l, CustomOperators r) { return l < r; }
    bool lt(SpaceOperators l, SpaceOperators r) { return l < r; }

As seen on Compiler Explorer
https://godbolt.org/z/zrhM5bE94

OUTPUT:

lt(CustomOperators, CustomOperators):
        comisd  xmm1, xmm0
        seta    al
        ret

lt(SpaceOperators, SpaceOperators):
        ucomisd xmm0, xmm1
        jp      .L7
        mov     eax, 0
        jne     .L7
        ret
.L7:
        comisd  xmm1, xmm0
        seta    al
        ret

It's worth noting that clang generates identical (good) code for both hand
written and for the spaceship operator, also visible in above godbolt link.

Reply via email to