[llvm] 8b3e345 - [ADT] Clean up TinyPtrVector

Benjamin Kramer via llvm-commits llvm-commits at lists.llvm.org
Thu Jun 26 02:16:05 PDT 2025


Author: Benjamin Kramer
Date: 2025-06-26T11:13:48+02:00
New Revision: 8b3e345002f39e288109e0d0c1a54d76a1e0bc9d

URL: https://github.com/llvm/llvm-project/commit/8b3e345002f39e288109e0d0c1a54d76a1e0bc9d
DIFF: https://github.com/llvm/llvm-project/commit/8b3e345002f39e288109e0d0c1a54d76a1e0bc9d.diff

LOG: [ADT] Clean up TinyPtrVector

- Remove implicit ArrayRef conversion, ArrayRef has conversions now.
- Remove extra dyn_casts if the TinyPtrVector can only be a big vector

No functionality change intended.

Added: 
    

Modified: 
    llvm/include/llvm/ADT/TinyPtrVector.h

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/ADT/TinyPtrVector.h b/llvm/include/llvm/ADT/TinyPtrVector.h
index 501500793509a..8d7a07b5e9eb5 100644
--- a/llvm/include/llvm/ADT/TinyPtrVector.h
+++ b/llvm/include/llvm/ADT/TinyPtrVector.h
@@ -132,47 +132,17 @@ class TinyPtrVector {
                        : Count == 1 ? PtrUnion(Value)
                                     : PtrUnion(new VecTy(Count, Value))) {}
 
-  // implicit conversion operator to ArrayRef.
-  operator ArrayRef<EltTy>() const {
-    if (Val.isNull())
-      return {};
-    if (isa<EltTy>(Val))
-      return *Val.getAddrOfPtr1();
-    return *cast<VecTy *>(Val);
-  }
-
-  // implicit conversion operator to MutableArrayRef.
-  operator MutableArrayRef<EltTy>() {
-    if (Val.isNull())
-      return {};
-    if (isa<EltTy>(Val))
-      return *Val.getAddrOfPtr1();
-    return *cast<VecTy *>(Val);
-  }
-
-  // Implicit conversion to ArrayRef<U> if EltTy* implicitly converts to U*.
-  template <
-      typename U,
-      std::enable_if_t<std::is_convertible<ArrayRef<EltTy>, ArrayRef<U>>::value,
-                       bool> = false>
-  operator ArrayRef<U>() const {
-    return operator ArrayRef<EltTy>();
-  }
-
   bool empty() const {
     // This vector can be empty if it contains no element, or if it
     // contains a pointer to an empty vector.
-    if (Val.isNull()) return true;
-    if (VecTy *Vec = dyn_cast_if_present<VecTy *>(Val))
-      return Vec->empty();
-    return false;
+    if (isa<EltTy>(Val))
+      return Val.isNull();
+    return cast<VecTy *>(Val)->empty();
   }
 
   unsigned size() const {
-    if (empty())
-      return 0;
     if (isa<EltTy>(Val))
-      return 1;
+      return Val.isNull() ? 0 : 1;
     return cast<VecTy *>(Val)->size();
   }
 
@@ -214,6 +184,9 @@ class TinyPtrVector {
     return const_reverse_iterator(begin());
   }
 
+  EltTy *data() { return begin(); }
+  const EltTy *data() const { return begin(); }
+
   EltTy operator[](unsigned i) const {
     assert(!Val.isNull() && "can't index into an empty vector");
     if (isa<EltTy>(Val)) {
@@ -250,8 +223,8 @@ class TinyPtrVector {
     // If we have a single value, convert to a vector.
     if (isa<EltTy>(Val)) {
       EltTy V = cast<EltTy>(Val);
-      Val = new VecTy();
-      cast<VecTy *>(Val)->push_back(V);
+      Val = new VecTy({V, NewVal});
+      return;
     }
 
     // Add the new value, we know we have a vector.
@@ -261,20 +234,19 @@ class TinyPtrVector {
   void pop_back() {
     // If we have a single value, convert to empty.
     if (isa<EltTy>(Val))
-      Val = (EltTy)nullptr;
-    else if (VecTy *Vec = cast<VecTy *>(Val))
-      Vec->pop_back();
+      Val = EltTy();
+    else
+      cast<VecTy *>(Val)->pop_back();
   }
 
   void clear() {
     // If we have a single value, convert to empty.
     if (isa<EltTy>(Val)) {
       Val = EltTy();
-    } else if (VecTy *Vec = dyn_cast_if_present<VecTy *>(Val)) {
+    } else {
       // If we have a vector form, just clear it.
-      Vec->clear();
+      cast<VecTy *>(Val)->clear();
     }
-    // Otherwise, we're already empty.
   }
 
   iterator erase(iterator I) {
@@ -285,10 +257,10 @@ class TinyPtrVector {
     if (isa<EltTy>(Val)) {
       if (I == begin())
         Val = EltTy();
-    } else if (VecTy *Vec = dyn_cast_if_present<VecTy *>(Val)) {
+    } else {
       // multiple items in a vector; just do the erase, there is no
       // benefit to collapsing back to a pointer
-      return Vec->erase(I);
+      return cast<VecTy *>(Val)->erase(I);
     }
     return end();
   }
@@ -301,8 +273,8 @@ class TinyPtrVector {
     if (isa<EltTy>(Val)) {
       if (S == begin() && S != E)
         Val = EltTy();
-    } else if (VecTy *Vec = dyn_cast_if_present<VecTy *>(Val)) {
-      return Vec->erase(S, E);
+    } else {
+      return cast<VecTy *>(Val)->erase(S, E);
     }
     return end();
   }


        


More information about the llvm-commits mailing list