]> granicus.if.org Git - llvm/commitdiff
IR: Stop erasing MDNodes from uniquing sets during teardown
authorDuncan P. N. Exon Smith <dexonsmith@apple.com>
Mon, 12 Jan 2015 20:50:25 +0000 (20:50 +0000)
committerDuncan P. N. Exon Smith <dexonsmith@apple.com>
Mon, 12 Jan 2015 20:50:25 +0000 (20:50 +0000)
Stop erasing `MDNode`s from the uniquing sets in `LLVMContextImpl`
during teardown (in particular, during
`UniquableMDNode::~UniquableMDNode()`).  Although it's currently
feasible, there isn't any clear benefit and it may not be feasible for
other subclasses (which don't explicitly store the lookup hash).

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@225696 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/IR/Metadata.h
lib/IR/LLVMContextImpl.cpp
lib/IR/Metadata.cpp

index 1f327f6bdb3f462e05892b299bd3e07fe02f3fa2..cc193df432341684642e43fa6653afdf29ccd972 100644 (file)
@@ -722,7 +722,7 @@ protected:
   /// resolveCycles() is called).
   UniquableMDNode(LLVMContext &C, unsigned ID, ArrayRef<Metadata *> Vals,
                   bool AllowRAUW);
-  ~UniquableMDNode();
+  ~UniquableMDNode() {}
 
   void storeDistinctInContext();
 
@@ -767,7 +767,7 @@ class MDTuple : public UniquableMDNode {
 
   MDTuple(LLVMContext &C, ArrayRef<Metadata *> Vals, bool AllowRAUW)
       : UniquableMDNode(C, MDTupleKind, Vals, AllowRAUW) {}
-  ~MDTuple();
+  ~MDTuple() { dropAllReferences(); }
 
   void setHash(unsigned Hash) { MDNodeSubclassData = Hash; }
   void recalculateHash();
index a9268b46488525174ad3c117e52c8c24ac10c9a7..c78b76021daef9b869762264dfea97bc5414efa8 100644 (file)
@@ -135,18 +135,16 @@ LLVMContextImpl::~LLVMContextImpl() {
   for (auto &Pair : ValuesAsMetadata)
     delete Pair.second;
 
-  // Destroy MDNodes.  ~MDNode can move and remove nodes between the MDTuples
-  // and the DistinctMDNodes sets, so copy the values out first.
-  SmallVector<UniquableMDNode *, 8> Uniquables;
-  Uniquables.reserve(MDTuples.size() + DistinctMDNodes.size());
-  Uniquables.append(MDTuples.begin(), MDTuples.end());
-  Uniquables.append(DistinctMDNodes.begin(), DistinctMDNodes.end());
-  for (UniquableMDNode *I : Uniquables)
+  // Destroy MDNodes.
+  for (auto *I : DistinctMDNodes)
     I->dropAllReferences();
-  for (UniquableMDNode *I : Uniquables)
+  for (auto *I : MDTuples)
+    I->dropAllReferences();
+
+  for (UniquableMDNode *I : DistinctMDNodes)
     delete cast<MDTuple>(I);
-  assert(MDTuples.empty() && DistinctMDNodes.empty() &&
-         "Destroying all MDNodes didn't empty the Context's sets.");
+  for (MDTuple *I : MDTuples)
+    delete I;
 
   // Destroy MDStrings.
   MDStringCache.clear();
index 9088a75156ed4eaa635ce77d188cf732fcc7cffa..fa1f302568f4012dd04b0781b50f1cfd69d1f83d 100644 (file)
@@ -427,13 +427,6 @@ UniquableMDNode::UniquableMDNode(LLVMContext &C, unsigned ID,
   SubclassData32 = NumUnresolved;
 }
 
-UniquableMDNode::~UniquableMDNode() {
-  if (isStoredDistinctInContext())
-    getContext().pImpl->DistinctMDNodes.erase(this);
-
-  dropAllReferences();
-}
-
 void UniquableMDNode::resolve() {
   assert(!isResolved() && "Expected this to be unresolved");
 
@@ -481,11 +474,6 @@ void UniquableMDNode::resolveCycles() {
   }
 }
 
-MDTuple::~MDTuple() {
-  if (!isStoredDistinctInContext())
-    getContext().pImpl->MDTuples.erase(this);
-}
-
 void MDTuple::recalculateHash() {
   setHash(hash_combine_range(op_begin(), op_end()));
 #ifndef NDEBUG