Replace a use of ConstantUniqueMap for CAZ constants with a simple DenseMap.
authorChris Lattner <sabre@nondot.org>
Mon, 23 Jan 2012 08:42:38 +0000 (08:42 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 23 Jan 2012 08:42:38 +0000 (08:42 +0000)
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

lib/VMCore/Constants.cpp
lib/VMCore/ConstantsContext.h
lib/VMCore/LLVMContextImpl.cpp
lib/VMCore/LLVMContextImpl.h

index 9657cd28c1fafb874a863b8a8ef0bc24af269d62..d04298f14967de9103eda8f499e62820aad6248d 100644 (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();
 }
 
index 4ee4296d448915273ff0b528ee40b09b3b0b6e23..fec2be58cfce9f619f85d1bbf070caa513e7b541 100644 (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;
index b0dd680926d75517d80802ad63e0c3949559e299..7ab3ccec62f312d0038a7feadb4c635abae8f2f1 100644 (file)
@@ -70,7 +70,7 @@ LLVMContextImpl::~LLVMContextImpl() {
   ArrayConstants.freeConstants();
   StructConstants.freeConstants();
   VectorConstants.freeConstants();
-  AggZeroConstants.freeConstants();
+  CAZConstants.clear();
   NullPtrConstants.freeConstants();
   UndefValueConstants.freeConstants();
   InlineAsms.freeConstants();
index 30f9d4698789ec926ddacf9c8e306b41b7aa7c7d..f963f639211f70523ad865e30ec7f1a251551f82 100644 (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;