diff options
| author | Devang Patel <dpatel@apple.com> | 2009-08-11 06:31:57 +0000 |
|---|---|---|
| committer | Devang Patel <dpatel@apple.com> | 2009-08-11 06:31:57 +0000 |
| commit | 16f4033a9131c3a7dc8ba4267c4c2fcd636b7e54 (patch) | |
| tree | cfbc47e0f4462daf0716deab7ac4b906dcd905a9 | |
| parent | 0a3d49dc94760c871d053298f1033414cbf81893 (diff) | |
| download | external_llvm-16f4033a9131c3a7dc8ba4267c4c2fcd636b7e54.zip external_llvm-16f4033a9131c3a7dc8ba4267c4c2fcd636b7e54.tar.gz external_llvm-16f4033a9131c3a7dc8ba4267c4c2fcd636b7e54.tar.bz2 | |
Remove dead metadata.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@78651 91177308-0d34-0410-b5e6-96231b3b80d8
| -rw-r--r-- | include/llvm/LLVMContext.h | 2 | ||||
| -rw-r--r-- | lib/Transforms/IPO/GlobalDCE.cpp | 3 | ||||
| -rw-r--r-- | lib/VMCore/ConstantsContext.h | 1 | ||||
| -rw-r--r-- | lib/VMCore/LLVMContext.cpp | 25 | ||||
| -rw-r--r-- | lib/VMCore/LLVMContextImpl.h | 5 |
5 files changed, 34 insertions, 2 deletions
diff --git a/include/llvm/LLVMContext.h b/include/llvm/LLVMContext.h index f5916c4..d74fa11 100644 --- a/include/llvm/LLVMContext.h +++ b/include/llvm/LLVMContext.h @@ -30,7 +30,7 @@ struct LLVMContextImpl; /// to have one context per thread. struct LLVMContext { LLVMContextImpl* pImpl; - + bool RemoveDeadMetadata(); LLVMContext(); ~LLVMContext(); }; diff --git a/lib/Transforms/IPO/GlobalDCE.cpp b/lib/Transforms/IPO/GlobalDCE.cpp index 8e57768..09f9e7c 100644 --- a/lib/Transforms/IPO/GlobalDCE.cpp +++ b/lib/Transforms/IPO/GlobalDCE.cpp @@ -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; } diff --git a/lib/VMCore/ConstantsContext.h b/lib/VMCore/ConstantsContext.h index 2868f87..f1d4b25 100644 --- a/lib/VMCore/ConstantsContext.h +++ b/lib/VMCore/ConstantsContext.h @@ -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. diff --git a/lib/VMCore/LLVMContext.cpp b/lib/VMCore/LLVMContext.cpp index 2288271..3ca1b0a 100644 --- a/lib/VMCore/LLVMContext.cpp +++ b/lib/VMCore/LLVMContext.cpp @@ -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; +} diff --git a/lib/VMCore/LLVMContextImpl.h b/lib/VMCore/LLVMContextImpl.h index 3d1f3b2..245aa4a 100644 --- a/lib/VMCore/LLVMContextImpl.h +++ b/lib/VMCore/LLVMContextImpl.h @@ -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; |
