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

            Bug ID: 115693
           Summary: 8 std::byte std::array comparison potential missed
                    optimization
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libstdc++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: paulhaile3 at gmail dot com
  Target Milestone: ---

It seems to be inconsistent with char array comparison and with std::bit_cast
Code Snippet: compiled with x86-64 gcc 14.1 with flags --std=c++20 -O3

#include <array>
#include <bit>
#include <cstdint>

bool compare1(const std::array<std::byte, 8> &p, std::array<std::byte, 8> r)
{
    return p == r;
}

bool compare2(const std::array<char, 8> &p, std::array<char, 8> r)
{
    return p == r;
}

// same assembly if you use char instead of byte
bool compare3(const std::array<std::byte, 8> &p, std::array<std::byte, 8> r)
{
    return std::bit_cast<uint64_t>(p) == std::bit_cast<uint64_t>(r);
}


generated assembly:

compare1(std::array<std::byte, 8ul> const&, std::array<std::byte, 8ul>):
        mov     rax, rsi
        cmp     BYTE PTR [rdi], sil
        jne     .L9
        cmp     ah, BYTE PTR [rdi+1]
        jne     .L9
        mov     rdx, rsi
        shr     rdx, 16
        cmp     BYTE PTR [rdi+2], dl
        jne     .L9
        mov     rdx, rsi
        shr     rdx, 24
        cmp     BYTE PTR [rdi+3], dl
        jne     .L9
        mov     rdx, rsi
        shr     rdx, 32
        cmp     BYTE PTR [rdi+4], dl
        jne     .L9
        mov     rdx, rsi
        shr     rdx, 40
        cmp     BYTE PTR [rdi+5], dl
        jne     .L9
        mov     rdx, rsi
        shr     rdx, 48
        cmp     BYTE PTR [rdi+6], dl
        jne     .L9
        shr     rax, 56
        cmp     BYTE PTR [rdi+7], al
        sete    al
        ret
.L9:
        xor     eax, eax
        ret
compare2(std::array<char, 8ul> const&, std::array<char, 8ul>):
        cmp     QWORD PTR [rdi], rsi
        sete    al
        ret
compare3(std::array<std::byte, 8ul> const&, std::array<std::byte, 8ul>):
        cmp     QWORD PTR [rdi], rsi
        sete    al
        ret

link to compiler explorer:
https://godbolt.org/#g:!((g:!((g:!((h:codeEditor,i:(filename:'1',fontScale:14,fontUsePx:'0',j:1,lang:c%2B%2B,selection:(endColumn:1,endLineNumber:4,positionColumn:1,positionLineNumber:4,selectionStartColumn:1,selectionStartLineNumber:4,startColumn:1,startLineNumber:4),source:'%23include+%3Carray%3E%0A%23include+%3Cbit%3E%0A%23include+%3Ccstdint%3E%0A%0Abool+compare1(const+std::array%3Cstd::byte,+8%3E+%26p,+std::array%3Cstd::byte,+8%3E+r)+%7Breturn+p+%3D%3D+r%3B%7D%0Abool+compare2(const+std::array%3Cchar,+8%3E+%26p,+std::array%3Cchar,+8%3E+r)+%7B+return+p+%3D%3D+r%3B+%7D%0Abool+compare3(const+std::array%3Cstd::byte,+8%3E+%26p,+std::array%3Cstd::byte,+8%3E+r)+%7Breturn+std::bit_cast%3Cuint64_t%3E(p)+%3D%3D+std::bit_cast%3Cuint64_t%3E(r)%3B%7D'),l:'5',n:'1',o:'C%2B%2B+source+%231',t:'0')),k:63.98956975228162,l:'4',n:'0',o:'',s:0,t:'0'),(g:!((h:compiler,i:(compiler:g141,filters:(b:'0',binary:'1',binaryObject:'1',commentOnly:'0',debugCalls:'1',demangle:'0',directives:'0',execute:'1',intel:'0',libraryCode:'0',trim:'1',verboseDemangling:'0'),flagsViewOpen:'1',fontScale:14,fontUsePx:'0',j:2,lang:c%2B%2B,libs:!(),options:'--std%3Dc%2B%2B20+-O3',overrides:!(),selection:(endColumn:1,endLineNumber:1,positionColumn:1,positionLineNumber:1,selectionStartColumn:1,selectionStartLineNumber:1,startColumn:1,startLineNumber:1),source:1),l:'5',n:'0',o:'+x86-64+gcc+14.1+(Editor+%231)',t:'0')),k:36.01043024771838,l:'4',n:'0',o:'',s:0,t:'0')),l:'2',n:'0',o:'',t:'0')),version:4

Reply via email to