Keep a cache of non-abstract null arrays and structs. This speeds up llvm-dis
authorChris Lattner <sabre@nondot.org>
Sun, 15 Feb 2004 02:46:46 +0000 (02:46 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 15 Feb 2004 02:46:46 +0000 (02:46 +0000)
from 16.57 -> 13.46s on 129.compress.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11462 91177308-0d34-0410-b5e6-96231b3b80d8

lib/VMCore/Constants.cpp

index 2500ec46e80d9fe10f4286ba4c5323b102ac6427..f86fcc1a23be6cc0f916bc548c3f9aae3e45b142 100644 (file)
@@ -64,6 +64,8 @@ void Constant::destroyConstantImpl() {
   delete this;
 }
 
+static std::map<const Type *, Constant*> NullValues;
+
 // Static constructor to create a '0' constant of arbitrary type...
 Constant *Constant::getNullValue(const Type *Ty) {
   switch (Ty->getPrimitiveID()) {
@@ -117,18 +119,33 @@ Constant *Constant::getNullValue(const Type *Ty) {
     return ConstantPointerNull::get(cast<PointerType>(Ty));
 
   case Type::StructTyID: {
+    if (!Ty->isAbstract())
+      if (Constant *V = NullValues[Ty])
+        return V;
+
     const StructType *ST = cast<StructType>(Ty);
     std::vector<Constant*> Elements;
     Elements.resize(ST->getNumElements());
     for (unsigned i = 0, e = ST->getNumElements(); i != e; ++i)
       Elements[i] = Constant::getNullValue(ST->getElementType(i));
-    return ConstantStruct::get(ST, Elements);
+    Constant *Ret = ConstantStruct::get(ST, Elements);
+    if (!Ty->isAbstract())
+      NullValues[Ty] = Ret;
+    return Ret;
   }
   case Type::ArrayTyID: {
+    if (!Ty->isAbstract())
+      if (Constant *V = NullValues[Ty])
+        return V;
+
     const ArrayType *AT = cast<ArrayType>(Ty);
     Constant *El = Constant::getNullValue(AT->getElementType());
     unsigned NumElements = AT->getNumElements();
-    return ConstantArray::get(AT, std::vector<Constant*>(NumElements, El));
+    Constant *Ret = ConstantArray::get(AT,
+                                       std::vector<Constant*>(NumElements, El));
+    if (!Ty->isAbstract())
+      NullValues[Ty] = Ret;
+    return Ret;
   }
   default:
     // Function, Type, Label, or Opaque type?