Remove dead metadata.

llvm-svn: 78651
This commit is contained in:
Devang Patel 2009-08-11 06:31:57 +00:00
parent 40c33bb2b2
commit 4609ecd4bd
5 changed files with 34 additions and 2 deletions

View File

@ -30,7 +30,7 @@ struct LLVMContextImpl;
/// to have one context per thread.
struct LLVMContext {
LLVMContextImpl* pImpl;
bool RemoveDeadMetadata();
LLVMContext();
~LLVMContext();
};

View 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;
}

View 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.

View 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;
}

View 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;