mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-14 17:34:41 +00:00
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
This commit is contained in:
parent
07b976bb9e
commit
aab54da21c
@ -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?
|
||||
|
Loading…
x
Reference in New Issue
Block a user