Remove dead metadata.
authorDevang Patel <dpatel@apple.com>
Tue, 11 Aug 2009 06:31:57 +0000 (06:31 +0000)
committerDevang Patel <dpatel@apple.com>
Tue, 11 Aug 2009 06:31:57 +0000 (06:31 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@78651 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/LLVMContext.h
lib/Transforms/IPO/GlobalDCE.cpp
lib/VMCore/ConstantsContext.h
lib/VMCore/LLVMContext.cpp
lib/VMCore/LLVMContextImpl.h

index f5916c47a0a4e4c3064dc742773acac983b59d08..d74fa11f3fefd1c85a9b0fda07a944006bd7b4e5 100644 (file)
@@ -30,7 +30,7 @@ struct LLVMContextImpl;
 /// to have one context per thread.
 struct LLVMContext {
   LLVMContextImpl* pImpl;
-  
+  bool RemoveDeadMetadata();
   LLVMContext();
   ~LLVMContext();
 };
index 8e57768570ae50d0ed7e2fd5c01a329ba7e9bbf0..09f9e7c4f68a6e55ea516bf7ca0be5a1c85cd782 100644 (file)
@@ -148,6 +148,9 @@ bool GlobalDCE::runOnModule(Module &M) {
 
   // Make sure that all memory is released
   AliveGlobals.clear();
+
+  // Remove dead metadata.
+  Changed |= M.getContext().RemoveDeadMetadata();
   return Changed;
 }
 
index 2868f87fa4aaaac2af4969c65c3c836997df5e1a..f1d4b25e1bcdd4b90bea741533b40bc88fb61500 100644 (file)
@@ -572,6 +572,7 @@ private:
 public:
   // NOTE: This function is not locked.  It is the caller's responsibility
   // to enforce proper synchronization.
+  typename MapTy::iterator map_begin() { return Map.begin(); }
   typename MapTy::iterator map_end() { return Map.end(); }
     
   /// InsertOrGetItem - Return an iterator for the specified element.
index 22882711a06dcea21e11a77bbd09cdff4729a8ad..3ca1b0afca443c8e1563d4efafd8058ea8c10fdc 100644 (file)
@@ -20,6 +20,7 @@
 #include "llvm/Support/ManagedStatic.h"
 #include "LLVMContextImpl.h"
 #include <cstdarg>
+#include <set>
 
 using namespace llvm;
 
@@ -44,3 +45,27 @@ GetElementPtrConstantExpr::GetElementPtrConstantExpr
   for (unsigned i = 0, E = IdxList.size(); i != E; ++i)
     OperandList[i+1] = IdxList[i];
 }
+
+bool LLVMContext::RemoveDeadMetadata() {
+  std::vector<const MDNode *> DeadMDNodes;
+  bool Changed = false;
+  while (1) {
+
+    for (LLVMContextImpl::MDNodeMapTy::MapTy::iterator
+           I = pImpl->MDNodes.map_begin(),
+           E = pImpl->MDNodes.map_end(); I != E; ++I) {
+      const MDNode *N = cast<MDNode>(I->second);
+      if (N->use_empty()) 
+        DeadMDNodes.push_back(N);
+    }
+    
+    if (DeadMDNodes.empty())
+      return Changed;
+
+    while (!DeadMDNodes.empty()) {
+      const MDNode *N = DeadMDNodes.back(); DeadMDNodes.pop_back();
+      delete N;
+    }
+  }
+  return Changed;
+}
index 3d1f3b26a5c10ea2ee24af901314689e95e4eede..245aa4a7043cb7f0d723016ec0d011aa8a86344e 100644 (file)
@@ -105,7 +105,10 @@ struct LLVMContextImpl {
   
   ValueMap<char, Type, ConstantAggregateZero> AggZeroConstants;
 
-  ValueMap<std::vector<Value*>, Type, MDNode, true /*largekey*/> MDNodes;
+  typedef ValueMap<std::vector<Value*>, Type, MDNode, true /*largekey*/> 
+  MDNodeMapTy;
+
+  MDNodeMapTy MDNodes;
   
   typedef ValueMap<std::vector<Constant*>, ArrayType, 
     ConstantArray, true /*largekey*/> ArrayConstantsTy;