-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[SmallPtrSet] Optimize contains (NFC) #118092
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
@llvm/pr-subscribers-llvm-adt Author: Nikita Popov (nikic) ChangesInstead of going through find_imp(), implement a specialized contains_imp() that directly returns a boolean instead of a pointer that needs to be compared to EndPointer(). This gives a nice compile-time improvement: https://llvm-compile-time-tracker.com/compare.php?from=352f8688d0ca250c9e8774321f6c3bcd4298cc09&to=80f10c61f8a4042e03b5873c35c46eb905a76d4a&stat=instructions:u Full diff: https://github.com/llvm/llvm-project/pull/118092.diff 1 Files Affected:
diff --git a/llvm/include/llvm/ADT/SmallPtrSet.h b/llvm/include/llvm/ADT/SmallPtrSet.h
index 1fc2318342ae78..5f4e5d3445ecec 100644
--- a/llvm/include/llvm/ADT/SmallPtrSet.h
+++ b/llvm/include/llvm/ADT/SmallPtrSet.h
@@ -216,6 +216,19 @@ class SmallPtrSetImplBase : public DebugEpochBase {
return EndPointer();
}
+ bool contains_imp(const void * Ptr) const {
+ if (isSmall()) {
+ // Linear search for the item.
+ for (const void *const *APtr = SmallArray,
+ *const *E = SmallArray + NumNonEmpty; APtr != E; ++APtr)
+ if (*APtr == Ptr)
+ return true;
+ return false;
+ }
+
+ return doFind(Ptr) != nullptr;
+ }
+
bool isSmall() const { return CurArray == SmallArray; }
private:
@@ -433,13 +446,13 @@ class SmallPtrSetImpl : public SmallPtrSetImplBase {
/// count - Return 1 if the specified pointer is in the set, 0 otherwise.
size_type count(ConstPtrType Ptr) const {
- return find_imp(ConstPtrTraits::getAsVoidPointer(Ptr)) != EndPointer();
+ return contains_imp(ConstPtrTraits::getAsVoidPointer(Ptr));
}
iterator find(ConstPtrType Ptr) const {
return makeIterator(find_imp(ConstPtrTraits::getAsVoidPointer(Ptr)));
}
bool contains(ConstPtrType Ptr) const {
- return find_imp(ConstPtrTraits::getAsVoidPointer(Ptr)) != EndPointer();
+ return contains_imp(ConstPtrTraits::getAsVoidPointer(Ptr));
}
template <typename IterT>
|
✅ With the latest revision this PR passed the C/C++ code formatter. |
Instead of going through find_imp(), implement a specialized contains_imp() that directly returns a boolean instead of a pointer that is compared to EndPointer().
c45480c
to
6e97583
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oh, nice!
Nice. It seems that |
Instead of going through find_imp(), implement a specialized contains_imp() that directly returns a boolean instead of a pointer that needs to be compared to EndPointer().
This gives a nice compile-time improvement: https://llvm-compile-time-tracker.com/compare.php?from=352f8688d0ca250c9e8774321f6c3bcd4298cc09&to=80f10c61f8a4042e03b5873c35c46eb905a76d4a&stat=instructions:u