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