Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 pmbaty 1
//===- llvm/ADT/SmallBitVector.h - 'Normally small' 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 SmallBitVector class.
11
///
12
//===----------------------------------------------------------------------===//
13
 
14
#ifndef LLVM_ADT_SMALLBITVECTOR_H
15
#define LLVM_ADT_SMALLBITVECTOR_H
16
 
17
#include "llvm/ADT/BitVector.h"
18
#include "llvm/ADT/iterator_range.h"
19
#include "llvm/Support/MathExtras.h"
20
#include <algorithm>
21
#include <cassert>
22
#include <climits>
23
#include <cstddef>
24
#include <cstdint>
25
#include <limits>
26
#include <utility>
27
 
28
namespace llvm {
29
 
30
/// This is a 'bitvector' (really, a variable-sized bit array), optimized for
31
/// the case when the array is small. It contains one pointer-sized field, which
32
/// is directly used as a plain collection of bits when possible, or as a
33
/// pointer to a larger heap-allocated array when necessary. This allows normal
34
/// "small" cases to be fast without losing generality for large inputs.
35
class SmallBitVector {
36
  // TODO: In "large" mode, a pointer to a BitVector is used, leading to an
37
  // unnecessary level of indirection. It would be more efficient to use a
38
  // pointer to memory containing size, allocation size, and the array of bits.
39
  uintptr_t X = 1;
40
 
41
  enum {
42
    // The number of bits in this class.
43
    NumBaseBits = sizeof(uintptr_t) * CHAR_BIT,
44
 
45
    // One bit is used to discriminate between small and large mode. The
46
    // remaining bits are used for the small-mode representation.
47
    SmallNumRawBits = NumBaseBits - 1,
48
 
49
    // A few more bits are used to store the size of the bit set in small mode.
50
    // Theoretically this is a ceil-log2. These bits are encoded in the most
51
    // significant bits of the raw bits.
52
    SmallNumSizeBits = (NumBaseBits == 32 ? 5 :
53
                        NumBaseBits == 64 ? 6 :
54
                        SmallNumRawBits),
55
 
56
    // The remaining bits are used to store the actual set in small mode.
57
    SmallNumDataBits = SmallNumRawBits - SmallNumSizeBits
58
  };
59
 
60
  static_assert(NumBaseBits == 64 || NumBaseBits == 32,
61
                "Unsupported word size");
62
 
63
public:
64
  using size_type = uintptr_t;
65
 
66
  // Encapsulation of a single bit.
67
  class reference {
68
    SmallBitVector &TheVector;
69
    unsigned BitPos;
70
 
71
  public:
72
    reference(SmallBitVector &b, unsigned Idx) : TheVector(b), BitPos(Idx) {}
73
 
74
    reference(const reference&) = default;
75
 
76
    reference& operator=(reference t) {
77
      *this = bool(t);
78
      return *this;
79
    }
80
 
81
    reference& operator=(bool t) {
82
      if (t)
83
        TheVector.set(BitPos);
84
      else
85
        TheVector.reset(BitPos);
86
      return *this;
87
    }
88
 
89
    operator bool() const {
90
      return const_cast<const SmallBitVector &>(TheVector).operator[](BitPos);
91
    }
92
  };
93
 
94
private:
95
  BitVector *getPointer() const {
96
    assert(!isSmall());
97
    return reinterpret_cast<BitVector *>(X);
98
  }
99
 
100
  void switchToSmall(uintptr_t NewSmallBits, size_type NewSize) {
101
    X = 1;
102
    setSmallSize(NewSize);
103
    setSmallBits(NewSmallBits);
104
  }
105
 
106
  void switchToLarge(BitVector *BV) {
107
    X = reinterpret_cast<uintptr_t>(BV);
108
    assert(!isSmall() && "Tried to use an unaligned pointer");
109
  }
110
 
111
  // Return all the bits used for the "small" representation; this includes
112
  // bits for the size as well as the element bits.
113
  uintptr_t getSmallRawBits() const {
114
    assert(isSmall());
115
    return X >> 1;
116
  }
117
 
118
  void setSmallRawBits(uintptr_t NewRawBits) {
119
    assert(isSmall());
120
    X = (NewRawBits << 1) | uintptr_t(1);
121
  }
122
 
123
  // Return the size.
124
  size_type getSmallSize() const {
125
    return getSmallRawBits() >> SmallNumDataBits;
126
  }
127
 
128
  void setSmallSize(size_type Size) {
129
    setSmallRawBits(getSmallBits() | (Size << SmallNumDataBits));
130
  }
131
 
132
  // Return the element bits.
133
  uintptr_t getSmallBits() const {
134
    return getSmallRawBits() & ~(~uintptr_t(0) << getSmallSize());
135
  }
136
 
137
  void setSmallBits(uintptr_t NewBits) {
138
    setSmallRawBits((NewBits & ~(~uintptr_t(0) << getSmallSize())) |
139
                    (getSmallSize() << SmallNumDataBits));
140
  }
141
 
142
public:
143
  /// Creates an empty bitvector.
144
  SmallBitVector() = default;
145
 
146
  /// Creates a bitvector of specified number of bits. All bits are initialized
147
  /// to the specified value.
148
  explicit SmallBitVector(unsigned s, bool t = false) {
149
    if (s <= SmallNumDataBits)
150
      switchToSmall(t ? ~uintptr_t(0) : 0, s);
151
    else
152
      switchToLarge(new BitVector(s, t));
153
  }
154
 
155
  /// SmallBitVector copy ctor.
156
  SmallBitVector(const SmallBitVector &RHS) {
157
    if (RHS.isSmall())
158
      X = RHS.X;
159
    else
160
      switchToLarge(new BitVector(*RHS.getPointer()));
161
  }
162
 
163
  SmallBitVector(SmallBitVector &&RHS) : X(RHS.X) {
164
    RHS.X = 1;
165
  }
166
 
167
  ~SmallBitVector() {
168
    if (!isSmall())
169
      delete getPointer();
170
  }
171
 
172
  using const_set_bits_iterator = const_set_bits_iterator_impl<SmallBitVector>;
173
  using set_iterator = const_set_bits_iterator;
174
 
175
  const_set_bits_iterator set_bits_begin() const {
176
    return const_set_bits_iterator(*this);
177
  }
178
 
179
  const_set_bits_iterator set_bits_end() const {
180
    return const_set_bits_iterator(*this, -1);
181
  }
182
 
183
  iterator_range<const_set_bits_iterator> set_bits() const {
184
    return make_range(set_bits_begin(), set_bits_end());
185
  }
186
 
187
  bool isSmall() const { return X & uintptr_t(1); }
188
 
189
  /// Tests whether there are no bits in this bitvector.
190
  bool empty() const {
191
    return isSmall() ? getSmallSize() == 0 : getPointer()->empty();
192
  }
193
 
194
  /// Returns the number of bits in this bitvector.
195
  size_type size() const {
196
    return isSmall() ? getSmallSize() : getPointer()->size();
197
  }
198
 
199
  /// Returns the number of bits which are set.
200
  size_type count() const {
201
    if (isSmall()) {
202
      uintptr_t Bits = getSmallBits();
203
      return llvm::popcount(Bits);
204
    }
205
    return getPointer()->count();
206
  }
207
 
208
  /// Returns true if any bit is set.
209
  bool any() const {
210
    if (isSmall())
211
      return getSmallBits() != 0;
212
    return getPointer()->any();
213
  }
214
 
215
  /// Returns true if all bits are set.
216
  bool all() const {
217
    if (isSmall())
218
      return getSmallBits() == (uintptr_t(1) << getSmallSize()) - 1;
219
    return getPointer()->all();
220
  }
221
 
222
  /// Returns true if none of the bits are set.
223
  bool none() const {
224
    if (isSmall())
225
      return getSmallBits() == 0;
226
    return getPointer()->none();
227
  }
228
 
229
  /// Returns the index of the first set bit, -1 if none of the bits are set.
230
  int find_first() const {
231
    if (isSmall()) {
232
      uintptr_t Bits = getSmallBits();
233
      if (Bits == 0)
234
        return -1;
235
      return countTrailingZeros(Bits);
236
    }
237
    return getPointer()->find_first();
238
  }
239
 
240
  int find_last() const {
241
    if (isSmall()) {
242
      uintptr_t Bits = getSmallBits();
243
      if (Bits == 0)
244
        return -1;
245
      return NumBaseBits - countLeadingZeros(Bits) - 1;
246
    }
247
    return getPointer()->find_last();
248
  }
249
 
250
  /// Returns the index of the first unset bit, -1 if all of the bits are set.
251
  int find_first_unset() const {
252
    if (isSmall()) {
253
      if (count() == getSmallSize())
254
        return -1;
255
 
256
      uintptr_t Bits = getSmallBits();
257
      return countTrailingOnes(Bits);
258
    }
259
    return getPointer()->find_first_unset();
260
  }
261
 
262
  int find_last_unset() const {
263
    if (isSmall()) {
264
      if (count() == getSmallSize())
265
        return -1;
266
 
267
      uintptr_t Bits = getSmallBits();
268
      // Set unused bits.
269
      Bits |= ~uintptr_t(0) << getSmallSize();
270
      return NumBaseBits - countLeadingOnes(Bits) - 1;
271
    }
272
    return getPointer()->find_last_unset();
273
  }
274
 
275
  /// Returns the index of the next set bit following the "Prev" bit.
276
  /// Returns -1 if the next set bit is not found.
277
  int find_next(unsigned Prev) const {
278
    if (isSmall()) {
279
      uintptr_t Bits = getSmallBits();
280
      // Mask off previous bits.
281
      Bits &= ~uintptr_t(0) << (Prev + 1);
282
      if (Bits == 0 || Prev + 1 >= getSmallSize())
283
        return -1;
284
      return countTrailingZeros(Bits);
285
    }
286
    return getPointer()->find_next(Prev);
287
  }
288
 
289
  /// Returns the index of the next unset bit following the "Prev" bit.
290
  /// Returns -1 if the next unset bit is not found.
291
  int find_next_unset(unsigned Prev) const {
292
    if (isSmall()) {
293
      uintptr_t Bits = getSmallBits();
294
      // Mask in previous bits.
295
      Bits |= (uintptr_t(1) << (Prev + 1)) - 1;
296
      // Mask in unused bits.
297
      Bits |= ~uintptr_t(0) << getSmallSize();
298
 
299
      if (Bits == ~uintptr_t(0) || Prev + 1 >= getSmallSize())
300
        return -1;
301
      return countTrailingOnes(Bits);
302
    }
303
    return getPointer()->find_next_unset(Prev);
304
  }
305
 
306
  /// find_prev - Returns the index of the first set bit that precedes the
307
  /// the bit at \p PriorTo.  Returns -1 if all previous bits are unset.
308
  int find_prev(unsigned PriorTo) const {
309
    if (isSmall()) {
310
      if (PriorTo == 0)
311
        return -1;
312
 
313
      --PriorTo;
314
      uintptr_t Bits = getSmallBits();
315
      Bits &= maskTrailingOnes<uintptr_t>(PriorTo + 1);
316
      if (Bits == 0)
317
        return -1;
318
 
319
      return NumBaseBits - countLeadingZeros(Bits) - 1;
320
    }
321
    return getPointer()->find_prev(PriorTo);
322
  }
323
 
324
  /// Clear all bits.
325
  void clear() {
326
    if (!isSmall())
327
      delete getPointer();
328
    switchToSmall(0, 0);
329
  }
330
 
331
  /// Grow or shrink the bitvector.
332
  void resize(unsigned N, bool t = false) {
333
    if (!isSmall()) {
334
      getPointer()->resize(N, t);
335
    } else if (SmallNumDataBits >= N) {
336
      uintptr_t NewBits = t ? ~uintptr_t(0) << getSmallSize() : 0;
337
      setSmallSize(N);
338
      setSmallBits(NewBits | getSmallBits());
339
    } else {
340
      BitVector *BV = new BitVector(N, t);
341
      uintptr_t OldBits = getSmallBits();
342
      for (size_type I = 0, E = getSmallSize(); I != E; ++I)
343
        (*BV)[I] = (OldBits >> I) & 1;
344
      switchToLarge(BV);
345
    }
346
  }
347
 
348
  void reserve(unsigned N) {
349
    if (isSmall()) {
350
      if (N > SmallNumDataBits) {
351
        uintptr_t OldBits = getSmallRawBits();
352
        size_type SmallSize = getSmallSize();
353
        BitVector *BV = new BitVector(SmallSize);
354
        for (size_type I = 0; I < SmallSize; ++I)
355
          if ((OldBits >> I) & 1)
356
            BV->set(I);
357
        BV->reserve(N);
358
        switchToLarge(BV);
359
      }
360
    } else {
361
      getPointer()->reserve(N);
362
    }
363
  }
364
 
365
  // Set, reset, flip
366
  SmallBitVector &set() {
367
    if (isSmall())
368
      setSmallBits(~uintptr_t(0));
369
    else
370
      getPointer()->set();
371
    return *this;
372
  }
373
 
374
  SmallBitVector &set(unsigned Idx) {
375
    if (isSmall()) {
376
      assert(Idx <= static_cast<unsigned>(
377
                        std::numeric_limits<uintptr_t>::digits) &&
378
             "undefined behavior");
379
      setSmallBits(getSmallBits() | (uintptr_t(1) << Idx));
380
    }
381
    else
382
      getPointer()->set(Idx);
383
    return *this;
384
  }
385
 
386
  /// Efficiently set a range of bits in [I, E)
387
  SmallBitVector &set(unsigned I, unsigned E) {
388
    assert(I <= E && "Attempted to set backwards range!");
389
    assert(E <= size() && "Attempted to set out-of-bounds range!");
390
    if (I == E) return *this;
391
    if (isSmall()) {
392
      uintptr_t EMask = ((uintptr_t)1) << E;
393
      uintptr_t IMask = ((uintptr_t)1) << I;
394
      uintptr_t Mask = EMask - IMask;
395
      setSmallBits(getSmallBits() | Mask);
396
    } else
397
      getPointer()->set(I, E);
398
    return *this;
399
  }
400
 
401
  SmallBitVector &reset() {
402
    if (isSmall())
403
      setSmallBits(0);
404
    else
405
      getPointer()->reset();
406
    return *this;
407
  }
408
 
409
  SmallBitVector &reset(unsigned Idx) {
410
    if (isSmall())
411
      setSmallBits(getSmallBits() & ~(uintptr_t(1) << Idx));
412
    else
413
      getPointer()->reset(Idx);
414
    return *this;
415
  }
416
 
417
  /// Efficiently reset a range of bits in [I, E)
418
  SmallBitVector &reset(unsigned I, unsigned E) {
419
    assert(I <= E && "Attempted to reset backwards range!");
420
    assert(E <= size() && "Attempted to reset out-of-bounds range!");
421
    if (I == E) return *this;
422
    if (isSmall()) {
423
      uintptr_t EMask = ((uintptr_t)1) << E;
424
      uintptr_t IMask = ((uintptr_t)1) << I;
425
      uintptr_t Mask = EMask - IMask;
426
      setSmallBits(getSmallBits() & ~Mask);
427
    } else
428
      getPointer()->reset(I, E);
429
    return *this;
430
  }
431
 
432
  SmallBitVector &flip() {
433
    if (isSmall())
434
      setSmallBits(~getSmallBits());
435
    else
436
      getPointer()->flip();
437
    return *this;
438
  }
439
 
440
  SmallBitVector &flip(unsigned Idx) {
441
    if (isSmall())
442
      setSmallBits(getSmallBits() ^ (uintptr_t(1) << Idx));
443
    else
444
      getPointer()->flip(Idx);
445
    return *this;
446
  }
447
 
448
  // No argument flip.
449
  SmallBitVector operator~() const {
450
    return SmallBitVector(*this).flip();
451
  }
452
 
453
  // Indexing.
454
  reference operator[](unsigned Idx) {
455
    assert(Idx < size() && "Out-of-bounds Bit access.");
456
    return reference(*this, Idx);
457
  }
458
 
459
  bool operator[](unsigned Idx) const {
460
    assert(Idx < size() && "Out-of-bounds Bit access.");
461
    if (isSmall())
462
      return ((getSmallBits() >> Idx) & 1) != 0;
463
    return getPointer()->operator[](Idx);
464
  }
465
 
466
  /// Return the last element in the vector.
467
  bool back() const {
468
    assert(!empty() && "Getting last element of empty vector.");
469
    return (*this)[size() - 1];
470
  }
471
 
472
  bool test(unsigned Idx) const {
473
    return (*this)[Idx];
474
  }
475
 
476
  // Push single bit to end of vector.
477
  void push_back(bool Val) {
478
    resize(size() + 1, Val);
479
  }
480
 
481
  /// Pop one bit from the end of the vector.
482
  void pop_back() {
483
    assert(!empty() && "Empty vector has no element to pop.");
484
    resize(size() - 1);
485
  }
486
 
487
  /// Test if any common bits are set.
488
  bool anyCommon(const SmallBitVector &RHS) const {
489
    if (isSmall() && RHS.isSmall())
490
      return (getSmallBits() & RHS.getSmallBits()) != 0;
491
    if (!isSmall() && !RHS.isSmall())
492
      return getPointer()->anyCommon(*RHS.getPointer());
493
 
494
    for (unsigned i = 0, e = std::min(size(), RHS.size()); i != e; ++i)
495
      if (test(i) && RHS.test(i))
496
        return true;
497
    return false;
498
  }
499
 
500
  // Comparison operators.
501
  bool operator==(const SmallBitVector &RHS) const {
502
    if (size() != RHS.size())
503
      return false;
504
    if (isSmall() && RHS.isSmall())
505
      return getSmallBits() == RHS.getSmallBits();
506
    else if (!isSmall() && !RHS.isSmall())
507
      return *getPointer() == *RHS.getPointer();
508
    else {
509
      for (size_type I = 0, E = size(); I != E; ++I) {
510
        if ((*this)[I] != RHS[I])
511
          return false;
512
      }
513
      return true;
514
    }
515
  }
516
 
517
  bool operator!=(const SmallBitVector &RHS) const {
518
    return !(*this == RHS);
519
  }
520
 
521
  // Intersection, union, disjoint union.
522
  // FIXME BitVector::operator&= does not resize the LHS but this does
523
  SmallBitVector &operator&=(const SmallBitVector &RHS) {
524
    resize(std::max(size(), RHS.size()));
525
    if (isSmall() && RHS.isSmall())
526
      setSmallBits(getSmallBits() & RHS.getSmallBits());
527
    else if (!isSmall() && !RHS.isSmall())
528
      getPointer()->operator&=(*RHS.getPointer());
529
    else {
530
      size_type I, E;
531
      for (I = 0, E = std::min(size(), RHS.size()); I != E; ++I)
532
        (*this)[I] = test(I) && RHS.test(I);
533
      for (E = size(); I != E; ++I)
534
        reset(I);
535
    }
536
    return *this;
537
  }
538
 
539
  /// Reset bits that are set in RHS. Same as *this &= ~RHS.
540
  SmallBitVector &reset(const SmallBitVector &RHS) {
541
    if (isSmall() && RHS.isSmall())
542
      setSmallBits(getSmallBits() & ~RHS.getSmallBits());
543
    else if (!isSmall() && !RHS.isSmall())
544
      getPointer()->reset(*RHS.getPointer());
545
    else
546
      for (unsigned i = 0, e = std::min(size(), RHS.size()); i != e; ++i)
547
        if (RHS.test(i))
548
          reset(i);
549
 
550
    return *this;
551
  }
552
 
553
  /// Check if (This - RHS) is zero. This is the same as reset(RHS) and any().
554
  bool test(const SmallBitVector &RHS) const {
555
    if (isSmall() && RHS.isSmall())
556
      return (getSmallBits() & ~RHS.getSmallBits()) != 0;
557
    if (!isSmall() && !RHS.isSmall())
558
      return getPointer()->test(*RHS.getPointer());
559
 
560
    unsigned i, e;
561
    for (i = 0, e = std::min(size(), RHS.size()); i != e; ++i)
562
      if (test(i) && !RHS.test(i))
563
        return true;
564
 
565
    for (e = size(); i != e; ++i)
566
      if (test(i))
567
        return true;
568
 
569
    return false;
570
  }
571
 
572
  SmallBitVector &operator|=(const SmallBitVector &RHS) {
573
    resize(std::max(size(), RHS.size()));
574
    if (isSmall() && RHS.isSmall())
575
      setSmallBits(getSmallBits() | RHS.getSmallBits());
576
    else if (!isSmall() && !RHS.isSmall())
577
      getPointer()->operator|=(*RHS.getPointer());
578
    else {
579
      for (size_type I = 0, E = RHS.size(); I != E; ++I)
580
        (*this)[I] = test(I) || RHS.test(I);
581
    }
582
    return *this;
583
  }
584
 
585
  SmallBitVector &operator^=(const SmallBitVector &RHS) {
586
    resize(std::max(size(), RHS.size()));
587
    if (isSmall() && RHS.isSmall())
588
      setSmallBits(getSmallBits() ^ RHS.getSmallBits());
589
    else if (!isSmall() && !RHS.isSmall())
590
      getPointer()->operator^=(*RHS.getPointer());
591
    else {
592
      for (size_type I = 0, E = RHS.size(); I != E; ++I)
593
        (*this)[I] = test(I) != RHS.test(I);
594
    }
595
    return *this;
596
  }
597
 
598
  SmallBitVector &operator<<=(unsigned N) {
599
    if (isSmall())
600
      setSmallBits(getSmallBits() << N);
601
    else
602
      getPointer()->operator<<=(N);
603
    return *this;
604
  }
605
 
606
  SmallBitVector &operator>>=(unsigned N) {
607
    if (isSmall())
608
      setSmallBits(getSmallBits() >> N);
609
    else
610
      getPointer()->operator>>=(N);
611
    return *this;
612
  }
613
 
614
  // Assignment operator.
615
  const SmallBitVector &operator=(const SmallBitVector &RHS) {
616
    if (isSmall()) {
617
      if (RHS.isSmall())
618
        X = RHS.X;
619
      else
620
        switchToLarge(new BitVector(*RHS.getPointer()));
621
    } else {
622
      if (!RHS.isSmall())
623
        *getPointer() = *RHS.getPointer();
624
      else {
625
        delete getPointer();
626
        X = RHS.X;
627
      }
628
    }
629
    return *this;
630
  }
631
 
632
  const SmallBitVector &operator=(SmallBitVector &&RHS) {
633
    if (this != &RHS) {
634
      clear();
635
      swap(RHS);
636
    }
637
    return *this;
638
  }
639
 
640
  void swap(SmallBitVector &RHS) {
641
    std::swap(X, RHS.X);
642
  }
643
 
644
  /// Add '1' bits from Mask to this vector. Don't resize.
645
  /// This computes "*this |= Mask".
646
  void setBitsInMask(const uint32_t *Mask, unsigned MaskWords = ~0u) {
647
    if (isSmall())
648
      applyMask<true, false>(Mask, MaskWords);
649
    else
650
      getPointer()->setBitsInMask(Mask, MaskWords);
651
  }
652
 
653
  /// Clear any bits in this vector that are set in Mask. Don't resize.
654
  /// This computes "*this &= ~Mask".
655
  void clearBitsInMask(const uint32_t *Mask, unsigned MaskWords = ~0u) {
656
    if (isSmall())
657
      applyMask<false, false>(Mask, MaskWords);
658
    else
659
      getPointer()->clearBitsInMask(Mask, MaskWords);
660
  }
661
 
662
  /// Add a bit to this vector for every '0' bit in Mask. Don't resize.
663
  /// This computes "*this |= ~Mask".
664
  void setBitsNotInMask(const uint32_t *Mask, unsigned MaskWords = ~0u) {
665
    if (isSmall())
666
      applyMask<true, true>(Mask, MaskWords);
667
    else
668
      getPointer()->setBitsNotInMask(Mask, MaskWords);
669
  }
670
 
671
  /// Clear a bit in this vector for every '0' bit in Mask. Don't resize.
672
  /// This computes "*this &= Mask".
673
  void clearBitsNotInMask(const uint32_t *Mask, unsigned MaskWords = ~0u) {
674
    if (isSmall())
675
      applyMask<false, true>(Mask, MaskWords);
676
    else
677
      getPointer()->clearBitsNotInMask(Mask, MaskWords);
678
  }
679
 
680
  void invalid() {
681
    assert(empty());
682
    X = (uintptr_t)-1;
683
  }
684
  bool isInvalid() const { return X == (uintptr_t)-1; }
685
 
686
  ArrayRef<uintptr_t> getData(uintptr_t &Store) const {
687
    if (!isSmall())
688
      return getPointer()->getData();
689
    Store = getSmallBits();
690
    return Store;
691
  }
692
 
693
private:
694
  template <bool AddBits, bool InvertMask>
695
  void applyMask(const uint32_t *Mask, unsigned MaskWords) {
696
    assert(MaskWords <= sizeof(uintptr_t) && "Mask is larger than base!");
697
    uintptr_t M = Mask[0];
698
    if (NumBaseBits == 64)
699
      M |= uint64_t(Mask[1]) << 32;
700
    if (InvertMask)
701
      M = ~M;
702
    if (AddBits)
703
      setSmallBits(getSmallBits() | M);
704
    else
705
      setSmallBits(getSmallBits() & ~M);
706
  }
707
};
708
 
709
inline SmallBitVector
710
operator&(const SmallBitVector &LHS, const SmallBitVector &RHS) {
711
  SmallBitVector Result(LHS);
712
  Result &= RHS;
713
  return Result;
714
}
715
 
716
inline SmallBitVector
717
operator|(const SmallBitVector &LHS, const SmallBitVector &RHS) {
718
  SmallBitVector Result(LHS);
719
  Result |= RHS;
720
  return Result;
721
}
722
 
723
inline SmallBitVector
724
operator^(const SmallBitVector &LHS, const SmallBitVector &RHS) {
725
  SmallBitVector Result(LHS);
726
  Result ^= RHS;
727
  return Result;
728
}
729
 
730
template <> struct DenseMapInfo<SmallBitVector> {
731
  static inline SmallBitVector getEmptyKey() { return SmallBitVector(); }
732
  static inline SmallBitVector getTombstoneKey() {
733
    SmallBitVector V;
734
    V.invalid();
735
    return V;
736
  }
737
  static unsigned getHashValue(const SmallBitVector &V) {
738
    uintptr_t Store;
739
    return DenseMapInfo<
740
        std::pair<SmallBitVector::size_type, ArrayRef<uintptr_t>>>::
741
        getHashValue(std::make_pair(V.size(), V.getData(Store)));
742
  }
743
  static bool isEqual(const SmallBitVector &LHS, const SmallBitVector &RHS) {
744
    if (LHS.isInvalid() || RHS.isInvalid())
745
      return LHS.isInvalid() == RHS.isInvalid();
746
    return LHS == RHS;
747
  }
748
};
749
} // end namespace llvm
750
 
751
namespace std {
752
 
753
/// Implement std::swap in terms of BitVector swap.
754
inline void
755
swap(llvm::SmallBitVector &LHS, llvm::SmallBitVector &RHS) {
756
  LHS.swap(RHS);
757
}
758
 
759
} // end namespace std
760
 
761
#endif // LLVM_ADT_SMALLBITVECTOR_H