1 //===- llvm/ADT/BitVector.h - Bit vectors -----------------------*- C++ -*-===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // This file implements the BitVector class.
11 //===----------------------------------------------------------------------===//
13 #ifndef LLVM_ADT_BITVECTOR_H
14 #define LLVM_ADT_BITVECTOR_H
16 #include "llvm/ADT/ArrayRef.h"
17 #include "llvm/ADT/iterator_range.h"
18 #include "llvm/Support/MathExtras.h"
29 /// ForwardIterator for the bits that are set.
30 /// Iterators get invalidated when resize / reserve is called.
31 template <typename BitVectorT
> class const_set_bits_iterator_impl
{
32 const BitVectorT
&Parent
;
36 assert(Current
!= -1 && "Trying to advance past end.");
37 Current
= Parent
.find_next(Current
);
41 const_set_bits_iterator_impl(const BitVectorT
&Parent
, int Current
)
42 : Parent(Parent
), Current(Current
) {}
43 explicit const_set_bits_iterator_impl(const BitVectorT
&Parent
)
44 : const_set_bits_iterator_impl(Parent
, Parent
.find_first()) {}
45 const_set_bits_iterator_impl(const const_set_bits_iterator_impl
&) = default;
47 const_set_bits_iterator_impl
operator++(int) {
53 const_set_bits_iterator_impl
&operator++() {
58 unsigned operator*() const { return Current
; }
60 bool operator==(const const_set_bits_iterator_impl
&Other
) const {
61 assert(&Parent
== &Other
.Parent
&&
62 "Comparing iterators from different BitVectors");
63 return Current
== Other
.Current
;
66 bool operator!=(const const_set_bits_iterator_impl
&Other
) const {
67 assert(&Parent
== &Other
.Parent
&&
68 "Comparing iterators from different BitVectors");
69 return Current
!= Other
.Current
;
74 typedef unsigned long BitWord
;
76 enum { BITWORD_SIZE
= (unsigned)sizeof(BitWord
) * CHAR_BIT
};
78 static_assert(BITWORD_SIZE
== 64 || BITWORD_SIZE
== 32,
79 "Unsupported word size");
81 MutableArrayRef
<BitWord
> Bits
; // Actual bits.
82 unsigned Size
; // Size of bitvector in bits.
85 typedef unsigned size_type
;
86 // Encapsulation of a single bit.
88 friend class BitVector
;
94 reference(BitVector
&b
, unsigned Idx
) {
95 WordRef
= &b
.Bits
[Idx
/ BITWORD_SIZE
];
96 BitPos
= Idx
% BITWORD_SIZE
;
100 reference(const reference
&) = default;
102 reference
&operator=(reference t
) {
107 reference
& operator=(bool t
) {
109 *WordRef
|= BitWord(1) << BitPos
;
111 *WordRef
&= ~(BitWord(1) << BitPos
);
115 operator bool() const {
116 return ((*WordRef
) & (BitWord(1) << BitPos
)) != 0;
120 typedef const_set_bits_iterator_impl
<BitVector
> const_set_bits_iterator
;
121 typedef const_set_bits_iterator set_iterator
;
123 const_set_bits_iterator
set_bits_begin() const {
124 return const_set_bits_iterator(*this);
126 const_set_bits_iterator
set_bits_end() const {
127 return const_set_bits_iterator(*this, -1);
129 iterator_range
<const_set_bits_iterator
> set_bits() const {
130 return make_range(set_bits_begin(), set_bits_end());
133 /// BitVector default ctor - Creates an empty bitvector.
134 BitVector() : Size(0) {}
136 /// BitVector ctor - Creates a bitvector of specified number of bits. All
137 /// bits are initialized to the specified value.
138 explicit BitVector(unsigned s
, bool t
= false) : Size(s
) {
139 size_t Capacity
= NumBitWords(s
);
140 Bits
= allocate(Capacity
);
146 /// BitVector copy ctor.
147 BitVector(const BitVector
&RHS
) : Size(RHS
.size()) {
149 Bits
= MutableArrayRef
<BitWord
>();
153 size_t Capacity
= NumBitWords(RHS
.size());
154 Bits
= allocate(Capacity
);
155 std::memcpy(Bits
.data(), RHS
.Bits
.data(), Capacity
* sizeof(BitWord
));
158 BitVector(BitVector
&&RHS
) : Bits(RHS
.Bits
), Size(RHS
.Size
) {
159 RHS
.Bits
= MutableArrayRef
<BitWord
>();
163 ~BitVector() { std::free(Bits
.data()); }
165 /// empty - Tests whether there are no bits in this bitvector.
166 bool empty() const { return Size
== 0; }
168 /// size - Returns the number of bits in this bitvector.
169 size_type
size() const { return Size
; }
171 /// count - Returns the number of bits which are set.
172 size_type
count() const {
173 unsigned NumBits
= 0;
174 for (unsigned i
= 0; i
< NumBitWords(size()); ++i
)
175 NumBits
+= countPopulation(Bits
[i
]);
179 /// any - Returns true if any bit is set.
181 for (unsigned i
= 0; i
< NumBitWords(size()); ++i
)
187 /// all - Returns true if all bits are set.
189 for (unsigned i
= 0; i
< Size
/ BITWORD_SIZE
; ++i
)
193 // If bits remain check that they are ones. The unused bits are always zero.
194 if (unsigned Remainder
= Size
% BITWORD_SIZE
)
195 return Bits
[Size
/ BITWORD_SIZE
] == (1UL << Remainder
) - 1;
200 /// none - Returns true if none of the bits are set.
205 /// find_first_in - Returns the index of the first set bit in the range
206 /// [Begin, End). Returns -1 if all bits in the range are unset.
207 int find_first_in(unsigned Begin
, unsigned End
) const {
208 assert(Begin
<= End
&& End
<= Size
);
212 unsigned FirstWord
= Begin
/ BITWORD_SIZE
;
213 unsigned LastWord
= (End
- 1) / BITWORD_SIZE
;
215 // Check subsequent words.
216 for (unsigned i
= FirstWord
; i
<= LastWord
; ++i
) {
217 BitWord Copy
= Bits
[i
];
219 if (i
== FirstWord
) {
220 unsigned FirstBit
= Begin
% BITWORD_SIZE
;
221 Copy
&= maskTrailingZeros
<BitWord
>(FirstBit
);
225 unsigned LastBit
= (End
- 1) % BITWORD_SIZE
;
226 Copy
&= maskTrailingOnes
<BitWord
>(LastBit
+ 1);
229 return i
* BITWORD_SIZE
+ countTrailingZeros(Copy
);
234 /// find_last_in - Returns the index of the last set bit in the range
235 /// [Begin, End). Returns -1 if all bits in the range are unset.
236 int find_last_in(unsigned Begin
, unsigned End
) const {
237 assert(Begin
<= End
&& End
<= Size
);
241 unsigned LastWord
= (End
- 1) / BITWORD_SIZE
;
242 unsigned FirstWord
= Begin
/ BITWORD_SIZE
;
244 for (unsigned i
= LastWord
+ 1; i
>= FirstWord
+ 1; --i
) {
245 unsigned CurrentWord
= i
- 1;
247 BitWord Copy
= Bits
[CurrentWord
];
248 if (CurrentWord
== LastWord
) {
249 unsigned LastBit
= (End
- 1) % BITWORD_SIZE
;
250 Copy
&= maskTrailingOnes
<BitWord
>(LastBit
+ 1);
253 if (CurrentWord
== FirstWord
) {
254 unsigned FirstBit
= Begin
% BITWORD_SIZE
;
255 Copy
&= maskTrailingZeros
<BitWord
>(FirstBit
);
259 return (CurrentWord
+ 1) * BITWORD_SIZE
- countLeadingZeros(Copy
) - 1;
265 /// find_first_unset_in - Returns the index of the first unset bit in the
266 /// range [Begin, End). Returns -1 if all bits in the range are set.
267 int find_first_unset_in(unsigned Begin
, unsigned End
) const {
268 assert(Begin
<= End
&& End
<= Size
);
272 unsigned FirstWord
= Begin
/ BITWORD_SIZE
;
273 unsigned LastWord
= (End
- 1) / BITWORD_SIZE
;
275 // Check subsequent words.
276 for (unsigned i
= FirstWord
; i
<= LastWord
; ++i
) {
277 BitWord Copy
= Bits
[i
];
279 if (i
== FirstWord
) {
280 unsigned FirstBit
= Begin
% BITWORD_SIZE
;
281 Copy
|= maskTrailingOnes
<BitWord
>(FirstBit
);
285 unsigned LastBit
= (End
- 1) % BITWORD_SIZE
;
286 Copy
|= maskTrailingZeros
<BitWord
>(LastBit
+ 1);
289 unsigned Result
= i
* BITWORD_SIZE
+ countTrailingOnes(Copy
);
290 return Result
< size() ? Result
: -1;
296 /// find_last_unset_in - Returns the index of the last unset bit in the
297 /// range [Begin, End). Returns -1 if all bits in the range are set.
298 int find_last_unset_in(unsigned Begin
, unsigned End
) const {
299 assert(Begin
<= End
&& End
<= Size
);
303 unsigned LastWord
= (End
- 1) / BITWORD_SIZE
;
304 unsigned FirstWord
= Begin
/ BITWORD_SIZE
;
306 for (unsigned i
= LastWord
+ 1; i
>= FirstWord
+ 1; --i
) {
307 unsigned CurrentWord
= i
- 1;
309 BitWord Copy
= Bits
[CurrentWord
];
310 if (CurrentWord
== LastWord
) {
311 unsigned LastBit
= (End
- 1) % BITWORD_SIZE
;
312 Copy
|= maskTrailingZeros
<BitWord
>(LastBit
+ 1);
315 if (CurrentWord
== FirstWord
) {
316 unsigned FirstBit
= Begin
% BITWORD_SIZE
;
317 Copy
|= maskTrailingOnes
<BitWord
>(FirstBit
);
322 (CurrentWord
+ 1) * BITWORD_SIZE
- countLeadingOnes(Copy
) - 1;
323 return Result
< Size
? Result
: -1;
329 /// find_first - Returns the index of the first set bit, -1 if none
330 /// of the bits are set.
331 int find_first() const { return find_first_in(0, Size
); }
333 /// find_last - Returns the index of the last set bit, -1 if none of the bits
335 int find_last() const { return find_last_in(0, Size
); }
337 /// find_next - Returns the index of the next set bit following the
338 /// "Prev" bit. Returns -1 if the next set bit is not found.
339 int find_next(unsigned Prev
) const { return find_first_in(Prev
+ 1, Size
); }
341 /// find_prev - Returns the index of the first set bit that precedes the
342 /// the bit at \p PriorTo. Returns -1 if all previous bits are unset.
343 int find_prev(unsigned PriorTo
) const { return find_last_in(0, PriorTo
); }
345 /// find_first_unset - Returns the index of the first unset bit, -1 if all
346 /// of the bits are set.
347 int find_first_unset() const { return find_first_unset_in(0, Size
); }
349 /// find_next_unset - Returns the index of the next unset bit following the
350 /// "Prev" bit. Returns -1 if all remaining bits are set.
351 int find_next_unset(unsigned Prev
) const {
352 return find_first_unset_in(Prev
+ 1, Size
);
355 /// find_last_unset - Returns the index of the last unset bit, -1 if all of
356 /// the bits are set.
357 int find_last_unset() const { return find_last_unset_in(0, Size
); }
359 /// find_prev_unset - Returns the index of the first unset bit that precedes
360 /// the bit at \p PriorTo. Returns -1 if all previous bits are set.
361 int find_prev_unset(unsigned PriorTo
) {
362 return find_last_unset_in(0, PriorTo
);
365 /// clear - Removes all bits from the bitvector. Does not change capacity.
370 /// resize - Grow or shrink the bitvector.
371 void resize(unsigned N
, bool t
= false) {
372 if (N
> getBitCapacity()) {
373 unsigned OldCapacity
= Bits
.size();
375 init_words(Bits
.drop_front(OldCapacity
), t
);
378 // Set any old unused bits that are now included in the BitVector. This
379 // may set bits that are not included in the new vector, but we will clear
380 // them back out below.
384 // Update the size, and clear out any bits that are now unused
385 unsigned OldSize
= Size
;
387 if (t
|| N
< OldSize
)
391 void reserve(unsigned N
) {
392 if (N
> getBitCapacity())
398 init_words(Bits
, true);
403 BitVector
&set(unsigned Idx
) {
404 assert(Bits
.data() && "Bits never allocated");
405 Bits
[Idx
/ BITWORD_SIZE
] |= BitWord(1) << (Idx
% BITWORD_SIZE
);
409 /// set - Efficiently set a range of bits in [I, E)
410 BitVector
&set(unsigned I
, unsigned E
) {
411 assert(I
<= E
&& "Attempted to set backwards range!");
412 assert(E
<= size() && "Attempted to set out-of-bounds range!");
414 if (I
== E
) return *this;
416 if (I
/ BITWORD_SIZE
== E
/ BITWORD_SIZE
) {
417 BitWord EMask
= 1UL << (E
% BITWORD_SIZE
);
418 BitWord IMask
= 1UL << (I
% BITWORD_SIZE
);
419 BitWord Mask
= EMask
- IMask
;
420 Bits
[I
/ BITWORD_SIZE
] |= Mask
;
424 BitWord PrefixMask
= ~0UL << (I
% BITWORD_SIZE
);
425 Bits
[I
/ BITWORD_SIZE
] |= PrefixMask
;
426 I
= alignTo(I
, BITWORD_SIZE
);
428 for (; I
+ BITWORD_SIZE
<= E
; I
+= BITWORD_SIZE
)
429 Bits
[I
/ BITWORD_SIZE
] = ~0UL;
431 BitWord PostfixMask
= (1UL << (E
% BITWORD_SIZE
)) - 1;
433 Bits
[I
/ BITWORD_SIZE
] |= PostfixMask
;
439 init_words(Bits
, false);
443 BitVector
&reset(unsigned Idx
) {
444 Bits
[Idx
/ BITWORD_SIZE
] &= ~(BitWord(1) << (Idx
% BITWORD_SIZE
));
448 /// reset - Efficiently reset a range of bits in [I, E)
449 BitVector
&reset(unsigned I
, unsigned E
) {
450 assert(I
<= E
&& "Attempted to reset backwards range!");
451 assert(E
<= size() && "Attempted to reset out-of-bounds range!");
453 if (I
== E
) return *this;
455 if (I
/ BITWORD_SIZE
== E
/ BITWORD_SIZE
) {
456 BitWord EMask
= 1UL << (E
% BITWORD_SIZE
);
457 BitWord IMask
= 1UL << (I
% BITWORD_SIZE
);
458 BitWord Mask
= EMask
- IMask
;
459 Bits
[I
/ BITWORD_SIZE
] &= ~Mask
;
463 BitWord PrefixMask
= ~0UL << (I
% BITWORD_SIZE
);
464 Bits
[I
/ BITWORD_SIZE
] &= ~PrefixMask
;
465 I
= alignTo(I
, BITWORD_SIZE
);
467 for (; I
+ BITWORD_SIZE
<= E
; I
+= BITWORD_SIZE
)
468 Bits
[I
/ BITWORD_SIZE
] = 0UL;
470 BitWord PostfixMask
= (1UL << (E
% BITWORD_SIZE
)) - 1;
472 Bits
[I
/ BITWORD_SIZE
] &= ~PostfixMask
;
478 for (unsigned i
= 0; i
< NumBitWords(size()); ++i
)
484 BitVector
&flip(unsigned Idx
) {
485 Bits
[Idx
/ BITWORD_SIZE
] ^= BitWord(1) << (Idx
% BITWORD_SIZE
);
490 reference
operator[](unsigned Idx
) {
491 assert (Idx
< Size
&& "Out-of-bounds Bit access.");
492 return reference(*this, Idx
);
495 bool operator[](unsigned Idx
) const {
496 assert (Idx
< Size
&& "Out-of-bounds Bit access.");
497 BitWord Mask
= BitWord(1) << (Idx
% BITWORD_SIZE
);
498 return (Bits
[Idx
/ BITWORD_SIZE
] & Mask
) != 0;
501 bool test(unsigned Idx
) const {
505 // Push single bit to end of vector.
506 void push_back(bool Val
) {
507 unsigned OldSize
= Size
;
508 unsigned NewSize
= Size
+ 1;
510 // Resize, which will insert zeros.
511 // If we already fit then the unused bits will be already zero.
512 if (NewSize
> getBitCapacity())
513 resize(NewSize
, false);
517 // If true, set single bit.
522 /// Test if any common bits are set.
523 bool anyCommon(const BitVector
&RHS
) const {
524 unsigned ThisWords
= NumBitWords(size());
525 unsigned RHSWords
= NumBitWords(RHS
.size());
526 for (unsigned i
= 0, e
= std::min(ThisWords
, RHSWords
); i
!= e
; ++i
)
527 if (Bits
[i
] & RHS
.Bits
[i
])
532 // Comparison operators.
533 bool operator==(const BitVector
&RHS
) const {
534 unsigned ThisWords
= NumBitWords(size());
535 unsigned RHSWords
= NumBitWords(RHS
.size());
537 for (i
= 0; i
!= std::min(ThisWords
, RHSWords
); ++i
)
538 if (Bits
[i
] != RHS
.Bits
[i
])
541 // Verify that any extra words are all zeros.
542 if (i
!= ThisWords
) {
543 for (; i
!= ThisWords
; ++i
)
546 } else if (i
!= RHSWords
) {
547 for (; i
!= RHSWords
; ++i
)
554 bool operator!=(const BitVector
&RHS
) const {
555 return !(*this == RHS
);
558 /// Intersection, union, disjoint union.
559 BitVector
&operator&=(const BitVector
&RHS
) {
560 unsigned ThisWords
= NumBitWords(size());
561 unsigned RHSWords
= NumBitWords(RHS
.size());
563 for (i
= 0; i
!= std::min(ThisWords
, RHSWords
); ++i
)
564 Bits
[i
] &= RHS
.Bits
[i
];
566 // Any bits that are just in this bitvector become zero, because they aren't
567 // in the RHS bit vector. Any words only in RHS are ignored because they
568 // are already zero in the LHS.
569 for (; i
!= ThisWords
; ++i
)
575 /// reset - Reset bits that are set in RHS. Same as *this &= ~RHS.
576 BitVector
&reset(const BitVector
&RHS
) {
577 unsigned ThisWords
= NumBitWords(size());
578 unsigned RHSWords
= NumBitWords(RHS
.size());
580 for (i
= 0; i
!= std::min(ThisWords
, RHSWords
); ++i
)
581 Bits
[i
] &= ~RHS
.Bits
[i
];
585 /// test - Check if (This - RHS) is zero.
586 /// This is the same as reset(RHS) and any().
587 bool test(const BitVector
&RHS
) const {
588 unsigned ThisWords
= NumBitWords(size());
589 unsigned RHSWords
= NumBitWords(RHS
.size());
591 for (i
= 0; i
!= std::min(ThisWords
, RHSWords
); ++i
)
592 if ((Bits
[i
] & ~RHS
.Bits
[i
]) != 0)
595 for (; i
!= ThisWords
; ++i
)
602 BitVector
&operator|=(const BitVector
&RHS
) {
603 if (size() < RHS
.size())
605 for (size_t i
= 0, e
= NumBitWords(RHS
.size()); i
!= e
; ++i
)
606 Bits
[i
] |= RHS
.Bits
[i
];
610 BitVector
&operator^=(const BitVector
&RHS
) {
611 if (size() < RHS
.size())
613 for (size_t i
= 0, e
= NumBitWords(RHS
.size()); i
!= e
; ++i
)
614 Bits
[i
] ^= RHS
.Bits
[i
];
618 BitVector
&operator>>=(unsigned N
) {
620 if (LLVM_UNLIKELY(empty() || N
== 0))
623 unsigned NumWords
= NumBitWords(Size
);
624 assert(NumWords
>= 1);
626 wordShr(N
/ BITWORD_SIZE
);
628 unsigned BitDistance
= N
% BITWORD_SIZE
;
629 if (BitDistance
== 0)
632 // When the shift size is not a multiple of the word size, then we have
633 // a tricky situation where each word in succession needs to extract some
634 // of the bits from the next word and or them into this word while
635 // shifting this word to make room for the new bits. This has to be done
636 // for every word in the array.
638 // Since we're shifting each word right, some bits will fall off the end
639 // of each word to the right, and empty space will be created on the left.
640 // The final word in the array will lose bits permanently, so starting at
641 // the beginning, work forwards shifting each word to the right, and
642 // OR'ing in the bits from the end of the next word to the beginning of
646 // Starting with {0xAABBCCDD, 0xEEFF0011, 0x22334455} and shifting right
648 // Step 1: Word[0] >>= 4 ; 0x0ABBCCDD
649 // Step 2: Word[0] |= 0x10000000 ; 0x1ABBCCDD
650 // Step 3: Word[1] >>= 4 ; 0x0EEFF001
651 // Step 4: Word[1] |= 0x50000000 ; 0x5EEFF001
652 // Step 5: Word[2] >>= 4 ; 0x02334455
653 // Result: { 0x1ABBCCDD, 0x5EEFF001, 0x02334455 }
654 const BitWord Mask
= maskTrailingOnes
<BitWord
>(BitDistance
);
655 const unsigned LSH
= BITWORD_SIZE
- BitDistance
;
657 for (unsigned I
= 0; I
< NumWords
- 1; ++I
) {
658 Bits
[I
] >>= BitDistance
;
659 Bits
[I
] |= (Bits
[I
+ 1] & Mask
) << LSH
;
662 Bits
[NumWords
- 1] >>= BitDistance
;
667 BitVector
&operator<<=(unsigned N
) {
669 if (LLVM_UNLIKELY(empty() || N
== 0))
672 unsigned NumWords
= NumBitWords(Size
);
673 assert(NumWords
>= 1);
675 wordShl(N
/ BITWORD_SIZE
);
677 unsigned BitDistance
= N
% BITWORD_SIZE
;
678 if (BitDistance
== 0)
681 // When the shift size is not a multiple of the word size, then we have
682 // a tricky situation where each word in succession needs to extract some
683 // of the bits from the previous word and or them into this word while
684 // shifting this word to make room for the new bits. This has to be done
685 // for every word in the array. This is similar to the algorithm outlined
686 // in operator>>=, but backwards.
688 // Since we're shifting each word left, some bits will fall off the end
689 // of each word to the left, and empty space will be created on the right.
690 // The first word in the array will lose bits permanently, so starting at
691 // the end, work backwards shifting each word to the left, and OR'ing
692 // in the bits from the end of the next word to the beginning of the
696 // Starting with {0xAABBCCDD, 0xEEFF0011, 0x22334455} and shifting left
698 // Step 1: Word[2] <<= 4 ; 0x23344550
699 // Step 2: Word[2] |= 0x0000000E ; 0x2334455E
700 // Step 3: Word[1] <<= 4 ; 0xEFF00110
701 // Step 4: Word[1] |= 0x0000000A ; 0xEFF0011A
702 // Step 5: Word[0] <<= 4 ; 0xABBCCDD0
703 // Result: { 0xABBCCDD0, 0xEFF0011A, 0x2334455E }
704 const BitWord Mask
= maskLeadingOnes
<BitWord
>(BitDistance
);
705 const unsigned RSH
= BITWORD_SIZE
- BitDistance
;
707 for (int I
= NumWords
- 1; I
> 0; --I
) {
708 Bits
[I
] <<= BitDistance
;
709 Bits
[I
] |= (Bits
[I
- 1] & Mask
) >> RSH
;
711 Bits
[0] <<= BitDistance
;
717 // Assignment operator.
718 const BitVector
&operator=(const BitVector
&RHS
) {
719 if (this == &RHS
) return *this;
722 unsigned RHSWords
= NumBitWords(Size
);
723 if (Size
<= getBitCapacity()) {
725 std::memcpy(Bits
.data(), RHS
.Bits
.data(), RHSWords
* sizeof(BitWord
));
730 // Grow the bitvector to have enough elements.
731 unsigned NewCapacity
= RHSWords
;
732 assert(NewCapacity
> 0 && "negative capacity?");
733 auto NewBits
= allocate(NewCapacity
);
734 std::memcpy(NewBits
.data(), RHS
.Bits
.data(), NewCapacity
* sizeof(BitWord
));
736 // Destroy the old bits.
737 std::free(Bits
.data());
743 const BitVector
&operator=(BitVector
&&RHS
) {
744 if (this == &RHS
) return *this;
746 std::free(Bits
.data());
750 RHS
.Bits
= MutableArrayRef
<BitWord
>();
756 void swap(BitVector
&RHS
) {
757 std::swap(Bits
, RHS
.Bits
);
758 std::swap(Size
, RHS
.Size
);
761 //===--------------------------------------------------------------------===//
762 // Portable bit mask operations.
763 //===--------------------------------------------------------------------===//
765 // These methods all operate on arrays of uint32_t, each holding 32 bits. The
766 // fixed word size makes it easier to work with literal bit vector constants
769 // The LSB in each word is the lowest numbered bit. The size of a portable
770 // bit mask is always a whole multiple of 32 bits. If no bit mask size is
771 // given, the bit mask is assumed to cover the entire BitVector.
773 /// setBitsInMask - Add '1' bits from Mask to this vector. Don't resize.
774 /// This computes "*this |= Mask".
775 void setBitsInMask(const uint32_t *Mask
, unsigned MaskWords
= ~0u) {
776 applyMask
<true, false>(Mask
, MaskWords
);
779 /// clearBitsInMask - Clear any bits in this vector that are set in Mask.
780 /// Don't resize. This computes "*this &= ~Mask".
781 void clearBitsInMask(const uint32_t *Mask
, unsigned MaskWords
= ~0u) {
782 applyMask
<false, false>(Mask
, MaskWords
);
785 /// setBitsNotInMask - Add a bit to this vector for every '0' bit in Mask.
786 /// Don't resize. This computes "*this |= ~Mask".
787 void setBitsNotInMask(const uint32_t *Mask
, unsigned MaskWords
= ~0u) {
788 applyMask
<true, true>(Mask
, MaskWords
);
791 /// clearBitsNotInMask - Clear a bit in this vector for every '0' bit in Mask.
792 /// Don't resize. This computes "*this &= Mask".
793 void clearBitsNotInMask(const uint32_t *Mask
, unsigned MaskWords
= ~0u) {
794 applyMask
<false, true>(Mask
, MaskWords
);
798 /// Perform a logical left shift of \p Count words by moving everything
799 /// \p Count words to the right in memory.
801 /// While confusing, words are stored from least significant at Bits[0] to
802 /// most significant at Bits[NumWords-1]. A logical shift left, however,
803 /// moves the current least significant bit to a higher logical index, and
804 /// fills the previous least significant bits with 0. Thus, we actually
805 /// need to move the bytes of the memory to the right, not to the left.
807 /// Words = [0xBBBBAAAA, 0xDDDDFFFF, 0x00000000, 0xDDDD0000]
808 /// represents a BitVector where 0xBBBBAAAA contain the least significant
809 /// bits. So if we want to shift the BitVector left by 2 words, we need to
810 /// turn this into 0x00000000 0x00000000 0xBBBBAAAA 0xDDDDFFFF by using a
811 /// memmove which moves right, not left.
812 void wordShl(uint32_t Count
) {
816 uint32_t NumWords
= NumBitWords(Size
);
818 auto Src
= Bits
.take_front(NumWords
).drop_back(Count
);
819 auto Dest
= Bits
.take_front(NumWords
).drop_front(Count
);
821 // Since we always move Word-sized chunks of data with src and dest both
822 // aligned to a word-boundary, we don't need to worry about endianness
824 std::memmove(Dest
.begin(), Src
.begin(), Dest
.size() * sizeof(BitWord
));
825 std::memset(Bits
.data(), 0, Count
* sizeof(BitWord
));
829 /// Perform a logical right shift of \p Count words by moving those
830 /// words to the left in memory. See wordShl for more information.
832 void wordShr(uint32_t Count
) {
836 uint32_t NumWords
= NumBitWords(Size
);
838 auto Src
= Bits
.take_front(NumWords
).drop_front(Count
);
839 auto Dest
= Bits
.take_front(NumWords
).drop_back(Count
);
840 assert(Dest
.size() == Src
.size());
842 std::memmove(Dest
.begin(), Src
.begin(), Dest
.size() * sizeof(BitWord
));
843 std::memset(Dest
.end(), 0, Count
* sizeof(BitWord
));
846 MutableArrayRef
<BitWord
> allocate(size_t NumWords
) {
847 BitWord
*RawBits
= static_cast<BitWord
*>(
848 safe_malloc(NumWords
* sizeof(BitWord
)));
849 return MutableArrayRef
<BitWord
>(RawBits
, NumWords
);
852 int next_unset_in_word(int WordIndex
, BitWord Word
) const {
853 unsigned Result
= WordIndex
* BITWORD_SIZE
+ countTrailingOnes(Word
);
854 return Result
< size() ? Result
: -1;
857 unsigned NumBitWords(unsigned S
) const {
858 return (S
+ BITWORD_SIZE
-1) / BITWORD_SIZE
;
861 // Set the unused bits in the high words.
862 void set_unused_bits(bool t
= true) {
863 // Set high words first.
864 unsigned UsedWords
= NumBitWords(Size
);
865 if (Bits
.size() > UsedWords
)
866 init_words(Bits
.drop_front(UsedWords
), t
);
868 // Then set any stray high bits of the last used word.
869 unsigned ExtraBits
= Size
% BITWORD_SIZE
;
871 BitWord ExtraBitMask
= ~0UL << ExtraBits
;
873 Bits
[UsedWords
-1] |= ExtraBitMask
;
875 Bits
[UsedWords
-1] &= ~ExtraBitMask
;
879 // Clear the unused bits in the high words.
880 void clear_unused_bits() {
881 set_unused_bits(false);
884 void grow(unsigned NewSize
) {
885 size_t NewCapacity
= std::max
<size_t>(NumBitWords(NewSize
), Bits
.size() * 2);
886 assert(NewCapacity
> 0 && "realloc-ing zero space");
887 BitWord
*NewBits
= static_cast<BitWord
*>(
888 safe_realloc(Bits
.data(), NewCapacity
* sizeof(BitWord
)));
889 Bits
= MutableArrayRef
<BitWord
>(NewBits
, NewCapacity
);
893 void init_words(MutableArrayRef
<BitWord
> B
, bool t
) {
895 memset(B
.data(), 0 - (int)t
, B
.size() * sizeof(BitWord
));
898 template<bool AddBits
, bool InvertMask
>
899 void applyMask(const uint32_t *Mask
, unsigned MaskWords
) {
900 static_assert(BITWORD_SIZE
% 32 == 0, "Unsupported BitWord size.");
901 MaskWords
= std::min(MaskWords
, (size() + 31) / 32);
902 const unsigned Scale
= BITWORD_SIZE
/ 32;
904 for (i
= 0; MaskWords
>= Scale
; ++i
, MaskWords
-= Scale
) {
905 BitWord BW
= Bits
[i
];
906 // This inner loop should unroll completely when BITWORD_SIZE > 32.
907 for (unsigned b
= 0; b
!= BITWORD_SIZE
; b
+= 32) {
908 uint32_t M
= *Mask
++;
909 if (InvertMask
) M
= ~M
;
910 if (AddBits
) BW
|= BitWord(M
) << b
;
911 else BW
&= ~(BitWord(M
) << b
);
915 for (unsigned b
= 0; MaskWords
; b
+= 32, --MaskWords
) {
916 uint32_t M
= *Mask
++;
917 if (InvertMask
) M
= ~M
;
918 if (AddBits
) Bits
[i
] |= BitWord(M
) << b
;
919 else Bits
[i
] &= ~(BitWord(M
) << b
);
926 /// Return the size (in bytes) of the bit vector.
927 size_t getMemorySize() const { return Bits
.size() * sizeof(BitWord
); }
928 size_t getBitCapacity() const { return Bits
.size() * BITWORD_SIZE
; }
931 inline size_t capacity_in_bytes(const BitVector
&X
) {
932 return X
.getMemorySize();
935 } // end namespace llvm
938 /// Implement std::swap in terms of BitVector swap.
940 swap(llvm::BitVector
&LHS
, llvm::BitVector
&RHS
) {
943 } // end namespace std
945 #endif // LLVM_ADT_BITVECTOR_H