From: Yaron Keren <yaron.keren@gmail.com>
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<bool AddBits, bool InvertMask>
   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());