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