[PATCH] D52236: [ADT][BitVector] Add push_back()
Simon Pilgrim via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 18 07:40:56 PDT 2018
RKSimon created this revision.
RKSimon added reviewers: zturner, efriedma, craig.topper, spatel.
Herald added a subscriber: dexonsmith.
Add a higher performance alternative to calling resize() every time which performs a lot of clearing to zero - when we're adding a single bit most of the time this will be completely unnecessary.
Converting CodeGenDAGPatterns::GenerateVariants() to use this saves 10secs in debug builds of x86 -gen-dag-isel
Repository:
rL LLVM
https://reviews.llvm.org/D52236
Files:
include/llvm/ADT/BitVector.h
include/llvm/ADT/SmallBitVector.h
unittests/ADT/BitVectorTest.cpp
Index: unittests/ADT/BitVectorTest.cpp
===================================================================
--- unittests/ADT/BitVectorTest.cpp
+++ unittests/ADT/BitVectorTest.cpp
@@ -836,5 +836,27 @@
for (unsigned Bit : ToFill.set_bits())
EXPECT_EQ(List[i++], Bit);
}
+
+TYPED_TEST(BitVectorTest, PushBack) {
+ TypeParam Vec(10, false);
+ Vec.push_back(true);
+ EXPECT_EQ(10, Vec.find_first());
+ EXPECT_EQ(10, Vec.find_last());
+
+ Vec.push_back(false);
+ EXPECT_EQ(10, Vec.find_first());
+ EXPECT_EQ(10, Vec.find_last());
+
+ Vec.push_back(true);
+ EXPECT_EQ(10, Vec.find_first());
+ EXPECT_EQ(12, Vec.find_last());
+
+ // Add a lot of values to cause reallocation.
+ for (int i = 0; i != 100; ++i) {
+ Vec.push_back(true);
+ Vec.push_back(false);
+ }
+ EXPECT_EQ(102, Vec.count());
+}
}
#endif
Index: include/llvm/ADT/SmallBitVector.h
===================================================================
--- include/llvm/ADT/SmallBitVector.h
+++ include/llvm/ADT/SmallBitVector.h
@@ -465,6 +465,11 @@
return (*this)[Idx];
}
+ // Push single bit to end of vector.
+ void push_back(bool Val) {
+ resize(size() + 1, Val);
+ }
+
/// Test if any common bits are set.
bool anyCommon(const SmallBitVector &RHS) const {
if (isSmall() && RHS.isSmall())
Index: include/llvm/ADT/BitVector.h
===================================================================
--- include/llvm/ADT/BitVector.h
+++ include/llvm/ADT/BitVector.h
@@ -503,6 +503,23 @@
return (*this)[Idx];
}
+ // Push single bit to end of vector.
+ void push_back(bool Val) {
+ unsigned OldSize = Size;
+ unsigned NewSize = Size + 1;
+
+ // Resize, which will insert zeros.
+ // If we already fit then the unused bits will be already zero.
+ if (NewSize > getBitCapacity())
+ resize(NewSize, false);
+ else
+ Size = NewSize;
+
+ // If true, set single bit.
+ if (Val)
+ set(OldSize);
+ }
+
/// Test if any common bits are set.
bool anyCommon(const BitVector &RHS) const {
unsigned ThisWords = NumBitWords(size());
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D52236.165977.patch
Type: text/x-patch
Size: 2148 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180918/d7f9295c/attachment.bin>
More information about the llvm-commits
mailing list