Replace a use of ConstantUniqueMap for CAZ constants with a simple DenseMap.

Now that the type system rewrite has landed, there is no need for its
complexity and std::map'ness.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@148691 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2012-01-23 08:42:38 +00:00
parent cef3925698
commit 2a82d82936
4 changed files with 23 additions and 21 deletions

View File

@ -993,18 +993,33 @@ bool ConstantFP::isValueValidForType(Type *Ty, const APFloat& Val) {
//===----------------------------------------------------------------------===//
// Factory Function Implementation
ConstantAggregateZero* ConstantAggregateZero::get(Type* Ty) {
ConstantAggregateZero *ConstantAggregateZero::get(Type *Ty) {
assert((Ty->isStructTy() || Ty->isArrayTy() || Ty->isVectorTy()) &&
"Cannot create an aggregate zero of non-aggregate type!");
LLVMContextImpl *pImpl = Ty->getContext().pImpl;
return pImpl->AggZeroConstants.getOrCreate(Ty, 0);
OwningPtr<ConstantAggregateZero> &Entry =
Ty->getContext().pImpl->CAZConstants[Ty];
if (Entry == 0)
Entry.reset(new ConstantAggregateZero(Ty));
return Entry.get();
}
/// destroyConstant - Remove the constant from the constant table...
///
void ConstantAggregateZero::destroyConstant() {
getType()->getContext().pImpl->AggZeroConstants.remove(this);
// Drop ownership of the CAZ object before removing the entry so that it
// doesn't get double deleted.
LLVMContextImpl::CAZMapTy &CAZConstants = getContext().pImpl->CAZConstants;
LLVMContextImpl::CAZMapTy::iterator I = CAZConstants.find(getType());
assert(I != CAZConstants.end() && "CAZ object not in uniquing map");
I->second.take();
// Actually remove the entry from the DenseMap now, which won't free the
// constant.
CAZConstants.erase(I);
// Free the constant and any dangling references to it.
destroyConstantImpl();
}

View File

@ -477,13 +477,6 @@ struct ConstantKeyData<ConstantExpr> {
}
};
// ConstantAggregateZero does not take extra "value" argument...
template<class ValType>
struct ConstantCreator<ConstantAggregateZero, Type, ValType> {
static ConstantAggregateZero *create(Type *Ty, const ValType &V){
return new ConstantAggregateZero(Ty);
}
};
template<>
struct ConstantKeyData<ConstantVector> {
@ -497,14 +490,6 @@ struct ConstantKeyData<ConstantVector> {
}
};
template<>
struct ConstantKeyData<ConstantAggregateZero> {
typedef char ValType;
static ValType getValType(ConstantAggregateZero *C) {
return 0;
}
};
template<>
struct ConstantKeyData<ConstantArray> {
typedef std::vector<Constant*> ValType;

View File

@ -70,7 +70,7 @@ LLVMContextImpl::~LLVMContextImpl() {
ArrayConstants.freeConstants();
StructConstants.freeConstants();
VectorConstants.freeConstants();
AggZeroConstants.freeConstants();
CAZConstants.clear();
NullPtrConstants.freeConstants();
UndefValueConstants.freeConstants();
InlineAsms.freeConstants();

View File

@ -27,6 +27,7 @@
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/FoldingSet.h"
#include "llvm/ADT/OwningPtr.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/StringMap.h"
#include <vector>
@ -138,7 +139,8 @@ public:
// on Context destruction.
SmallPtrSet<MDNode*, 1> NonUniquedMDNodes;
ConstantUniqueMap<char, char, Type, ConstantAggregateZero> AggZeroConstants;
typedef DenseMap<Type*, OwningPtr<ConstantAggregateZero> > CAZMapTy;
CAZMapTy CAZConstants;
typedef ConstantUniqueMap<std::vector<Constant*>, ArrayRef<Constant*>,
ArrayType, ConstantArray, true /*largekey*/> ArrayConstantsTy;