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