| 1 | //===- llvm/ADT/BitVector.h - Bit vectors -----------------------*- C++ -*-===// | 
| 2 | // | 
| 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 | 
| 6 | // | 
| 7 | //===----------------------------------------------------------------------===// | 
| 8 | /// | 
| 9 | /// \file | 
| 10 | /// This file implements the BitVector class. | 
| 11 | /// | 
| 12 | //===----------------------------------------------------------------------===// | 
| 13 |  | 
| 14 | #ifndef LLVM_ADT_BITVECTOR_H | 
| 15 | #define LLVM_ADT_BITVECTOR_H | 
| 16 |  | 
| 17 | #include "llvm/ADT/ArrayRef.h" | 
| 18 | #include "llvm/ADT/DenseMapInfo.h" | 
| 19 | #include "llvm/ADT/iterator_range.h" | 
| 20 | #include "llvm/Support/MathExtras.h" | 
| 21 | #include <algorithm> | 
| 22 | #include <cassert> | 
| 23 | #include <climits> | 
| 24 | #include <cstdint> | 
| 25 | #include <cstdlib> | 
| 26 | #include <cstring> | 
| 27 | #include <iterator> | 
| 28 | #include <utility> | 
| 29 |  | 
| 30 | namespace llvm { | 
| 31 |  | 
| 32 | /// ForwardIterator for the bits that are set. | 
| 33 | /// Iterators get invalidated when resize / reserve is called. | 
| 34 | template <typename BitVectorT> class const_set_bits_iterator_impl { | 
| 35 |   const BitVectorT &Parent; | 
| 36 |   int Current = 0; | 
| 37 |  | 
| 38 |   void advance() { | 
| 39 |     assert(Current != -1 && "Trying to advance past end." ); | 
| 40 |     Current = Parent.find_next(Current); | 
| 41 |   } | 
| 42 |  | 
| 43 | public: | 
| 44 |   using iterator_category = std::forward_iterator_tag; | 
| 45 |   using difference_type   = void; | 
| 46 |   using value_type        = int; | 
| 47 |   using pointer           = value_type*; | 
| 48 |   using reference         = value_type&; | 
| 49 |  | 
| 50 |   const_set_bits_iterator_impl(const BitVectorT &Parent, int Current) | 
| 51 |       : Parent(Parent), Current(Current) {} | 
| 52 |   explicit const_set_bits_iterator_impl(const BitVectorT &Parent) | 
| 53 |       : const_set_bits_iterator_impl(Parent, Parent.find_first()) {} | 
| 54 |   const_set_bits_iterator_impl(const const_set_bits_iterator_impl &) = default; | 
| 55 |  | 
| 56 |   const_set_bits_iterator_impl operator++(int) { | 
| 57 |     auto Prev = *this; | 
| 58 |     advance(); | 
| 59 |     return Prev; | 
| 60 |   } | 
| 61 |  | 
| 62 |   const_set_bits_iterator_impl &operator++() { | 
| 63 |     advance(); | 
| 64 |     return *this; | 
| 65 |   } | 
| 66 |  | 
| 67 |   unsigned operator*() const { return Current; } | 
| 68 |  | 
| 69 |   bool operator==(const const_set_bits_iterator_impl &Other) const { | 
| 70 |     assert(&Parent == &Other.Parent && | 
| 71 |            "Comparing iterators from different BitVectors" ); | 
| 72 |     return Current == Other.Current; | 
| 73 |   } | 
| 74 |  | 
| 75 |   bool operator!=(const const_set_bits_iterator_impl &Other) const { | 
| 76 |     assert(&Parent == &Other.Parent && | 
| 77 |            "Comparing iterators from different BitVectors" ); | 
| 78 |     return Current != Other.Current; | 
| 79 |   } | 
| 80 | }; | 
| 81 |  | 
| 82 | class BitVector { | 
| 83 |   typedef uintptr_t BitWord; | 
| 84 |  | 
| 85 |   enum { BITWORD_SIZE = (unsigned)sizeof(BitWord) * CHAR_BIT }; | 
| 86 |  | 
| 87 |   static_assert(BITWORD_SIZE == 64 || BITWORD_SIZE == 32, | 
| 88 |                 "Unsupported word size" ); | 
| 89 |  | 
| 90 |   using Storage = SmallVector<BitWord>; | 
| 91 |  | 
| 92 |   Storage Bits;  // Actual bits. | 
| 93 |   unsigned Size = 0; // Size of bitvector in bits. | 
| 94 |  | 
| 95 | public: | 
| 96 |   using size_type = unsigned; | 
| 97 |  | 
| 98 |   // Encapsulation of a single bit. | 
| 99 |   class reference { | 
| 100 |  | 
| 101 |     BitWord *WordRef; | 
| 102 |     unsigned BitPos; | 
| 103 |  | 
| 104 |   public: | 
| 105 |     reference(BitVector &b, unsigned Idx) { | 
| 106 |       WordRef = &b.Bits[Idx / BITWORD_SIZE]; | 
| 107 |       BitPos = Idx % BITWORD_SIZE; | 
| 108 |     } | 
| 109 |  | 
| 110 |     reference() = delete; | 
| 111 |     reference(const reference&) = default; | 
| 112 |  | 
| 113 |     reference &operator=(reference t) { | 
| 114 |       *this = bool(t); | 
| 115 |       return *this; | 
| 116 |     } | 
| 117 |  | 
| 118 |     reference& operator=(bool t) { | 
| 119 |       if (t) | 
| 120 |         *WordRef |= BitWord(1) << BitPos; | 
| 121 |       else | 
| 122 |         *WordRef &= ~(BitWord(1) << BitPos); | 
| 123 |       return *this; | 
| 124 |     } | 
| 125 |  | 
| 126 |     operator bool() const { | 
| 127 |       return ((*WordRef) & (BitWord(1) << BitPos)) != 0; | 
| 128 |     } | 
| 129 |   }; | 
| 130 |  | 
| 131 |   typedef const_set_bits_iterator_impl<BitVector> const_set_bits_iterator; | 
| 132 |   typedef const_set_bits_iterator set_iterator; | 
| 133 |  | 
| 134 |   const_set_bits_iterator set_bits_begin() const { | 
| 135 |     return const_set_bits_iterator(*this); | 
| 136 |   } | 
| 137 |   const_set_bits_iterator set_bits_end() const { | 
| 138 |     return const_set_bits_iterator(*this, -1); | 
| 139 |   } | 
| 140 |   iterator_range<const_set_bits_iterator> set_bits() const { | 
| 141 |     return make_range(x: set_bits_begin(), y: set_bits_end()); | 
| 142 |   } | 
| 143 |  | 
| 144 |   /// BitVector default ctor - Creates an empty bitvector. | 
| 145 |   BitVector() = default; | 
| 146 |  | 
| 147 |   /// BitVector ctor - Creates a bitvector of specified number of bits. All | 
| 148 |   /// bits are initialized to the specified value. | 
| 149 |   explicit BitVector(unsigned s, bool t = false) | 
| 150 |       : Bits(NumBitWords(S: s), 0 - (BitWord)t), Size(s) { | 
| 151 |     if (t) | 
| 152 |       clear_unused_bits(); | 
| 153 |   } | 
| 154 |  | 
| 155 |   /// empty - Tests whether there are no bits in this bitvector. | 
| 156 |   bool empty() const { return Size == 0; } | 
| 157 |  | 
| 158 |   /// size - Returns the number of bits in this bitvector. | 
| 159 |   size_type size() const { return Size; } | 
| 160 |  | 
| 161 |   /// count - Returns the number of bits which are set. | 
| 162 |   size_type count() const { | 
| 163 |     unsigned NumBits = 0; | 
| 164 |     for (auto Bit : Bits) | 
| 165 |       NumBits += llvm::popcount(Value: Bit); | 
| 166 |     return NumBits; | 
| 167 |   } | 
| 168 |  | 
| 169 |   /// any - Returns true if any bit is set. | 
| 170 |   bool any() const { | 
| 171 |     return any_of(Range: Bits, P: [](BitWord Bit) { return Bit != 0; }); | 
| 172 |   } | 
| 173 |  | 
| 174 |   /// all - Returns true if all bits are set. | 
| 175 |   bool all() const { | 
| 176 |     for (unsigned i = 0; i < Size / BITWORD_SIZE; ++i) | 
| 177 |       if (Bits[i] != ~BitWord(0)) | 
| 178 |         return false; | 
| 179 |  | 
| 180 |     // If bits remain check that they are ones. The unused bits are always zero. | 
| 181 |     if (unsigned Remainder = Size % BITWORD_SIZE) | 
| 182 |       return Bits[Size / BITWORD_SIZE] == (BitWord(1) << Remainder) - 1; | 
| 183 |  | 
| 184 |     return true; | 
| 185 |   } | 
| 186 |  | 
| 187 |   /// none - Returns true if none of the bits are set. | 
| 188 |   bool none() const { | 
| 189 |     return !any(); | 
| 190 |   } | 
| 191 |  | 
| 192 |   /// find_first_in - Returns the index of the first set / unset bit, | 
| 193 |   /// depending on \p Set, in the range [Begin, End). | 
| 194 |   /// Returns -1 if all bits in the range are unset / set. | 
| 195 |   int find_first_in(unsigned Begin, unsigned End, bool Set = true) const { | 
| 196 |     assert(Begin <= End && End <= Size); | 
| 197 |     if (Begin == End) | 
| 198 |       return -1; | 
| 199 |  | 
| 200 |     unsigned FirstWord = Begin / BITWORD_SIZE; | 
| 201 |     unsigned LastWord = (End - 1) / BITWORD_SIZE; | 
| 202 |  | 
| 203 |     // Check subsequent words. | 
| 204 |     // The code below is based on search for the first _set_ bit. If | 
| 205 |     // we're searching for the first _unset_, we just take the | 
| 206 |     // complement of each word before we use it and apply | 
| 207 |     // the same method. | 
| 208 |     for (unsigned i = FirstWord; i <= LastWord; ++i) { | 
| 209 |       BitWord Copy = Bits[i]; | 
| 210 |       if (!Set) | 
| 211 |         Copy = ~Copy; | 
| 212 |  | 
| 213 |       if (i == FirstWord) { | 
| 214 |         unsigned FirstBit = Begin % BITWORD_SIZE; | 
| 215 |         Copy &= maskTrailingZeros<BitWord>(N: FirstBit); | 
| 216 |       } | 
| 217 |  | 
| 218 |       if (i == LastWord) { | 
| 219 |         unsigned LastBit = (End - 1) % BITWORD_SIZE; | 
| 220 |         Copy &= maskTrailingOnes<BitWord>(N: LastBit + 1); | 
| 221 |       } | 
| 222 |       if (Copy != 0) | 
| 223 |         return i * BITWORD_SIZE + llvm::countr_zero(Val: Copy); | 
| 224 |     } | 
| 225 |     return -1; | 
| 226 |   } | 
| 227 |  | 
| 228 |   /// find_last_in - Returns the index of the last set bit in the range | 
| 229 |   /// [Begin, End).  Returns -1 if all bits in the range are unset. | 
| 230 |   int find_last_in(unsigned Begin, unsigned End) const { | 
| 231 |     assert(Begin <= End && End <= Size); | 
| 232 |     if (Begin == End) | 
| 233 |       return -1; | 
| 234 |  | 
| 235 |     unsigned LastWord = (End - 1) / BITWORD_SIZE; | 
| 236 |     unsigned FirstWord = Begin / BITWORD_SIZE; | 
| 237 |  | 
| 238 |     for (unsigned i = LastWord + 1; i >= FirstWord + 1; --i) { | 
| 239 |       unsigned CurrentWord = i - 1; | 
| 240 |  | 
| 241 |       BitWord Copy = Bits[CurrentWord]; | 
| 242 |       if (CurrentWord == LastWord) { | 
| 243 |         unsigned LastBit = (End - 1) % BITWORD_SIZE; | 
| 244 |         Copy &= maskTrailingOnes<BitWord>(N: LastBit + 1); | 
| 245 |       } | 
| 246 |  | 
| 247 |       if (CurrentWord == FirstWord) { | 
| 248 |         unsigned FirstBit = Begin % BITWORD_SIZE; | 
| 249 |         Copy &= maskTrailingZeros<BitWord>(N: FirstBit); | 
| 250 |       } | 
| 251 |  | 
| 252 |       if (Copy != 0) | 
| 253 |         return (CurrentWord + 1) * BITWORD_SIZE - llvm::countl_zero(Val: Copy) - 1; | 
| 254 |     } | 
| 255 |  | 
| 256 |     return -1; | 
| 257 |   } | 
| 258 |  | 
| 259 |   /// find_first_unset_in - Returns the index of the first unset bit in the | 
| 260 |   /// range [Begin, End).  Returns -1 if all bits in the range are set. | 
| 261 |   int find_first_unset_in(unsigned Begin, unsigned End) const { | 
| 262 |     return find_first_in(Begin, End, /* Set = */ Set: false); | 
| 263 |   } | 
| 264 |  | 
| 265 |   /// find_last_unset_in - Returns the index of the last unset bit in the | 
| 266 |   /// range [Begin, End).  Returns -1 if all bits in the range are set. | 
| 267 |   int find_last_unset_in(unsigned Begin, unsigned End) const { | 
| 268 |     assert(Begin <= End && End <= Size); | 
| 269 |     if (Begin == End) | 
| 270 |       return -1; | 
| 271 |  | 
| 272 |     unsigned LastWord = (End - 1) / BITWORD_SIZE; | 
| 273 |     unsigned FirstWord = Begin / BITWORD_SIZE; | 
| 274 |  | 
| 275 |     for (unsigned i = LastWord + 1; i >= FirstWord + 1; --i) { | 
| 276 |       unsigned CurrentWord = i - 1; | 
| 277 |  | 
| 278 |       BitWord Copy = Bits[CurrentWord]; | 
| 279 |       if (CurrentWord == LastWord) { | 
| 280 |         unsigned LastBit = (End - 1) % BITWORD_SIZE; | 
| 281 |         Copy |= maskTrailingZeros<BitWord>(N: LastBit + 1); | 
| 282 |       } | 
| 283 |  | 
| 284 |       if (CurrentWord == FirstWord) { | 
| 285 |         unsigned FirstBit = Begin % BITWORD_SIZE; | 
| 286 |         Copy |= maskTrailingOnes<BitWord>(N: FirstBit); | 
| 287 |       } | 
| 288 |  | 
| 289 |       if (Copy != ~BitWord(0)) { | 
| 290 |         unsigned Result = | 
| 291 |             (CurrentWord + 1) * BITWORD_SIZE - llvm::countl_one(Value: Copy) - 1; | 
| 292 |         return Result < Size ? Result : -1; | 
| 293 |       } | 
| 294 |     } | 
| 295 |     return -1; | 
| 296 |   } | 
| 297 |  | 
| 298 |   /// find_first - Returns the index of the first set bit, -1 if none | 
| 299 |   /// of the bits are set. | 
| 300 |   int find_first() const { return find_first_in(Begin: 0, End: Size); } | 
| 301 |  | 
| 302 |   /// find_last - Returns the index of the last set bit, -1 if none of the bits | 
| 303 |   /// are set. | 
| 304 |   int find_last() const { return find_last_in(Begin: 0, End: Size); } | 
| 305 |  | 
| 306 |   /// find_next - Returns the index of the next set bit following the | 
| 307 |   /// "Prev" bit. Returns -1 if the next set bit is not found. | 
| 308 |   int find_next(unsigned Prev) const { return find_first_in(Begin: Prev + 1, End: Size); } | 
| 309 |  | 
| 310 |   /// find_prev - Returns the index of the first set bit that precedes the | 
| 311 |   /// the bit at \p PriorTo.  Returns -1 if all previous bits are unset. | 
| 312 |   int find_prev(unsigned PriorTo) const { return find_last_in(Begin: 0, End: PriorTo); } | 
| 313 |  | 
| 314 |   /// find_first_unset - Returns the index of the first unset bit, -1 if all | 
| 315 |   /// of the bits are set. | 
| 316 |   int find_first_unset() const { return find_first_unset_in(Begin: 0, End: Size); } | 
| 317 |  | 
| 318 |   /// find_next_unset - Returns the index of the next unset bit following the | 
| 319 |   /// "Prev" bit.  Returns -1 if all remaining bits are set. | 
| 320 |   int find_next_unset(unsigned Prev) const { | 
| 321 |     return find_first_unset_in(Begin: Prev + 1, End: Size); | 
| 322 |   } | 
| 323 |  | 
| 324 |   /// find_last_unset - Returns the index of the last unset bit, -1 if all of | 
| 325 |   /// the bits are set. | 
| 326 |   int find_last_unset() const { return find_last_unset_in(Begin: 0, End: Size); } | 
| 327 |  | 
| 328 |   /// find_prev_unset - Returns the index of the first unset bit that precedes | 
| 329 |   /// the bit at \p PriorTo.  Returns -1 if all previous bits are set. | 
| 330 |   int find_prev_unset(unsigned PriorTo) { | 
| 331 |     return find_last_unset_in(Begin: 0, End: PriorTo); | 
| 332 |   } | 
| 333 |  | 
| 334 |   /// clear - Removes all bits from the bitvector. | 
| 335 |   void clear() { | 
| 336 |     Size = 0; | 
| 337 |     Bits.clear(); | 
| 338 |   } | 
| 339 |  | 
| 340 |   /// resize - Grow or shrink the bitvector. | 
| 341 |   void resize(unsigned N, bool t = false) { | 
| 342 |     set_unused_bits(t); | 
| 343 |     Size = N; | 
| 344 |     Bits.resize(N: NumBitWords(S: N), NV: 0 - BitWord(t)); | 
| 345 |     clear_unused_bits(); | 
| 346 |   } | 
| 347 |  | 
| 348 |   void reserve(unsigned N) { Bits.reserve(N: NumBitWords(S: N)); } | 
| 349 |  | 
| 350 |   // Set, reset, flip | 
| 351 |   BitVector &set() { | 
| 352 |     init_words(t: true); | 
| 353 |     clear_unused_bits(); | 
| 354 |     return *this; | 
| 355 |   } | 
| 356 |  | 
| 357 |   BitVector &set(unsigned Idx) { | 
| 358 |     assert(Idx < Size && "access in bound" ); | 
| 359 |     Bits[Idx / BITWORD_SIZE] |= BitWord(1) << (Idx % BITWORD_SIZE); | 
| 360 |     return *this; | 
| 361 |   } | 
| 362 |  | 
| 363 |   /// set - Efficiently set a range of bits in [I, E) | 
| 364 |   BitVector &set(unsigned I, unsigned E) { | 
| 365 |     assert(I <= E && "Attempted to set backwards range!" ); | 
| 366 |     assert(E <= size() && "Attempted to set out-of-bounds range!" ); | 
| 367 |  | 
| 368 |     if (I == E) return *this; | 
| 369 |  | 
| 370 |     if (I / BITWORD_SIZE == E / BITWORD_SIZE) { | 
| 371 |       BitWord EMask = BitWord(1) << (E % BITWORD_SIZE); | 
| 372 |       BitWord IMask = BitWord(1) << (I % BITWORD_SIZE); | 
| 373 |       BitWord Mask = EMask - IMask; | 
| 374 |       Bits[I / BITWORD_SIZE] |= Mask; | 
| 375 |       return *this; | 
| 376 |     } | 
| 377 |  | 
| 378 |     BitWord PrefixMask = ~BitWord(0) << (I % BITWORD_SIZE); | 
| 379 |     Bits[I / BITWORD_SIZE] |= PrefixMask; | 
| 380 |     I = alignTo(Value: I, Align: BITWORD_SIZE); | 
| 381 |  | 
| 382 |     for (; I + BITWORD_SIZE <= E; I += BITWORD_SIZE) | 
| 383 |       Bits[I / BITWORD_SIZE] = ~BitWord(0); | 
| 384 |  | 
| 385 |     BitWord PostfixMask = (BitWord(1) << (E % BITWORD_SIZE)) - 1; | 
| 386 |     if (I < E) | 
| 387 |       Bits[I / BITWORD_SIZE] |= PostfixMask; | 
| 388 |  | 
| 389 |     return *this; | 
| 390 |   } | 
| 391 |  | 
| 392 |   BitVector &reset() { | 
| 393 |     init_words(t: false); | 
| 394 |     return *this; | 
| 395 |   } | 
| 396 |  | 
| 397 |   BitVector &reset(unsigned Idx) { | 
| 398 |     Bits[Idx / BITWORD_SIZE] &= ~(BitWord(1) << (Idx % BITWORD_SIZE)); | 
| 399 |     return *this; | 
| 400 |   } | 
| 401 |  | 
| 402 |   /// reset - Efficiently reset a range of bits in [I, E) | 
| 403 |   BitVector &reset(unsigned I, unsigned E) { | 
| 404 |     assert(I <= E && "Attempted to reset backwards range!" ); | 
| 405 |     assert(E <= size() && "Attempted to reset out-of-bounds range!" ); | 
| 406 |  | 
| 407 |     if (I == E) return *this; | 
| 408 |  | 
| 409 |     if (I / BITWORD_SIZE == E / BITWORD_SIZE) { | 
| 410 |       BitWord EMask = BitWord(1) << (E % BITWORD_SIZE); | 
| 411 |       BitWord IMask = BitWord(1) << (I % BITWORD_SIZE); | 
| 412 |       BitWord Mask = EMask - IMask; | 
| 413 |       Bits[I / BITWORD_SIZE] &= ~Mask; | 
| 414 |       return *this; | 
| 415 |     } | 
| 416 |  | 
| 417 |     BitWord PrefixMask = ~BitWord(0) << (I % BITWORD_SIZE); | 
| 418 |     Bits[I / BITWORD_SIZE] &= ~PrefixMask; | 
| 419 |     I = alignTo(Value: I, Align: BITWORD_SIZE); | 
| 420 |  | 
| 421 |     for (; I + BITWORD_SIZE <= E; I += BITWORD_SIZE) | 
| 422 |       Bits[I / BITWORD_SIZE] = BitWord(0); | 
| 423 |  | 
| 424 |     BitWord PostfixMask = (BitWord(1) << (E % BITWORD_SIZE)) - 1; | 
| 425 |     if (I < E) | 
| 426 |       Bits[I / BITWORD_SIZE] &= ~PostfixMask; | 
| 427 |  | 
| 428 |     return *this; | 
| 429 |   } | 
| 430 |  | 
| 431 |   BitVector &flip() { | 
| 432 |     for (auto &Bit : Bits) | 
| 433 |       Bit = ~Bit; | 
| 434 |     clear_unused_bits(); | 
| 435 |     return *this; | 
| 436 |   } | 
| 437 |  | 
| 438 |   BitVector &flip(unsigned Idx) { | 
| 439 |     Bits[Idx / BITWORD_SIZE] ^= BitWord(1) << (Idx % BITWORD_SIZE); | 
| 440 |     return *this; | 
| 441 |   } | 
| 442 |  | 
| 443 |   // Indexing. | 
| 444 |   reference operator[](unsigned Idx) { | 
| 445 |     assert (Idx < Size && "Out-of-bounds Bit access." ); | 
| 446 |     return reference(*this, Idx); | 
| 447 |   } | 
| 448 |  | 
| 449 |   bool operator[](unsigned Idx) const { | 
| 450 |     assert (Idx < Size && "Out-of-bounds Bit access." ); | 
| 451 |     BitWord Mask = BitWord(1) << (Idx % BITWORD_SIZE); | 
| 452 |     return (Bits[Idx / BITWORD_SIZE] & Mask) != 0; | 
| 453 |   } | 
| 454 |  | 
| 455 |   /// Return the last element in the vector. | 
| 456 |   bool back() const { | 
| 457 |     assert(!empty() && "Getting last element of empty vector." ); | 
| 458 |     return (*this)[size() - 1]; | 
| 459 |   } | 
| 460 |  | 
| 461 |   bool test(unsigned Idx) const { | 
| 462 |     return (*this)[Idx]; | 
| 463 |   } | 
| 464 |  | 
| 465 |   // Push single bit to end of vector. | 
| 466 |   void push_back(bool Val) { | 
| 467 |     unsigned OldSize = Size; | 
| 468 |     unsigned NewSize = Size + 1; | 
| 469 |  | 
| 470 |     // Resize, which will insert zeros. | 
| 471 |     // If we already fit then the unused bits will be already zero. | 
| 472 |     if (NewSize > getBitCapacity()) | 
| 473 |       resize(N: NewSize, t: false); | 
| 474 |     else | 
| 475 |       Size = NewSize; | 
| 476 |  | 
| 477 |     // If true, set single bit. | 
| 478 |     if (Val) | 
| 479 |       set(OldSize); | 
| 480 |   } | 
| 481 |  | 
| 482 |   /// Pop one bit from the end of the vector. | 
| 483 |   void pop_back() { | 
| 484 |     assert(!empty() && "Empty vector has no element to pop." ); | 
| 485 |     resize(N: size() - 1); | 
| 486 |   } | 
| 487 |  | 
| 488 |   /// Test if any common bits are set. | 
| 489 |   bool anyCommon(const BitVector &RHS) const { | 
| 490 |     unsigned ThisWords = Bits.size(); | 
| 491 |     unsigned RHSWords = RHS.Bits.size(); | 
| 492 |     for (unsigned i = 0, e = std::min(a: ThisWords, b: RHSWords); i != e; ++i) | 
| 493 |       if (Bits[i] & RHS.Bits[i]) | 
| 494 |         return true; | 
| 495 |     return false; | 
| 496 |   } | 
| 497 |  | 
| 498 |   // Comparison operators. | 
| 499 |   bool operator==(const BitVector &RHS) const { | 
| 500 |     if (size() != RHS.size()) | 
| 501 |       return false; | 
| 502 |     unsigned NumWords = Bits.size(); | 
| 503 |     return std::equal(first1: Bits.begin(), last1: Bits.begin() + NumWords, first2: RHS.Bits.begin()); | 
| 504 |   } | 
| 505 |  | 
| 506 |   bool operator!=(const BitVector &RHS) const { return !(*this == RHS); } | 
| 507 |  | 
| 508 |   /// Intersection, union, disjoint union. | 
| 509 |   BitVector &operator&=(const BitVector &RHS) { | 
| 510 |     unsigned ThisWords = Bits.size(); | 
| 511 |     unsigned RHSWords = RHS.Bits.size(); | 
| 512 |     unsigned i; | 
| 513 |     for (i = 0; i != std::min(a: ThisWords, b: RHSWords); ++i) | 
| 514 |       Bits[i] &= RHS.Bits[i]; | 
| 515 |  | 
| 516 |     // Any bits that are just in this bitvector become zero, because they aren't | 
| 517 |     // in the RHS bit vector.  Any words only in RHS are ignored because they | 
| 518 |     // are already zero in the LHS. | 
| 519 |     for (; i != ThisWords; ++i) | 
| 520 |       Bits[i] = 0; | 
| 521 |  | 
| 522 |     return *this; | 
| 523 |   } | 
| 524 |  | 
| 525 |   /// reset - Reset bits that are set in RHS. Same as *this &= ~RHS. | 
| 526 |   BitVector &reset(const BitVector &RHS) { | 
| 527 |     unsigned ThisWords = Bits.size(); | 
| 528 |     unsigned RHSWords = RHS.Bits.size(); | 
| 529 |     for (unsigned i = 0; i != std::min(a: ThisWords, b: RHSWords); ++i) | 
| 530 |       Bits[i] &= ~RHS.Bits[i]; | 
| 531 |     return *this; | 
| 532 |   } | 
| 533 |  | 
| 534 |   /// test - Check if (This - RHS) is zero. | 
| 535 |   /// This is the same as reset(RHS) and any(). | 
| 536 |   bool test(const BitVector &RHS) const { | 
| 537 |     unsigned ThisWords = Bits.size(); | 
| 538 |     unsigned RHSWords = RHS.Bits.size(); | 
| 539 |     unsigned i; | 
| 540 |     for (i = 0; i != std::min(a: ThisWords, b: RHSWords); ++i) | 
| 541 |       if ((Bits[i] & ~RHS.Bits[i]) != 0) | 
| 542 |         return true; | 
| 543 |  | 
| 544 |     for (; i != ThisWords ; ++i) | 
| 545 |       if (Bits[i] != 0) | 
| 546 |         return true; | 
| 547 |  | 
| 548 |     return false; | 
| 549 |   } | 
| 550 |  | 
| 551 |   template <class F, class... ArgTys> | 
| 552 |   static BitVector &apply(F &&f, BitVector &Out, BitVector const &Arg, | 
| 553 |                           ArgTys const &...Args) { | 
| 554 |     assert(llvm::all_of( | 
| 555 |                std::initializer_list<unsigned>{Args.size()...}, | 
| 556 |                [&Arg](auto const &BV) { return Arg.size() == BV; }) && | 
| 557 |            "consistent sizes" ); | 
| 558 |     Out.resize(N: Arg.size()); | 
| 559 |     for (size_type I = 0, E = Arg.Bits.size(); I != E; ++I) | 
| 560 |       Out.Bits[I] = f(Arg.Bits[I], Args.Bits[I]...); | 
| 561 |     Out.clear_unused_bits(); | 
| 562 |     return Out; | 
| 563 |   } | 
| 564 |  | 
| 565 |   BitVector &operator|=(const BitVector &RHS) { | 
| 566 |     if (size() < RHS.size()) | 
| 567 |       resize(N: RHS.size()); | 
| 568 |     for (size_type I = 0, E = RHS.Bits.size(); I != E; ++I) | 
| 569 |       Bits[I] |= RHS.Bits[I]; | 
| 570 |     return *this; | 
| 571 |   } | 
| 572 |  | 
| 573 |   BitVector &operator^=(const BitVector &RHS) { | 
| 574 |     if (size() < RHS.size()) | 
| 575 |       resize(N: RHS.size()); | 
| 576 |     for (size_type I = 0, E = RHS.Bits.size(); I != E; ++I) | 
| 577 |       Bits[I] ^= RHS.Bits[I]; | 
| 578 |     return *this; | 
| 579 |   } | 
| 580 |  | 
| 581 |   BitVector &operator>>=(unsigned N) { | 
| 582 |     assert(N <= Size); | 
| 583 |     if (LLVM_UNLIKELY(empty() || N == 0)) | 
| 584 |       return *this; | 
| 585 |  | 
| 586 |     unsigned NumWords = Bits.size(); | 
| 587 |     assert(NumWords >= 1); | 
| 588 |  | 
| 589 |     wordShr(Count: N / BITWORD_SIZE); | 
| 590 |  | 
| 591 |     unsigned BitDistance = N % BITWORD_SIZE; | 
| 592 |     if (BitDistance == 0) | 
| 593 |       return *this; | 
| 594 |  | 
| 595 |     // When the shift size is not a multiple of the word size, then we have | 
| 596 |     // a tricky situation where each word in succession needs to extract some | 
| 597 |     // of the bits from the next word and or them into this word while | 
| 598 |     // shifting this word to make room for the new bits.  This has to be done | 
| 599 |     // for every word in the array. | 
| 600 |  | 
| 601 |     // Since we're shifting each word right, some bits will fall off the end | 
| 602 |     // of each word to the right, and empty space will be created on the left. | 
| 603 |     // The final word in the array will lose bits permanently, so starting at | 
| 604 |     // the beginning, work forwards shifting each word to the right, and | 
| 605 |     // OR'ing in the bits from the end of the next word to the beginning of | 
| 606 |     // the current word. | 
| 607 |  | 
| 608 |     // Example: | 
| 609 |     //   Starting with {0xAABBCCDD, 0xEEFF0011, 0x22334455} and shifting right | 
| 610 |     //   by 4 bits. | 
| 611 |     // Step 1: Word[0] >>= 4           ; 0x0ABBCCDD | 
| 612 |     // Step 2: Word[0] |= 0x10000000   ; 0x1ABBCCDD | 
| 613 |     // Step 3: Word[1] >>= 4           ; 0x0EEFF001 | 
| 614 |     // Step 4: Word[1] |= 0x50000000   ; 0x5EEFF001 | 
| 615 |     // Step 5: Word[2] >>= 4           ; 0x02334455 | 
| 616 |     // Result: { 0x1ABBCCDD, 0x5EEFF001, 0x02334455 } | 
| 617 |     const BitWord Mask = maskTrailingOnes<BitWord>(N: BitDistance); | 
| 618 |     const unsigned LSH = BITWORD_SIZE - BitDistance; | 
| 619 |  | 
| 620 |     for (unsigned I = 0; I < NumWords - 1; ++I) { | 
| 621 |       Bits[I] >>= BitDistance; | 
| 622 |       Bits[I] |= (Bits[I + 1] & Mask) << LSH; | 
| 623 |     } | 
| 624 |  | 
| 625 |     Bits[NumWords - 1] >>= BitDistance; | 
| 626 |  | 
| 627 |     return *this; | 
| 628 |   } | 
| 629 |  | 
| 630 |   BitVector &operator<<=(unsigned N) { | 
| 631 |     assert(N <= Size); | 
| 632 |     if (LLVM_UNLIKELY(empty() || N == 0)) | 
| 633 |       return *this; | 
| 634 |  | 
| 635 |     unsigned NumWords = Bits.size(); | 
| 636 |     assert(NumWords >= 1); | 
| 637 |  | 
| 638 |     wordShl(Count: N / BITWORD_SIZE); | 
| 639 |  | 
| 640 |     unsigned BitDistance = N % BITWORD_SIZE; | 
| 641 |     if (BitDistance == 0) | 
| 642 |       return *this; | 
| 643 |  | 
| 644 |     // When the shift size is not a multiple of the word size, then we have | 
| 645 |     // a tricky situation where each word in succession needs to extract some | 
| 646 |     // of the bits from the previous word and or them into this word while | 
| 647 |     // shifting this word to make room for the new bits.  This has to be done | 
| 648 |     // for every word in the array.  This is similar to the algorithm outlined | 
| 649 |     // in operator>>=, but backwards. | 
| 650 |  | 
| 651 |     // Since we're shifting each word left, some bits will fall off the end | 
| 652 |     // of each word to the left, and empty space will be created on the right. | 
| 653 |     // The first word in the array will lose bits permanently, so starting at | 
| 654 |     // the end, work backwards shifting each word to the left, and OR'ing | 
| 655 |     // in the bits from the end of the next word to the beginning of the | 
| 656 |     // current word. | 
| 657 |  | 
| 658 |     // Example: | 
| 659 |     //   Starting with {0xAABBCCDD, 0xEEFF0011, 0x22334455} and shifting left | 
| 660 |     //   by 4 bits. | 
| 661 |     // Step 1: Word[2] <<= 4           ; 0x23344550 | 
| 662 |     // Step 2: Word[2] |= 0x0000000E   ; 0x2334455E | 
| 663 |     // Step 3: Word[1] <<= 4           ; 0xEFF00110 | 
| 664 |     // Step 4: Word[1] |= 0x0000000A   ; 0xEFF0011A | 
| 665 |     // Step 5: Word[0] <<= 4           ; 0xABBCCDD0 | 
| 666 |     // Result: { 0xABBCCDD0, 0xEFF0011A, 0x2334455E } | 
| 667 |     const BitWord Mask = maskLeadingOnes<BitWord>(N: BitDistance); | 
| 668 |     const unsigned RSH = BITWORD_SIZE - BitDistance; | 
| 669 |  | 
| 670 |     for (int I = NumWords - 1; I > 0; --I) { | 
| 671 |       Bits[I] <<= BitDistance; | 
| 672 |       Bits[I] |= (Bits[I - 1] & Mask) >> RSH; | 
| 673 |     } | 
| 674 |     Bits[0] <<= BitDistance; | 
| 675 |     clear_unused_bits(); | 
| 676 |  | 
| 677 |     return *this; | 
| 678 |   } | 
| 679 |  | 
| 680 |   void swap(BitVector &RHS) { | 
| 681 |     std::swap(LHS&: Bits, RHS&: RHS.Bits); | 
| 682 |     std::swap(a&: Size, b&: RHS.Size); | 
| 683 |   } | 
| 684 |  | 
| 685 |   void invalid() { | 
| 686 |     assert(!Size && Bits.empty()); | 
| 687 |     Size = (unsigned)-1; | 
| 688 |   } | 
| 689 |   bool isInvalid() const { return Size == (unsigned)-1; } | 
| 690 |  | 
| 691 |   ArrayRef<BitWord> getData() const { return {&Bits[0], Bits.size()}; } | 
| 692 |  | 
| 693 |   //===--------------------------------------------------------------------===// | 
| 694 |   // Portable bit mask operations. | 
| 695 |   //===--------------------------------------------------------------------===// | 
| 696 |   // | 
| 697 |   // These methods all operate on arrays of uint32_t, each holding 32 bits. The | 
| 698 |   // fixed word size makes it easier to work with literal bit vector constants | 
| 699 |   // in portable code. | 
| 700 |   // | 
| 701 |   // The LSB in each word is the lowest numbered bit.  The size of a portable | 
| 702 |   // bit mask is always a whole multiple of 32 bits.  If no bit mask size is | 
| 703 |   // given, the bit mask is assumed to cover the entire BitVector. | 
| 704 |  | 
| 705 |   /// setBitsInMask - Add '1' bits from Mask to this vector. Don't resize. | 
| 706 |   /// This computes "*this |= Mask". | 
| 707 |   void setBitsInMask(const uint32_t *Mask, unsigned MaskWords = ~0u) { | 
| 708 |     applyMask<true, false>(Mask, MaskWords); | 
| 709 |   } | 
| 710 |  | 
| 711 |   /// clearBitsInMask - Clear any bits in this vector that are set in Mask. | 
| 712 |   /// Don't resize. This computes "*this &= ~Mask". | 
| 713 |   void clearBitsInMask(const uint32_t *Mask, unsigned MaskWords = ~0u) { | 
| 714 |     applyMask<false, false>(Mask, MaskWords); | 
| 715 |   } | 
| 716 |  | 
| 717 |   /// setBitsNotInMask - Add a bit to this vector for every '0' bit in Mask. | 
| 718 |   /// Don't resize.  This computes "*this |= ~Mask". | 
| 719 |   void setBitsNotInMask(const uint32_t *Mask, unsigned MaskWords = ~0u) { | 
| 720 |     applyMask<true, true>(Mask, MaskWords); | 
| 721 |   } | 
| 722 |  | 
| 723 |   /// clearBitsNotInMask - Clear a bit in this vector for every '0' bit in Mask. | 
| 724 |   /// Don't resize.  This computes "*this &= Mask". | 
| 725 |   void clearBitsNotInMask(const uint32_t *Mask, unsigned MaskWords = ~0u) { | 
| 726 |     applyMask<false, true>(Mask, MaskWords); | 
| 727 |   } | 
| 728 |  | 
| 729 | private: | 
| 730 |   /// Perform a logical left shift of \p Count words by moving everything | 
| 731 |   /// \p Count words to the right in memory. | 
| 732 |   /// | 
| 733 |   /// While confusing, words are stored from least significant at Bits[0] to | 
| 734 |   /// most significant at Bits[NumWords-1].  A logical shift left, however, | 
| 735 |   /// moves the current least significant bit to a higher logical index, and | 
| 736 |   /// fills the previous least significant bits with 0.  Thus, we actually | 
| 737 |   /// need to move the bytes of the memory to the right, not to the left. | 
| 738 |   /// Example: | 
| 739 |   ///   Words = [0xBBBBAAAA, 0xDDDDFFFF, 0x00000000, 0xDDDD0000] | 
| 740 |   /// represents a BitVector where 0xBBBBAAAA contain the least significant | 
| 741 |   /// bits.  So if we want to shift the BitVector left by 2 words, we need | 
| 742 |   /// to turn this into 0x00000000 0x00000000 0xBBBBAAAA 0xDDDDFFFF by using a | 
| 743 |   /// memmove which moves right, not left. | 
| 744 |   void wordShl(uint32_t Count) { | 
| 745 |     if (Count == 0) | 
| 746 |       return; | 
| 747 |  | 
| 748 |     uint32_t NumWords = Bits.size(); | 
| 749 |  | 
| 750 |     // Since we always move Word-sized chunks of data with src and dest both | 
| 751 |     // aligned to a word-boundary, we don't need to worry about endianness | 
| 752 |     // here. | 
| 753 |     std::copy(first: Bits.begin(), last: Bits.begin() + NumWords - Count, | 
| 754 |               result: Bits.begin() + Count); | 
| 755 |     std::fill(first: Bits.begin(), last: Bits.begin() + Count, value: 0); | 
| 756 |     clear_unused_bits(); | 
| 757 |   } | 
| 758 |  | 
| 759 |   /// Perform a logical right shift of \p Count words by moving those | 
| 760 |   /// words to the left in memory.  See wordShl for more information. | 
| 761 |   /// | 
| 762 |   void wordShr(uint32_t Count) { | 
| 763 |     if (Count == 0) | 
| 764 |       return; | 
| 765 |  | 
| 766 |     uint32_t NumWords = Bits.size(); | 
| 767 |  | 
| 768 |     std::copy(first: Bits.begin() + Count, last: Bits.begin() + NumWords, result: Bits.begin()); | 
| 769 |     std::fill(first: Bits.begin() + NumWords - Count, last: Bits.begin() + NumWords, value: 0); | 
| 770 |   } | 
| 771 |  | 
| 772 |   int next_unset_in_word(int WordIndex, BitWord Word) const { | 
| 773 |     unsigned Result = WordIndex * BITWORD_SIZE + llvm::countr_one(Value: Word); | 
| 774 |     return Result < size() ? Result : -1; | 
| 775 |   } | 
| 776 |  | 
| 777 |   unsigned NumBitWords(unsigned S) const { | 
| 778 |     return (S + BITWORD_SIZE-1) / BITWORD_SIZE; | 
| 779 |   } | 
| 780 |  | 
| 781 |   // Set the unused bits in the high words. | 
| 782 |   void set_unused_bits(bool t = true) { | 
| 783 |     //  Then set any stray high bits of the last used word. | 
| 784 |     if (unsigned  = Size % BITWORD_SIZE) { | 
| 785 |       BitWord  = ~BitWord(0) << ExtraBits; | 
| 786 |       if (t) | 
| 787 |         Bits.back() |= ExtraBitMask; | 
| 788 |       else | 
| 789 |         Bits.back() &= ~ExtraBitMask; | 
| 790 |     } | 
| 791 |   } | 
| 792 |  | 
| 793 |   // Clear the unused bits in the high words. | 
| 794 |   void clear_unused_bits() { | 
| 795 |     set_unused_bits(false); | 
| 796 |   } | 
| 797 |  | 
| 798 |   void init_words(bool t) { | 
| 799 |     std::fill(first: Bits.begin(), last: Bits.end(), value: 0 - (BitWord)t); | 
| 800 |   } | 
| 801 |  | 
| 802 |   template<bool AddBits, bool InvertMask> | 
| 803 |   void applyMask(const uint32_t *Mask, unsigned MaskWords) { | 
| 804 |     static_assert(BITWORD_SIZE % 32 == 0, "Unsupported BitWord size." ); | 
| 805 |     MaskWords = std::min(a: MaskWords, b: (size() + 31) / 32); | 
| 806 |     const unsigned Scale = BITWORD_SIZE / 32; | 
| 807 |     unsigned i; | 
| 808 |     for (i = 0; MaskWords >= Scale; ++i, MaskWords -= Scale) { | 
| 809 |       BitWord BW = Bits[i]; | 
| 810 |       // This inner loop should unroll completely when BITWORD_SIZE > 32. | 
| 811 |       for (unsigned b = 0; b != BITWORD_SIZE; b += 32) { | 
| 812 |         uint32_t M = *Mask++; | 
| 813 |         if (InvertMask) M = ~M; | 
| 814 |         if (AddBits) BW |=   BitWord(M) << b; | 
| 815 |         else         BW &= ~(BitWord(M) << b); | 
| 816 |       } | 
| 817 |       Bits[i] = BW; | 
| 818 |     } | 
| 819 |     for (unsigned b = 0; MaskWords; b += 32, --MaskWords) { | 
| 820 |       uint32_t M = *Mask++; | 
| 821 |       if (InvertMask) M = ~M; | 
| 822 |       if (AddBits) Bits[i] |=   BitWord(M) << b; | 
| 823 |       else         Bits[i] &= ~(BitWord(M) << b); | 
| 824 |     } | 
| 825 |     if (AddBits) | 
| 826 |       clear_unused_bits(); | 
| 827 |   } | 
| 828 |  | 
| 829 | public: | 
| 830 |   /// Return the size (in bytes) of the bit vector. | 
| 831 |   size_type getMemorySize() const { return Bits.size() * sizeof(BitWord); } | 
| 832 |   size_type getBitCapacity() const { return Bits.size() * BITWORD_SIZE; } | 
| 833 | }; | 
| 834 |  | 
| 835 | inline BitVector::size_type capacity_in_bytes(const BitVector &X) { | 
| 836 |   return X.getMemorySize(); | 
| 837 | } | 
| 838 |  | 
| 839 | template <> struct DenseMapInfo<BitVector> { | 
| 840 |   static inline BitVector getEmptyKey() { return {}; } | 
| 841 |   static inline BitVector getTombstoneKey() { | 
| 842 |     BitVector V; | 
| 843 |     V.invalid(); | 
| 844 |     return V; | 
| 845 |   } | 
| 846 |   static unsigned getHashValue(const BitVector &V) { | 
| 847 |     return DenseMapInfo<std::pair<BitVector::size_type, ArrayRef<uintptr_t>>>:: | 
| 848 |         getHashValue(PairVal: std::make_pair(x: V.size(), y: V.getData())); | 
| 849 |   } | 
| 850 |   static bool isEqual(const BitVector &LHS, const BitVector &RHS) { | 
| 851 |     if (LHS.isInvalid() || RHS.isInvalid()) | 
| 852 |       return LHS.isInvalid() == RHS.isInvalid(); | 
| 853 |     return LHS == RHS; | 
| 854 |   } | 
| 855 | }; | 
| 856 | } // end namespace llvm | 
| 857 |  | 
| 858 | namespace std { | 
| 859 |   /// Implement std::swap in terms of BitVector swap. | 
| 860 | inline void swap(llvm::BitVector &LHS, llvm::BitVector &RHS) { LHS.swap(RHS); } | 
| 861 | } // end namespace std | 
| 862 |  | 
| 863 | #endif // LLVM_ADT_BITVECTOR_H | 
| 864 |  |