[PATCH] D156005: Use `getHashValue` in `SetVector::insert` and `SetVector::contains`

Evan Wilde via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Sat Jul 22 14:56:52 PDT 2023


etcwilde updated this revision to Diff 543231.
etcwilde added a comment.

Updating to use the `DenseMapInfo` implementation of `isEqual` instead of the hash value to ensure we're using the same semantics that DenseMap/DenseSet use to determine equality.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D156005/new/

https://reviews.llvm.org/D156005

Files:
  llvm/include/llvm/ADT/SetVector.h


Index: llvm/include/llvm/ADT/SetVector.h
===================================================================
--- llvm/include/llvm/ADT/SetVector.h
+++ llvm/include/llvm/ADT/SetVector.h
@@ -56,7 +56,7 @@
           typename Set = DenseSet<T>, unsigned N = 0>
 class SetVector {
   // Much like in SmallPtrSet, this value should not be too high to prevent
-  // excessively long linear scans from occuring.
+  // excessively long linear scans from occurring.
   static_assert(N <= 32, "Small size should be less than or equal to 32!");
 
 public:
@@ -162,7 +162,10 @@
   bool insert(const value_type &X) {
     if constexpr (canBeSmall())
       if (isSmall()) {
-        if (llvm::find(vector_, X) == vector_.end()) {
+        auto comparator = [&X](const value_type &element) -> bool {
+          return llvm::DenseMapInfo<value_type>::isEqual(X, element);
+        };
+        if (llvm::find_if(vector_, comparator) == vector_.end()) {
           vector_.push_back(X);
           if (vector_.size() > N)
             makeBig();
@@ -253,8 +256,12 @@
   /// Check if the SetVector contains the given key.
   bool contains(const key_type &key) const {
     if constexpr (canBeSmall())
-      if (isSmall())
-        return is_contained(vector_, key);
+      if (isSmall()) {
+        auto comparator = [&key](const value_type &element) -> bool {
+          return llvm::DenseMapInfo<value_type>::isEqual(key, element);
+        };
+        return llvm::find_if(vector_, comparator) != vector_.end();
+      }
 
     return set_.find(key) != set_.end();
   }
@@ -262,11 +269,7 @@
   /// Count the number of elements of a given key in the SetVector.
   /// \returns 0 if the element is not in the SetVector, 1 if it is.
   size_type count(const key_type &key) const {
-    if constexpr (canBeSmall())
-      if (isSmall())
-        return is_contained(vector_, key);
-
-    return set_.count(key);
+    return contains(key);
   }
 
   /// Completely clear the SetVector


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D156005.543231.patch
Type: text/x-patch
Size: 1966 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230722/a5acc88e/attachment.bin>


More information about the llvm-commits mailing list