diff options
-rw-r--r-- | include/llvm/ADT/BitVector.h | 32 |
1 files changed, 25 insertions, 7 deletions
diff --git a/include/llvm/ADT/BitVector.h b/include/llvm/ADT/BitVector.h index 269621313f..2b0e127265 100644 --- a/include/llvm/ADT/BitVector.h +++ b/include/llvm/ADT/BitVector.h @@ -120,8 +120,14 @@ public: /// of the bits are set. int find_first() const { for (unsigned i = 0; i < NumBitWords(size()); ++i) - if (Bits[i] != 0) - return i * BITS_PER_WORD + CountTrailingZeros_32(Bits[i]); + if (Bits[i] != 0) { + if (sizeof(BitWord) == 4) + return i * BITS_PER_WORD + CountTrailingZeros_32(Bits[i]); + else if (sizeof(BitWord) == 8) + return i * BITS_PER_WORD + CountTrailingZeros_64(Bits[i]); + else + assert(0 && "Unsupported!"); + } return -1; } @@ -136,15 +142,27 @@ public: unsigned BitPos = Prev % BITS_PER_WORD; BitWord Copy = Bits[WordPos]; // Mask off previous bits. - Copy &= ~0 << BitPos; + Copy &= ~0L << BitPos; - if (Copy != 0) - return WordPos * BITS_PER_WORD + CountTrailingZeros_32(Copy); + if (Copy != 0) { + if (sizeof(BitWord) == 4) + return WordPos * BITS_PER_WORD + CountTrailingZeros_32(Copy); + else if (sizeof(BitWord) == 8) + return WordPos * BITS_PER_WORD + CountTrailingZeros_64(Copy); + else + assert(0 && "Unsupported!"); + } // Check subsequent words. for (unsigned i = WordPos+1; i < NumBitWords(size()); ++i) - if (Bits[i] != 0) - return i * BITS_PER_WORD + CountTrailingZeros_32(Bits[i]); + if (Bits[i] != 0) { + if (sizeof(BitWord) == 4) + return i * BITS_PER_WORD + CountTrailingZeros_32(Bits[i]); + else if (sizeof(BitWord) == 8) + return i * BITS_PER_WORD + CountTrailingZeros_64(Bits[i]); + else + assert(0 && "Unsupported!"); + } return -1; } |