Skip to content

Commit 73aff74

Browse files
committed
IRGen: Type lowering cache doesn't need to store 'forward declarations'
1 parent b78ad96 commit 73aff74

File tree

4 files changed

+25
-39
lines changed

4 files changed

+25
-39
lines changed

lib/IRGen/GenEnum.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6099,8 +6099,8 @@ const TypeInfo *TypeConverter::convertEnumType(TypeBase *key, CanType type,
60996099
else
61006100
storageType = IGM.createNominalType(type);
61016101

6102-
// Create a forward declaration for that type.
6103-
addForwardDecl(key, storageType);
6102+
// Create a forward declaration.
6103+
addForwardDecl(key);
61046104

61056105
SILType loweredTy = SILType::getPrimitiveAddressType(type);
61066106

lib/IRGen/GenStruct.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -860,7 +860,7 @@ const TypeInfo *TypeConverter::convertStructType(TypeBase *key, CanType type,
860860
auto ty = IGM.createNominalType(type);
861861

862862
// Register a forward declaration before we look at any of the child types.
863-
addForwardDecl(key, ty);
863+
addForwardDecl(key);
864864

865865
// Use different rules for types imported from C.
866866
if (D->hasClangNode()) {

lib/IRGen/GenType.cpp

Lines changed: 14 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ Alignment IRGenModule::getCappedAlignment(Alignment align) {
5555
return std::min(align, Alignment(MaximumAlignment));
5656
}
5757

58-
llvm::DenseMap<TypeBase*, TypeCacheEntry> &
58+
llvm::DenseMap<TypeBase *, const TypeInfo *> &
5959
TypeConverter::Types_t::getCacheFor(bool isDependent, bool completelyFragile) {
6060
if (completelyFragile) {
6161
return (isDependent
@@ -1128,12 +1128,13 @@ GenericEnvironment *IRGenModule::getGenericEnvironment() {
11281128

11291129
/// Add a temporary forward declaration for a type. This will live
11301130
/// only until a proper mapping is added.
1131-
void TypeConverter::addForwardDecl(TypeBase *key, llvm::Type *type) {
1131+
void TypeConverter::addForwardDecl(TypeBase *key) {
11321132
assert(key->isCanonical());
11331133
assert(!key->hasTypeParameter());
11341134
auto &Cache = Types.getCacheFor(/*isDependent*/ false, CompletelyFragile);
1135-
assert(!Cache.count(key) && "entry already exists for type!");
1136-
Cache.insert(std::make_pair(key, type));
1135+
auto result = Cache.insert(std::make_pair(key, nullptr));
1136+
assert(result.second && "entry already exists for type!");
1137+
(void) result;
11371138
}
11381139

11391140
const TypeInfo &IRGenModule::getWitnessTablePtrTypeInfo() {
@@ -1322,17 +1323,9 @@ llvm::Type *IRGenModule::getStorageType(SILType T) {
13221323
return getStorageTypeForLowered(T.getASTType());
13231324
}
13241325

1325-
/// Get the storage type for the given type. Note that, unlike
1326-
/// fetching the type info and asking it for the storage type, this
1327-
/// operation will succeed for forward-declarations.
1326+
/// Get the storage type for the given type.
13281327
llvm::Type *IRGenModule::getStorageTypeForLowered(CanType T) {
1329-
// TODO: we can avoid creating entries for some obvious cases here.
1330-
auto entry = Types.getTypeEntry(T);
1331-
if (auto ti = entry.dyn_cast<const TypeInfo*>()) {
1332-
return ti->getStorageType();
1333-
} else {
1334-
return entry.get<llvm::Type*>();
1335-
}
1328+
return Types.getTypeEntry(T)->getStorageType();
13361329
}
13371330

13381331
/// Get the type information for the given type, which may not have
@@ -1370,9 +1363,7 @@ const TypeInfo &IRGenModule::getTypeInfoForLowered(CanType T) {
13701363

13711364
///
13721365
const TypeInfo &TypeConverter::getCompleteTypeInfo(CanType T) {
1373-
auto entry = getTypeEntry(T);
1374-
assert(entry.is<const TypeInfo*>() && "getting TypeInfo recursively!");
1375-
return *entry.get<const TypeInfo*>();
1366+
return *getTypeEntry(T);
13761367
}
13771368

13781369
ArchetypeType *TypeConverter::getExemplarArchetype(ArchetypeType *t) {
@@ -1428,7 +1419,7 @@ void TypeConverter::popCompletelyFragile() {
14281419
CompletelyFragile = false;
14291420
}
14301421

1431-
TypeCacheEntry TypeConverter::getTypeEntry(CanType canonicalTy) {
1422+
const TypeInfo *TypeConverter::getTypeEntry(CanType canonicalTy) {
14321423
// Cache this entry in the dependent or independent cache appropriate to it.
14331424
auto &Cache = Types.getCacheFor(canonicalTy->hasTypeParameter(),
14341425
CompletelyFragile);
@@ -1471,10 +1462,8 @@ TypeCacheEntry TypeConverter::getTypeEntry(CanType canonicalTy) {
14711462

14721463
// Cache the entry under the original type and the exemplar type, so that
14731464
// we can avoid relowering equivalent types.
1474-
auto insertEntry = [&](TypeCacheEntry &entry) {
1475-
assert(entry == TypeCacheEntry() ||
1476-
(entry.is<llvm::Type*>() &&
1477-
entry.get<llvm::Type*>() == convertedTI->getStorageType()));
1465+
auto insertEntry = [&](const TypeInfo *&entry) {
1466+
assert(entry == nullptr);
14781467
entry = convertedTI;
14791468
};
14801469
insertEntry(Cache[canonicalTy.getPointer()]);
@@ -1711,10 +1700,10 @@ TypeConverter::convert##Name##StorageType(Name##StorageType *refType) { \
17111700
}
17121701
#include "swift/AST/ReferenceStorage.def"
17131702

1714-
static void overwriteForwardDecl(llvm::DenseMap<TypeBase*, TypeCacheEntry> &cache,
1703+
static void overwriteForwardDecl(llvm::DenseMap<TypeBase *, const TypeInfo *> &cache,
17151704
TypeBase *key, const TypeInfo *result) {
17161705
assert(cache.count(key) && "no forward declaration?");
1717-
assert(cache[key].is<llvm::Type*>() && "overwriting real entry!");
1706+
assert(cache[key] == nullptr && "overwriting real entry!");
17181707
cache[key] = result;
17191708
}
17201709

@@ -1863,7 +1852,7 @@ const TypeInfo *TypeConverter::convertAnyNominalType(CanType type,
18631852
auto &Cache = Types.getCacheFor(/*isDependent*/ false, CompletelyFragile);
18641853
auto entry = Cache.find(key);
18651854
if (entry != Cache.end())
1866-
return entry->second.get<const TypeInfo *>();
1855+
return entry->second;
18671856

18681857
switch (decl->getKind()) {
18691858
#define NOMINAL_TYPE_DECL(ID, PARENT)

lib/IRGen/GenType.h

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,6 @@ namespace irgen {
5757
class LoadableTypeInfo;
5858
class TypeInfo;
5959

60-
/// Either a type or a forward-declaration.
61-
using TypeCacheEntry = llvm::PointerUnion<const TypeInfo *, llvm::Type *>;
62-
6360
/// The helper class for generating types.
6461
class TypeConverter {
6562
public:
@@ -100,7 +97,7 @@ class TypeConverter {
10097
const FixedTypeInfo *createImmovable(llvm::Type *T,
10198
Size size, Alignment align);
10299

103-
void addForwardDecl(TypeBase *key, llvm::Type *type);
100+
void addForwardDecl(TypeBase *key);
104101

105102
const TypeInfo *convertType(CanType T);
106103
const TypeInfo *convertAnyNominalType(CanType T, NominalTypeDecl *D);
@@ -134,7 +131,7 @@ class TypeConverter {
134131
return CompletelyFragile;
135132
}
136133

137-
TypeCacheEntry getTypeEntry(CanType type);
134+
const TypeInfo *getTypeEntry(CanType type);
138135
const TypeInfo &getCompleteTypeInfo(CanType type);
139136
const LoadableTypeInfo &getNativeObjectTypeInfo();
140137
const LoadableTypeInfo &getUnknownObjectTypeInfo();
@@ -184,14 +181,14 @@ class TypeConverter {
184181
CanType getExemplarType(CanType t);
185182

186183
class Types_t {
187-
llvm::DenseMap<TypeBase*, TypeCacheEntry> IndependentCache;
188-
llvm::DenseMap<TypeBase*, TypeCacheEntry> DependentCache;
189-
llvm::DenseMap<TypeBase*, TypeCacheEntry> FragileIndependentCache;
190-
llvm::DenseMap<TypeBase*, TypeCacheEntry> FragileDependentCache;
184+
llvm::DenseMap<TypeBase *, const TypeInfo *> IndependentCache;
185+
llvm::DenseMap<TypeBase *, const TypeInfo *> DependentCache;
186+
llvm::DenseMap<TypeBase *, const TypeInfo *> FragileIndependentCache;
187+
llvm::DenseMap<TypeBase *, const TypeInfo *> FragileDependentCache;
191188

192189
public:
193-
llvm::DenseMap<TypeBase*, TypeCacheEntry> &getCacheFor(bool isDependent,
194-
bool completelyFragile);
190+
llvm::DenseMap<TypeBase *, const TypeInfo *> &getCacheFor(bool isDependent,
191+
bool completelyFragile);
195192
};
196193
Types_t Types;
197194
};

0 commit comments

Comments
 (0)