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

Reply via email to