From: Yaron Keren Date: Fri, 18 Sep 2015 06:35:12 +0000 (+0000) Subject: Simplify SmallBitVector::applyMask by consolidating common code for 32-bit and 64... X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=a028622e48d7af9f70b3fe21ec5b330d6b417eff;p=oota-llvm.git Simplify SmallBitVector::applyMask by consolidating common code for 32-bit and 64-bit builds. Extend mask value to 64 bits before taking its complement and assert when mask is too large to apply in the small case (previously the extra words were silently ignored). http://reviews.llvm.org/D11890 Patch by James Touton! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@247972 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/ADT/SmallBitVector.h b/include/llvm/ADT/SmallBitVector.h index ae3d645396f..39d2e14a63d 100644 --- a/include/llvm/ADT/SmallBitVector.h +++ b/include/llvm/ADT/SmallBitVector.h @@ -553,17 +553,15 @@ public: private: template void applyMask(const uint32_t *Mask, unsigned MaskWords) { - if (NumBaseBits == 64 && MaskWords >= 2) { - uint64_t M = Mask[0] | (uint64_t(Mask[1]) << 32); - if (InvertMask) M = ~M; - if (AddBits) setSmallBits(getSmallBits() | M); - else setSmallBits(getSmallBits() & ~M); - } else { - uint32_t M = Mask[0]; - if (InvertMask) M = ~M; - if (AddBits) setSmallBits(getSmallBits() | M); - else setSmallBits(getSmallBits() & ~M); + uintptr_t M = Mask[0]; + if (MaskWords != 1) { + assert(NumBaseBits == 64 && MaskWords == 2 && + "Mask is larger than base!"); + M |= uintptr_t(Mask[1]) << 32; } + if (InvertMask) M = ~M; + if (AddBits) setSmallBits(getSmallBits() | M); + else setSmallBits(getSmallBits() & ~M); } }; diff --git a/unittests/ADT/BitVectorTest.cpp b/unittests/ADT/BitVectorTest.cpp index 3deaff0fe35..5d99e1d27a5 100644 --- a/unittests/ADT/BitVectorTest.cpp +++ b/unittests/ADT/BitVectorTest.cpp @@ -235,12 +235,12 @@ TYPED_TEST(BitVectorTest, PortableBitMask) { const uint32_t Mask1[] = { 0x80000000, 6, 5 }; A.resize(10); - A.setBitsInMask(Mask1, 3); + A.setBitsInMask(Mask1, 2); EXPECT_EQ(10u, A.size()); EXPECT_FALSE(A.test(0)); A.resize(32); - A.setBitsInMask(Mask1, 3); + A.setBitsInMask(Mask1, 2); EXPECT_FALSE(A.test(0)); EXPECT_TRUE(A.test(31)); EXPECT_EQ(1u, A.count());