1193323Sed//===- llvm/ADT/BitVector.h - Bit vectors -----------------------*- C++ -*-===//
2193323Sed//
3193323Sed//                     The LLVM Compiler Infrastructure
4193323Sed//
5193323Sed// This file is distributed under the University of Illinois Open Source
6193323Sed// License. See LICENSE.TXT for details.
7193323Sed//
8193323Sed//===----------------------------------------------------------------------===//
9193323Sed//
10193323Sed// This file implements the BitVector class.
11193323Sed//
12193323Sed//===----------------------------------------------------------------------===//
13193323Sed
14193323Sed#ifndef LLVM_ADT_BITVECTOR_H
15193323Sed#define LLVM_ADT_BITVECTOR_H
16193323Sed
17239462Sdim#include "llvm/Support/Compiler.h"
18234353Sdim#include "llvm/Support/ErrorHandling.h"
19193323Sed#include "llvm/Support/MathExtras.h"
20193323Sed#include <algorithm>
21193323Sed#include <cassert>
22193323Sed#include <climits>
23218893Sdim#include <cstdlib>
24193323Sed
25193323Sednamespace llvm {
26193323Sed
27193323Sedclass BitVector {
28193323Sed  typedef unsigned long BitWord;
29193323Sed
30193323Sed  enum { BITWORD_SIZE = (unsigned)sizeof(BitWord) * CHAR_BIT };
31193323Sed
32193323Sed  BitWord  *Bits;        // Actual bits.
33193323Sed  unsigned Size;         // Size of bitvector in bits.
34193323Sed  unsigned Capacity;     // Size of allocated memory in BitWord.
35193323Sed
36193323Sedpublic:
37193323Sed  // Encapsulation of a single bit.
38193323Sed  class reference {
39193323Sed    friend class BitVector;
40193323Sed
41193323Sed    BitWord *WordRef;
42193323Sed    unsigned BitPos;
43193323Sed
44193323Sed    reference();  // Undefined
45193323Sed
46193323Sed  public:
47193323Sed    reference(BitVector &b, unsigned Idx) {
48193323Sed      WordRef = &b.Bits[Idx / BITWORD_SIZE];
49193323Sed      BitPos = Idx % BITWORD_SIZE;
50193323Sed    }
51193323Sed
52193323Sed    ~reference() {}
53193323Sed
54207618Srdivacky    reference &operator=(reference t) {
55207618Srdivacky      *this = bool(t);
56207618Srdivacky      return *this;
57207618Srdivacky    }
58207618Srdivacky
59193323Sed    reference& operator=(bool t) {
60193323Sed      if (t)
61193323Sed        *WordRef |= 1L << BitPos;
62193323Sed      else
63193323Sed        *WordRef &= ~(1L << BitPos);
64193323Sed      return *this;
65193323Sed    }
66193323Sed
67193323Sed    operator bool() const {
68193323Sed      return ((*WordRef) & (1L << BitPos)) ? true : false;
69193323Sed    }
70193323Sed  };
71193323Sed
72193323Sed
73193323Sed  /// BitVector default ctor - Creates an empty bitvector.
74193323Sed  BitVector() : Size(0), Capacity(0) {
75193323Sed    Bits = 0;
76193323Sed  }
77193323Sed
78193323Sed  /// BitVector ctor - Creates a bitvector of specified number of bits. All
79193323Sed  /// bits are initialized to the specified value.
80193323Sed  explicit BitVector(unsigned s, bool t = false) : Size(s) {
81193323Sed    Capacity = NumBitWords(s);
82218893Sdim    Bits = (BitWord *)std::malloc(Capacity * sizeof(BitWord));
83193323Sed    init_words(Bits, Capacity, t);
84193323Sed    if (t)
85193323Sed      clear_unused_bits();
86193323Sed  }
87193323Sed
88193323Sed  /// BitVector copy ctor.
89193323Sed  BitVector(const BitVector &RHS) : Size(RHS.size()) {
90193323Sed    if (Size == 0) {
91193323Sed      Bits = 0;
92193323Sed      Capacity = 0;
93193323Sed      return;
94193323Sed    }
95193323Sed
96193323Sed    Capacity = NumBitWords(RHS.size());
97218893Sdim    Bits = (BitWord *)std::malloc(Capacity * sizeof(BitWord));
98218893Sdim    std::memcpy(Bits, RHS.Bits, Capacity * sizeof(BitWord));
99193323Sed  }
100193323Sed
101249423Sdim#if LLVM_HAS_RVALUE_REFERENCES
102239462Sdim  BitVector(BitVector &&RHS)
103239462Sdim    : Bits(RHS.Bits), Size(RHS.Size), Capacity(RHS.Capacity) {
104239462Sdim    RHS.Bits = 0;
105239462Sdim  }
106239462Sdim#endif
107239462Sdim
108193323Sed  ~BitVector() {
109218893Sdim    std::free(Bits);
110193323Sed  }
111193323Sed
112202375Srdivacky  /// empty - Tests whether there are no bits in this bitvector.
113202375Srdivacky  bool empty() const { return Size == 0; }
114202375Srdivacky
115193323Sed  /// size - Returns the number of bits in this bitvector.
116193323Sed  unsigned size() const { return Size; }
117193323Sed
118193323Sed  /// count - Returns the number of bits which are set.
119193323Sed  unsigned count() const {
120193323Sed    unsigned NumBits = 0;
121193323Sed    for (unsigned i = 0; i < NumBitWords(size()); ++i)
122193323Sed      if (sizeof(BitWord) == 4)
123193323Sed        NumBits += CountPopulation_32((uint32_t)Bits[i]);
124193323Sed      else if (sizeof(BitWord) == 8)
125193323Sed        NumBits += CountPopulation_64(Bits[i]);
126193323Sed      else
127234353Sdim        llvm_unreachable("Unsupported!");
128193323Sed    return NumBits;
129193323Sed  }
130193323Sed
131193323Sed  /// any - Returns true if any bit is set.
132193323Sed  bool any() const {
133193323Sed    for (unsigned i = 0; i < NumBitWords(size()); ++i)
134193323Sed      if (Bits[i] != 0)
135193323Sed        return true;
136193323Sed    return false;
137193323Sed  }
138193323Sed
139218893Sdim  /// all - Returns true if all bits are set.
140218893Sdim  bool all() const {
141218893Sdim    // TODO: Optimize this.
142218893Sdim    return count() == size();
143218893Sdim  }
144218893Sdim
145193323Sed  /// none - Returns true if none of the bits are set.
146193323Sed  bool none() const {
147193323Sed    return !any();
148193323Sed  }
149193323Sed
150193323Sed  /// find_first - Returns the index of the first set bit, -1 if none
151193323Sed  /// of the bits are set.
152193323Sed  int find_first() const {
153193323Sed    for (unsigned i = 0; i < NumBitWords(size()); ++i)
154193323Sed      if (Bits[i] != 0) {
155193323Sed        if (sizeof(BitWord) == 4)
156193323Sed          return i * BITWORD_SIZE + CountTrailingZeros_32((uint32_t)Bits[i]);
157234353Sdim        if (sizeof(BitWord) == 8)
158193323Sed          return i * BITWORD_SIZE + CountTrailingZeros_64(Bits[i]);
159234353Sdim        llvm_unreachable("Unsupported!");
160193323Sed      }
161193323Sed    return -1;
162193323Sed  }
163193323Sed
164193323Sed  /// find_next - Returns the index of the next set bit following the
165193323Sed  /// "Prev" bit. Returns -1 if the next set bit is not found.
166193323Sed  int find_next(unsigned Prev) const {
167193323Sed    ++Prev;
168193323Sed    if (Prev >= Size)
169193323Sed      return -1;
170193323Sed
171193323Sed    unsigned WordPos = Prev / BITWORD_SIZE;
172193323Sed    unsigned BitPos = Prev % BITWORD_SIZE;
173193323Sed    BitWord Copy = Bits[WordPos];
174193323Sed    // Mask off previous bits.
175243830Sdim    Copy &= ~0UL << BitPos;
176193323Sed
177193323Sed    if (Copy != 0) {
178193323Sed      if (sizeof(BitWord) == 4)
179193323Sed        return WordPos * BITWORD_SIZE + CountTrailingZeros_32((uint32_t)Copy);
180234353Sdim      if (sizeof(BitWord) == 8)
181193323Sed        return WordPos * BITWORD_SIZE + CountTrailingZeros_64(Copy);
182234353Sdim      llvm_unreachable("Unsupported!");
183193323Sed    }
184193323Sed
185193323Sed    // Check subsequent words.
186193323Sed    for (unsigned i = WordPos+1; i < NumBitWords(size()); ++i)
187193323Sed      if (Bits[i] != 0) {
188193323Sed        if (sizeof(BitWord) == 4)
189193323Sed          return i * BITWORD_SIZE + CountTrailingZeros_32((uint32_t)Bits[i]);
190234353Sdim        if (sizeof(BitWord) == 8)
191193323Sed          return i * BITWORD_SIZE + CountTrailingZeros_64(Bits[i]);
192234353Sdim        llvm_unreachable("Unsupported!");
193193323Sed      }
194193323Sed    return -1;
195193323Sed  }
196193323Sed
197193323Sed  /// clear - Clear all bits.
198193323Sed  void clear() {
199193323Sed    Size = 0;
200193323Sed  }
201193323Sed
202193323Sed  /// resize - Grow or shrink the bitvector.
203193323Sed  void resize(unsigned N, bool t = false) {
204193323Sed    if (N > Capacity * BITWORD_SIZE) {
205193323Sed      unsigned OldCapacity = Capacity;
206193323Sed      grow(N);
207193323Sed      init_words(&Bits[OldCapacity], (Capacity-OldCapacity), t);
208193323Sed    }
209193323Sed
210193323Sed    // Set any old unused bits that are now included in the BitVector. This
211193323Sed    // may set bits that are not included in the new vector, but we will clear
212193323Sed    // them back out below.
213193323Sed    if (N > Size)
214193323Sed      set_unused_bits(t);
215193323Sed
216193323Sed    // Update the size, and clear out any bits that are now unused
217193323Sed    unsigned OldSize = Size;
218193323Sed    Size = N;
219193323Sed    if (t || N < OldSize)
220193323Sed      clear_unused_bits();
221193323Sed  }
222193323Sed
223193323Sed  void reserve(unsigned N) {
224193323Sed    if (N > Capacity * BITWORD_SIZE)
225193323Sed      grow(N);
226193323Sed  }
227193323Sed
228193323Sed  // Set, reset, flip
229193323Sed  BitVector &set() {
230193323Sed    init_words(Bits, Capacity, true);
231193323Sed    clear_unused_bits();
232193323Sed    return *this;
233193323Sed  }
234193323Sed
235193323Sed  BitVector &set(unsigned Idx) {
236193323Sed    Bits[Idx / BITWORD_SIZE] |= 1L << (Idx % BITWORD_SIZE);
237193323Sed    return *this;
238193323Sed  }
239193323Sed
240243830Sdim  /// set - Efficiently set a range of bits in [I, E)
241243830Sdim  BitVector &set(unsigned I, unsigned E) {
242243830Sdim    assert(I <= E && "Attempted to set backwards range!");
243243830Sdim    assert(E <= size() && "Attempted to set out-of-bounds range!");
244243830Sdim
245243830Sdim    if (I == E) return *this;
246243830Sdim
247243830Sdim    if (I / BITWORD_SIZE == E / BITWORD_SIZE) {
248243830Sdim      BitWord EMask = 1UL << (E % BITWORD_SIZE);
249243830Sdim      BitWord IMask = 1UL << (I % BITWORD_SIZE);
250243830Sdim      BitWord Mask = EMask - IMask;
251243830Sdim      Bits[I / BITWORD_SIZE] |= Mask;
252243830Sdim      return *this;
253243830Sdim    }
254243830Sdim
255243830Sdim    BitWord PrefixMask = ~0UL << (I % BITWORD_SIZE);
256243830Sdim    Bits[I / BITWORD_SIZE] |= PrefixMask;
257243830Sdim    I = RoundUpToAlignment(I, BITWORD_SIZE);
258243830Sdim
259243830Sdim    for (; I + BITWORD_SIZE <= E; I += BITWORD_SIZE)
260243830Sdim      Bits[I / BITWORD_SIZE] = ~0UL;
261243830Sdim
262243830Sdim    BitWord PostfixMask = (1UL << (E % BITWORD_SIZE)) - 1;
263243830Sdim    Bits[I / BITWORD_SIZE] |= PostfixMask;
264243830Sdim
265243830Sdim    return *this;
266243830Sdim  }
267243830Sdim
268193323Sed  BitVector &reset() {
269193323Sed    init_words(Bits, Capacity, false);
270193323Sed    return *this;
271193323Sed  }
272193323Sed
273193323Sed  BitVector &reset(unsigned Idx) {
274193323Sed    Bits[Idx / BITWORD_SIZE] &= ~(1L << (Idx % BITWORD_SIZE));
275193323Sed    return *this;
276193323Sed  }
277193323Sed
278243830Sdim  /// reset - Efficiently reset a range of bits in [I, E)
279243830Sdim  BitVector &reset(unsigned I, unsigned E) {
280243830Sdim    assert(I <= E && "Attempted to reset backwards range!");
281243830Sdim    assert(E <= size() && "Attempted to reset out-of-bounds range!");
282243830Sdim
283243830Sdim    if (I == E) return *this;
284243830Sdim
285243830Sdim    if (I / BITWORD_SIZE == E / BITWORD_SIZE) {
286243830Sdim      BitWord EMask = 1UL << (E % BITWORD_SIZE);
287243830Sdim      BitWord IMask = 1UL << (I % BITWORD_SIZE);
288243830Sdim      BitWord Mask = EMask - IMask;
289243830Sdim      Bits[I / BITWORD_SIZE] &= ~Mask;
290243830Sdim      return *this;
291243830Sdim    }
292243830Sdim
293243830Sdim    BitWord PrefixMask = ~0UL << (I % BITWORD_SIZE);
294243830Sdim    Bits[I / BITWORD_SIZE] &= ~PrefixMask;
295243830Sdim    I = RoundUpToAlignment(I, BITWORD_SIZE);
296243830Sdim
297243830Sdim    for (; I + BITWORD_SIZE <= E; I += BITWORD_SIZE)
298243830Sdim      Bits[I / BITWORD_SIZE] = 0UL;
299243830Sdim
300243830Sdim    BitWord PostfixMask = (1UL << (E % BITWORD_SIZE)) - 1;
301243830Sdim    Bits[I / BITWORD_SIZE] &= ~PostfixMask;
302243830Sdim
303243830Sdim    return *this;
304243830Sdim  }
305243830Sdim
306193323Sed  BitVector &flip() {
307193323Sed    for (unsigned i = 0; i < NumBitWords(size()); ++i)
308193323Sed      Bits[i] = ~Bits[i];
309193323Sed    clear_unused_bits();
310193323Sed    return *this;
311193323Sed  }
312193323Sed
313193323Sed  BitVector &flip(unsigned Idx) {
314193323Sed    Bits[Idx / BITWORD_SIZE] ^= 1L << (Idx % BITWORD_SIZE);
315193323Sed    return *this;
316193323Sed  }
317193323Sed
318193323Sed  // Indexing.
319193323Sed  reference operator[](unsigned Idx) {
320193323Sed    assert (Idx < Size && "Out-of-bounds Bit access.");
321193323Sed    return reference(*this, Idx);
322193323Sed  }
323193323Sed
324193323Sed  bool operator[](unsigned Idx) const {
325193323Sed    assert (Idx < Size && "Out-of-bounds Bit access.");
326193323Sed    BitWord Mask = 1L << (Idx % BITWORD_SIZE);
327193323Sed    return (Bits[Idx / BITWORD_SIZE] & Mask) != 0;
328193323Sed  }
329193323Sed
330193323Sed  bool test(unsigned Idx) const {
331193323Sed    return (*this)[Idx];
332193323Sed  }
333193323Sed
334239462Sdim  /// Test if any common bits are set.
335239462Sdim  bool anyCommon(const BitVector &RHS) const {
336239462Sdim    unsigned ThisWords = NumBitWords(size());
337239462Sdim    unsigned RHSWords  = NumBitWords(RHS.size());
338239462Sdim    for (unsigned i = 0, e = std::min(ThisWords, RHSWords); i != e; ++i)
339239462Sdim      if (Bits[i] & RHS.Bits[i])
340239462Sdim        return true;
341239462Sdim    return false;
342239462Sdim  }
343239462Sdim
344193323Sed  // Comparison operators.
345193323Sed  bool operator==(const BitVector &RHS) const {
346193323Sed    unsigned ThisWords = NumBitWords(size());
347193323Sed    unsigned RHSWords  = NumBitWords(RHS.size());
348193323Sed    unsigned i;
349193323Sed    for (i = 0; i != std::min(ThisWords, RHSWords); ++i)
350193323Sed      if (Bits[i] != RHS.Bits[i])
351193323Sed        return false;
352193323Sed
353193323Sed    // Verify that any extra words are all zeros.
354193323Sed    if (i != ThisWords) {
355193323Sed      for (; i != ThisWords; ++i)
356193323Sed        if (Bits[i])
357193323Sed          return false;
358193323Sed    } else if (i != RHSWords) {
359193323Sed      for (; i != RHSWords; ++i)
360193323Sed        if (RHS.Bits[i])
361193323Sed          return false;
362193323Sed    }
363193323Sed    return true;
364193323Sed  }
365193323Sed
366193323Sed  bool operator!=(const BitVector &RHS) const {
367193323Sed    return !(*this == RHS);
368193323Sed  }
369193323Sed
370243830Sdim  /// Intersection, union, disjoint union.
371193323Sed  BitVector &operator&=(const BitVector &RHS) {
372193323Sed    unsigned ThisWords = NumBitWords(size());
373193323Sed    unsigned RHSWords  = NumBitWords(RHS.size());
374193323Sed    unsigned i;
375193323Sed    for (i = 0; i != std::min(ThisWords, RHSWords); ++i)
376193323Sed      Bits[i] &= RHS.Bits[i];
377193323Sed
378193323Sed    // Any bits that are just in this bitvector become zero, because they aren't
379193323Sed    // in the RHS bit vector.  Any words only in RHS are ignored because they
380193323Sed    // are already zero in the LHS.
381193323Sed    for (; i != ThisWords; ++i)
382193323Sed      Bits[i] = 0;
383193323Sed
384193323Sed    return *this;
385193323Sed  }
386193323Sed
387243830Sdim  /// reset - Reset bits that are set in RHS. Same as *this &= ~RHS.
388234353Sdim  BitVector &reset(const BitVector &RHS) {
389234353Sdim    unsigned ThisWords = NumBitWords(size());
390234353Sdim    unsigned RHSWords  = NumBitWords(RHS.size());
391234353Sdim    unsigned i;
392234353Sdim    for (i = 0; i != std::min(ThisWords, RHSWords); ++i)
393234353Sdim      Bits[i] &= ~RHS.Bits[i];
394234353Sdim    return *this;
395234353Sdim  }
396234353Sdim
397243830Sdim  /// test - Check if (This - RHS) is zero.
398243830Sdim  /// This is the same as reset(RHS) and any().
399243830Sdim  bool test(const BitVector &RHS) const {
400243830Sdim    unsigned ThisWords = NumBitWords(size());
401243830Sdim    unsigned RHSWords  = NumBitWords(RHS.size());
402243830Sdim    unsigned i;
403243830Sdim    for (i = 0; i != std::min(ThisWords, RHSWords); ++i)
404243830Sdim      if ((Bits[i] & ~RHS.Bits[i]) != 0)
405243830Sdim        return true;
406243830Sdim
407243830Sdim    for (; i != ThisWords ; ++i)
408243830Sdim      if (Bits[i] != 0)
409243830Sdim        return true;
410243830Sdim
411243830Sdim    return false;
412243830Sdim  }
413243830Sdim
414193323Sed  BitVector &operator|=(const BitVector &RHS) {
415203954Srdivacky    if (size() < RHS.size())
416203954Srdivacky      resize(RHS.size());
417203954Srdivacky    for (size_t i = 0, e = NumBitWords(RHS.size()); i != e; ++i)
418193323Sed      Bits[i] |= RHS.Bits[i];
419193323Sed    return *this;
420193323Sed  }
421193323Sed
422193323Sed  BitVector &operator^=(const BitVector &RHS) {
423203954Srdivacky    if (size() < RHS.size())
424203954Srdivacky      resize(RHS.size());
425203954Srdivacky    for (size_t i = 0, e = NumBitWords(RHS.size()); i != e; ++i)
426193323Sed      Bits[i] ^= RHS.Bits[i];
427193323Sed    return *this;
428193323Sed  }
429193323Sed
430193323Sed  // Assignment operator.
431193323Sed  const BitVector &operator=(const BitVector &RHS) {
432193323Sed    if (this == &RHS) return *this;
433193323Sed
434193323Sed    Size = RHS.size();
435193323Sed    unsigned RHSWords = NumBitWords(Size);
436193323Sed    if (Size <= Capacity * BITWORD_SIZE) {
437205407Srdivacky      if (Size)
438218893Sdim        std::memcpy(Bits, RHS.Bits, RHSWords * sizeof(BitWord));
439193323Sed      clear_unused_bits();
440193323Sed      return *this;
441193323Sed    }
442193323Sed
443193323Sed    // Grow the bitvector to have enough elements.
444193323Sed    Capacity = RHSWords;
445218893Sdim    BitWord *NewBits = (BitWord *)std::malloc(Capacity * sizeof(BitWord));
446218893Sdim    std::memcpy(NewBits, RHS.Bits, Capacity * sizeof(BitWord));
447193323Sed
448193323Sed    // Destroy the old bits.
449218893Sdim    std::free(Bits);
450193323Sed    Bits = NewBits;
451193323Sed
452193323Sed    return *this;
453193323Sed  }
454193323Sed
455249423Sdim#if LLVM_HAS_RVALUE_REFERENCES
456239462Sdim  const BitVector &operator=(BitVector &&RHS) {
457239462Sdim    if (this == &RHS) return *this;
458239462Sdim
459239462Sdim    std::free(Bits);
460239462Sdim    Bits = RHS.Bits;
461239462Sdim    Size = RHS.Size;
462239462Sdim    Capacity = RHS.Capacity;
463239462Sdim
464239462Sdim    RHS.Bits = 0;
465239462Sdim
466239462Sdim    return *this;
467239462Sdim  }
468239462Sdim#endif
469239462Sdim
470202375Srdivacky  void swap(BitVector &RHS) {
471202375Srdivacky    std::swap(Bits, RHS.Bits);
472202375Srdivacky    std::swap(Size, RHS.Size);
473202375Srdivacky    std::swap(Capacity, RHS.Capacity);
474202375Srdivacky  }
475202375Srdivacky
476234353Sdim  //===--------------------------------------------------------------------===//
477234353Sdim  // Portable bit mask operations.
478234353Sdim  //===--------------------------------------------------------------------===//
479234353Sdim  //
480234353Sdim  // These methods all operate on arrays of uint32_t, each holding 32 bits. The
481234353Sdim  // fixed word size makes it easier to work with literal bit vector constants
482234353Sdim  // in portable code.
483234353Sdim  //
484234353Sdim  // The LSB in each word is the lowest numbered bit.  The size of a portable
485234353Sdim  // bit mask is always a whole multiple of 32 bits.  If no bit mask size is
486234353Sdim  // given, the bit mask is assumed to cover the entire BitVector.
487234353Sdim
488234353Sdim  /// setBitsInMask - Add '1' bits from Mask to this vector. Don't resize.
489234353Sdim  /// This computes "*this |= Mask".
490234353Sdim  void setBitsInMask(const uint32_t *Mask, unsigned MaskWords = ~0u) {
491234353Sdim    applyMask<true, false>(Mask, MaskWords);
492234353Sdim  }
493234353Sdim
494234353Sdim  /// clearBitsInMask - Clear any bits in this vector that are set in Mask.
495234353Sdim  /// Don't resize. This computes "*this &= ~Mask".
496234353Sdim  void clearBitsInMask(const uint32_t *Mask, unsigned MaskWords = ~0u) {
497234353Sdim    applyMask<false, false>(Mask, MaskWords);
498234353Sdim  }
499234353Sdim
500234353Sdim  /// setBitsNotInMask - Add a bit to this vector for every '0' bit in Mask.
501234353Sdim  /// Don't resize.  This computes "*this |= ~Mask".
502234353Sdim  void setBitsNotInMask(const uint32_t *Mask, unsigned MaskWords = ~0u) {
503234353Sdim    applyMask<true, true>(Mask, MaskWords);
504234353Sdim  }
505234353Sdim
506234353Sdim  /// clearBitsNotInMask - Clear a bit in this vector for every '0' bit in Mask.
507234353Sdim  /// Don't resize.  This computes "*this &= Mask".
508234353Sdim  void clearBitsNotInMask(const uint32_t *Mask, unsigned MaskWords = ~0u) {
509234353Sdim    applyMask<false, true>(Mask, MaskWords);
510234353Sdim  }
511234353Sdim
512193323Sedprivate:
513193323Sed  unsigned NumBitWords(unsigned S) const {
514193323Sed    return (S + BITWORD_SIZE-1) / BITWORD_SIZE;
515193323Sed  }
516193323Sed
517193323Sed  // Set the unused bits in the high words.
518193323Sed  void set_unused_bits(bool t = true) {
519193323Sed    //  Set high words first.
520193323Sed    unsigned UsedWords = NumBitWords(Size);
521193323Sed    if (Capacity > UsedWords)
522193323Sed      init_words(&Bits[UsedWords], (Capacity-UsedWords), t);
523193323Sed
524193323Sed    //  Then set any stray high bits of the last used word.
525193323Sed    unsigned ExtraBits = Size % BITWORD_SIZE;
526193323Sed    if (ExtraBits) {
527243830Sdim      BitWord ExtraBitMask = ~0UL << ExtraBits;
528243830Sdim      if (t)
529243830Sdim        Bits[UsedWords-1] |= ExtraBitMask;
530243830Sdim      else
531243830Sdim        Bits[UsedWords-1] &= ~ExtraBitMask;
532193323Sed    }
533193323Sed  }
534193323Sed
535193323Sed  // Clear the unused bits in the high words.
536193323Sed  void clear_unused_bits() {
537193323Sed    set_unused_bits(false);
538193323Sed  }
539193323Sed
540193323Sed  void grow(unsigned NewSize) {
541218893Sdim    Capacity = std::max(NumBitWords(NewSize), Capacity * 2);
542218893Sdim    Bits = (BitWord *)std::realloc(Bits, Capacity * sizeof(BitWord));
543193323Sed
544193323Sed    clear_unused_bits();
545193323Sed  }
546193323Sed
547193323Sed  void init_words(BitWord *B, unsigned NumWords, bool t) {
548193323Sed    memset(B, 0 - (int)t, NumWords*sizeof(BitWord));
549193323Sed  }
550234353Sdim
551234353Sdim  template<bool AddBits, bool InvertMask>
552234353Sdim  void applyMask(const uint32_t *Mask, unsigned MaskWords) {
553234353Sdim    assert(BITWORD_SIZE % 32 == 0 && "Unsupported BitWord size.");
554234353Sdim    MaskWords = std::min(MaskWords, (size() + 31) / 32);
555234353Sdim    const unsigned Scale = BITWORD_SIZE / 32;
556234353Sdim    unsigned i;
557234353Sdim    for (i = 0; MaskWords >= Scale; ++i, MaskWords -= Scale) {
558234353Sdim      BitWord BW = Bits[i];
559234353Sdim      // This inner loop should unroll completely when BITWORD_SIZE > 32.
560234353Sdim      for (unsigned b = 0; b != BITWORD_SIZE; b += 32) {
561234353Sdim        uint32_t M = *Mask++;
562234353Sdim        if (InvertMask) M = ~M;
563234353Sdim        if (AddBits) BW |=   BitWord(M) << b;
564234353Sdim        else         BW &= ~(BitWord(M) << b);
565234353Sdim      }
566234353Sdim      Bits[i] = BW;
567234353Sdim    }
568234353Sdim    for (unsigned b = 0; MaskWords; b += 32, --MaskWords) {
569234353Sdim      uint32_t M = *Mask++;
570234353Sdim      if (InvertMask) M = ~M;
571234353Sdim      if (AddBits) Bits[i] |=   BitWord(M) << b;
572234353Sdim      else         Bits[i] &= ~(BitWord(M) << b);
573234353Sdim    }
574234353Sdim    if (AddBits)
575234353Sdim      clear_unused_bits();
576234353Sdim  }
577193323Sed};
578193323Sed
579193323Sed} // End llvm namespace
580202375Srdivacky
581202375Srdivackynamespace std {
582202375Srdivacky  /// Implement std::swap in terms of BitVector swap.
583202375Srdivacky  inline void
584202375Srdivacky  swap(llvm::BitVector &LHS, llvm::BitVector &RHS) {
585202375Srdivacky    LHS.swap(RHS);
586202375Srdivacky  }
587202375Srdivacky}
588202375Srdivacky
589193323Sed#endif
590