[llvm] r247983 - Reverting r247972 (and subordinate commit r247972) as the 32-bit left-shift is undefined behavior on implementations where uinptr_t is 32-bits. One such platform is Windows, MSVC, x86.
Aaron Ballman via llvm-commits
llvm-commits at lists.llvm.org
Fri Sep 18 05:18:41 PDT 2015
Author: aaronballman
Date: Fri Sep 18 07:18:41 2015
New Revision: 247983
URL: http://llvm.org/viewvc/llvm-project?rev=247983&view=rev
Log:
Reverting r247972 (and subordinate commit r247972) as the 32-bit left-shift is undefined behavior on implementations where uinptr_t is 32-bits. One such platform is Windows, MSVC, x86.
Modified:
llvm/trunk/include/llvm/ADT/SmallBitVector.h
llvm/trunk/unittests/ADT/BitVectorTest.cpp
Modified: llvm/trunk/include/llvm/ADT/SmallBitVector.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/SmallBitVector.h?rev=247983&r1=247982&r2=247983&view=diff
==============================================================================
--- llvm/trunk/include/llvm/ADT/SmallBitVector.h (original)
+++ llvm/trunk/include/llvm/ADT/SmallBitVector.h Fri Sep 18 07:18:41 2015
@@ -553,15 +553,17 @@ public:
private:
template<bool AddBits, bool InvertMask>
void applyMask(const uint32_t *Mask, unsigned MaskWords) {
- 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 (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);
}
- if (InvertMask) M = ~M;
- if (AddBits) setSmallBits(getSmallBits() | M);
- else setSmallBits(getSmallBits() & ~M);
}
};
Modified: llvm/trunk/unittests/ADT/BitVectorTest.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ADT/BitVectorTest.cpp?rev=247983&r1=247982&r2=247983&view=diff
==============================================================================
--- llvm/trunk/unittests/ADT/BitVectorTest.cpp (original)
+++ llvm/trunk/unittests/ADT/BitVectorTest.cpp Fri Sep 18 07:18:41 2015
@@ -235,12 +235,12 @@ TYPED_TEST(BitVectorTest, PortableBitMas
const uint32_t Mask1[] = { 0x80000000, 6, 5 };
A.resize(10);
- A.setBitsInMask(Mask1, 1);
+ A.setBitsInMask(Mask1, 3);
EXPECT_EQ(10u, A.size());
EXPECT_FALSE(A.test(0));
A.resize(32);
- A.setBitsInMask(Mask1, 1);
+ A.setBitsInMask(Mask1, 3);
EXPECT_FALSE(A.test(0));
EXPECT_TRUE(A.test(31));
EXPECT_EQ(1u, A.count());
More information about the llvm-commits
mailing list