Skip to content

Commit 6dc9ef8

Browse files
committed
AST: GenericSignatures don't contain type variables
1 parent ce660f5 commit 6dc9ef8

File tree

3 files changed

+25
-73
lines changed

3 files changed

+25
-73
lines changed

include/swift/AST/GenericSignature.h

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -140,9 +140,6 @@ class GenericSignature {
140140

141141
explicit operator bool() const { return Ptr != 0; }
142142

143-
/// Whether the given set of requirements involves a type variable.
144-
static bool hasTypeVariable(ArrayRef<Requirement> requirements);
145-
146143
friend llvm::hash_code hash_value(GenericSignature sig) {
147144
using llvm::hash_value;
148145
return hash_value(sig.getPointer());
@@ -199,9 +196,6 @@ class GenericSignature {
199196
/// Retrieve the requirements.
200197
ArrayRef<Requirement> getRequirements() const;
201198

202-
/// Whether this generic signature involves a type variable.
203-
bool hasTypeVariable() const;
204-
205199
/// Returns the generic environment that provides fresh contextual types
206200
/// (archetypes) that correspond to the interface types in this generic
207201
/// signature.

lib/AST/ASTContext.cpp

Lines changed: 25 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -414,17 +414,6 @@ struct ASTContext::Implementation {
414414
llvm::FoldingSet<LayoutConstraintInfo> LayoutConstraints;
415415
llvm::FoldingSet<OpaqueTypeArchetypeType> OpaqueArchetypes;
416416

417-
llvm::FoldingSet<GenericSignatureImpl> GenericSignatures;
418-
419-
/// Stored generic signature builders for canonical generic signatures.
420-
llvm::DenseMap<GenericSignature, std::unique_ptr<GenericSignatureBuilder>>
421-
GenericSignatureBuilders;
422-
423-
/// Stored requirement machines for canonical generic signatures.
424-
llvm::DenseMap<GenericSignature,
425-
std::unique_ptr<rewriting::RequirementMachine>>
426-
RequirementMachines;
427-
428417
/// The set of function types.
429418
llvm::FoldingSet<FunctionType> FunctionTypes;
430419

@@ -485,6 +474,12 @@ struct ASTContext::Implementation {
485474
llvm::FoldingSet<AutoDiffDerivativeFunctionIdentifier>
486475
AutoDiffDerivativeFunctionIdentifiers;
487476

477+
llvm::FoldingSet<GenericSignatureImpl> GenericSignatures;
478+
479+
/// Stored generic signature builders for canonical generic signatures.
480+
llvm::DenseMap<GenericSignature, std::unique_ptr<GenericSignatureBuilder>>
481+
GenericSignatureBuilders;
482+
488483
/// A cache of information about whether particular nominal types
489484
/// are representable in a foreign language.
490485
llvm::DenseMap<NominalTypeDecl *, ForeignRepresentationInfo>
@@ -542,6 +537,14 @@ struct ASTContext::Implementation {
542537

543538
/// Memory allocation arena for the term rewriting system.
544539
std::unique_ptr<rewriting::RewriteContext> TheRewriteContext;
540+
541+
/// Stored requirement machines for canonical generic signatures.
542+
///
543+
/// This should come after TheRewriteContext above, since various destructors
544+
/// compile stats in the histograms stored in our RewriteContext.
545+
llvm::DenseMap<GenericSignature,
546+
std::unique_ptr<rewriting::RequirementMachine>>
547+
RequirementMachines;
545548
};
546549

547550
ASTContext::Implementation::Implementation()
@@ -1839,28 +1842,14 @@ void ASTContext::addLoadedModule(ModuleDecl *M) {
18391842
getImpl().LoadedModules[M->getName()] = M;
18401843
}
18411844

1842-
static AllocationArena getArena(GenericSignature genericSig) {
1843-
if (!genericSig)
1844-
return AllocationArena::Permanent;
1845-
1846-
if (genericSig.hasTypeVariable()) {
1847-
assert(false && "Unsubstituted type variable leaked into generic signature");
1848-
return AllocationArena::ConstraintSolver;
1849-
}
1850-
1851-
return AllocationArena::Permanent;
1852-
}
1853-
18541845
void ASTContext::registerGenericSignatureBuilder(
18551846
GenericSignature sig,
18561847
GenericSignatureBuilder &&builder) {
18571848
if (LangOpts.EnableRequirementMachine == RequirementMachineMode::Enabled)
18581849
return;
18591850

18601851
auto canSig = sig.getCanonicalSignature();
1861-
auto arena = getArena(sig);
1862-
auto &genericSignatureBuilders =
1863-
getImpl().getArena(arena).GenericSignatureBuilders;
1852+
auto &genericSignatureBuilders = getImpl().GenericSignatureBuilders;
18641853
auto known = genericSignatureBuilders.find(canSig);
18651854
if (known != genericSignatureBuilders.end()) {
18661855
++NumRegisteredGenericSignatureBuildersAlready;
@@ -1882,9 +1871,7 @@ GenericSignatureBuilder *ASTContext::getOrCreateGenericSignatureBuilder(
18821871

18831872
// Check whether we already have a generic signature builder for this
18841873
// signature and module.
1885-
auto arena = getArena(sig);
1886-
auto &genericSignatureBuilders =
1887-
getImpl().getArena(arena).GenericSignatureBuilders;
1874+
auto &genericSignatureBuilders = getImpl().GenericSignatureBuilders;
18881875
auto known = genericSignatureBuilders.find(sig);
18891876
if (known != genericSignatureBuilders.end())
18901877
return known->second.get();
@@ -1962,16 +1949,13 @@ GenericSignatureBuilder *ASTContext::getOrCreateGenericSignatureBuilder(
19621949

19631950
rewriting::RequirementMachine *
19641951
ASTContext::getOrCreateRequirementMachine(CanGenericSignature sig) {
1965-
assert(!sig.hasTypeVariable());
1966-
19671952
auto &rewriteCtx = getImpl().TheRewriteContext;
19681953
if (!rewriteCtx)
19691954
rewriteCtx.reset(new rewriting::RewriteContext(*this));
19701955

19711956
// Check whether we already have a requirement machine for this
19721957
// signature.
1973-
auto arena = getArena(sig);
1974-
auto &machines = getImpl().getArena(arena).RequirementMachines;
1958+
auto &machines = getImpl().RequirementMachines;
19751959

19761960
auto &machinePtr = machines[sig];
19771961
if (machinePtr) {
@@ -2003,8 +1987,7 @@ bool ASTContext::isRecursivelyConstructingRequirementMachine(
20031987
if (!rewriteCtx)
20041988
return false;
20051989

2006-
auto arena = getArena(sig);
2007-
auto &machines = getImpl().getArena(arena).RequirementMachines;
1990+
auto &machines = getImpl().RequirementMachines;
20081991

20091992
auto found = machines.find(sig);
20101993
if (found == machines.end())
@@ -4489,21 +4472,21 @@ GenericSignature::get(TypeArrayView<GenericTypeParamType> params,
44894472
assert(!params.empty());
44904473

44914474
#ifndef NDEBUG
4492-
for (auto req : requirements)
4475+
for (auto req : requirements) {
44934476
assert(req.getFirstType()->isTypeParameter());
4477+
assert(!req.getFirstType()->hasTypeVariable());
4478+
assert(req.getKind() == RequirementKind::Layout ||
4479+
!req.getSecondType()->hasTypeVariable());
4480+
}
44944481
#endif
44954482

44964483
// Check for an existing generic signature.
44974484
llvm::FoldingSetNodeID ID;
44984485
GenericSignatureImpl::Profile(ID, params, requirements);
44994486

4500-
auto arena = GenericSignature::hasTypeVariable(requirements)
4501-
? AllocationArena::ConstraintSolver
4502-
: AllocationArena::Permanent;
4503-
45044487
auto &ctx = getASTContext(params, requirements);
45054488
void *insertPos;
4506-
auto &sigs = ctx.getImpl().getArena(arena).GenericSignatures;
4489+
auto &sigs = ctx.getImpl().GenericSignatures;
45074490
if (auto *sig = sigs.FindNodeOrInsertPos(ID, insertPos)) {
45084491
if (isKnownCanonical)
45094492
sig->CanonicalSignatureOrASTContext = &ctx;
@@ -4518,7 +4501,7 @@ GenericSignature::get(TypeArrayView<GenericTypeParamType> params,
45184501
void *mem = ctx.Allocate(bytes, alignof(GenericSignatureImpl));
45194502
auto *newSig =
45204503
new (mem) GenericSignatureImpl(params, requirements, isKnownCanonical);
4521-
ctx.getImpl().getArena(arena).GenericSignatures.InsertNode(newSig, insertPos);
4504+
ctx.getImpl().GenericSignatures.InsertNode(newSig, insertPos);
45224505
return newSig;
45234506
}
45244507

lib/AST/GenericSignature.cpp

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1301,31 +1301,6 @@ unsigned GenericSignatureImpl::getGenericParamOrdinal(
13011301
return GenericParamKey(param).findIndexIn(getGenericParams());
13021302
}
13031303

1304-
bool GenericSignature::hasTypeVariable() const {
1305-
return GenericSignature::hasTypeVariable(getRequirements());
1306-
}
1307-
1308-
bool GenericSignature::hasTypeVariable(ArrayRef<Requirement> requirements) {
1309-
for (const auto &req : requirements) {
1310-
if (req.getFirstType()->hasTypeVariable())
1311-
return true;
1312-
1313-
switch (req.getKind()) {
1314-
case RequirementKind::Layout:
1315-
break;
1316-
1317-
case RequirementKind::Conformance:
1318-
case RequirementKind::SameType:
1319-
case RequirementKind::Superclass:
1320-
if (req.getSecondType()->hasTypeVariable())
1321-
return true;
1322-
break;
1323-
}
1324-
}
1325-
1326-
return false;
1327-
}
1328-
13291304
void GenericSignature::Profile(llvm::FoldingSetNodeID &id) const {
13301305
return GenericSignature::Profile(id, getPointer()->getGenericParams(),
13311306
getPointer()->getRequirements());

0 commit comments

Comments
 (0)