https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115693
Levy Hsu <admin at levyhsu dot com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |admin at levyhsu dot com --- Comment #7 from Levy Hsu <admin at levyhsu dot com> --- Looks like the problem is solved: https://godbolt.org/z/Y7bn77bjG #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); } compiled with trunk and --std=c++20 -O3 flags produces: compare1(std::array<std::byte, 8ul> const&, std::array<std::byte, 8ul>): cmp QWORD PTR [rdi], rsi sete al 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