https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80813
--- Comment #4 from Jan Hubicka <hubicka at gcc dot gnu.org> --- Bit_reference constructor takes mask and not bit position. _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR reference operator[](size_type __n) { __glibcxx_requires_subscript(__n); return _Bit_reference (this->_M_impl._M_start._M_p + __n / int(_S_word_bit), 1UL << __n % int(_S_word_bit)); } _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR const_reference operator[](size_type __n) const { __glibcxx_requires_subscript(__n); return _Bit_reference (this->_M_impl._M_start._M_p + __n / int(_S_word_bit), 1UL << __n % int(_S_word_bit)); } this gets us back to original code: _Z1fRKSt6vectorIbSaIbEEm: .LFB1248: .cfi_startproc movq %rdi, %rax movq %rsi, %rdi movl %esi, %ecx movq (%rax), %rdx shrq $6, %rdi movl $1, %eax salq %cl, %rax andq (%rdx,%rdi,8), %rax setne %al ret