diff options
author | Chris Lattner <sabre@nondot.org> | 2004-02-15 02:46:46 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2004-02-15 02:46:46 +0000 |
commit | aab54da21c8c9d38430d8681c63b633b7e7bf71c (patch) | |
tree | 5e275c82b0878b4d7d7c5bc85df81b1308c9d1a5 | |
parent | 07b976bb9e32ba2f08ae050fe3ce22014f687aa0 (diff) |
Keep a cache of non-abstract null arrays and structs. This speeds up llvm-dis
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
-rw-r--r-- | lib/VMCore/Constants.cpp | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/lib/VMCore/Constants.cpp b/lib/VMCore/Constants.cpp index 2500ec46e8..f86fcc1a23 100644 --- a/lib/VMCore/Constants.cpp +++ b/lib/VMCore/Constants.cpp @@ -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? |