Skip to content

Commit 09446de

Browse files
committed
Eliminate yet more SubstitutionLists from SIL in search of a steady-state
1 parent 38a189f commit 09446de

File tree

16 files changed

+72
-95
lines changed

16 files changed

+72
-95
lines changed

include/swift/SIL/SILInstruction.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1788,7 +1788,9 @@ class ApplyInstBase<Impl, Base, false> : public Base {
17881788
}
17891789

17901790
/// True if this application has generic substitutions.
1791-
bool hasSubstitutions() const { return !Substitutions.empty(); }
1791+
bool hasSubstitutions() const {
1792+
return Substitutions.hasAnySubstitutableParams();
1793+
}
17921794

17931795
/// The substitutions used to bind the generic arguments of this function.
17941796
SubstitutionList getSubstitutions() const { return Substitutions.toList(); }
@@ -2769,7 +2771,7 @@ class BuiltinInst final
27692771
/// True if this builtin application has substitutions, which represent type
27702772
/// parameters to the builtin.
27712773
bool hasSubstitutions() const {
2772-
return !Substitutions.empty();
2774+
return Substitutions.hasAnySubstitutableParams();
27732775
}
27742776

27752777
/// Return the type parameters to the builtin.

include/swift/SIL/TypeSubstCloner.h

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,6 @@ class TypeSubstCloner : public SILClonerWithScopes<ImplClass> {
4040
llvm_unreachable("Clients need to explicitly call a base class impl!");
4141
}
4242

43-
void computeSubsMap() {
44-
if (auto genericSig = Original.getLoweredFunctionType()
45-
->getGenericSignature()) {
46-
SubsMap = genericSig->getSubstitutionMap(ApplySubs);
47-
}
48-
}
49-
5043
// A helper class for cloning different kinds of apply instructions.
5144
// Supports cloning of self-recursive functions.
5245
class ApplySiteCloningHelper {
@@ -141,27 +134,25 @@ class TypeSubstCloner : public SILClonerWithScopes<ImplClass> {
141134

142135
TypeSubstCloner(SILFunction &To,
143136
SILFunction &From,
144-
SubstitutionList ApplySubs,
137+
SubstitutionMap ApplySubs,
145138
SILOpenedArchetypesTracker &OpenedArchetypesTracker,
146139
bool Inlining = false)
147140
: SILClonerWithScopes<ImplClass>(To, OpenedArchetypesTracker, Inlining),
148141
SwiftMod(From.getModule().getSwiftModule()),
142+
SubsMap(ApplySubs),
149143
Original(From),
150-
ApplySubs(ApplySubs),
151144
Inlining(Inlining) {
152-
computeSubsMap();
153145
}
154146

155147
TypeSubstCloner(SILFunction &To,
156148
SILFunction &From,
157-
SubstitutionList ApplySubs,
149+
SubstitutionMap ApplySubs,
158150
bool Inlining = false)
159151
: SILClonerWithScopes<ImplClass>(To, Inlining),
160152
SwiftMod(From.getModule().getSwiftModule()),
153+
SubsMap(ApplySubs),
161154
Original(From),
162-
ApplySubs(ApplySubs),
163155
Inlining(Inlining) {
164-
computeSubsMap();
165156
}
166157

167158

@@ -295,8 +286,6 @@ class TypeSubstCloner : public SILClonerWithScopes<ImplClass> {
295286
llvm::DenseMap<SILType, SILType> TypeCache;
296287
/// The original function to specialize.
297288
SILFunction &Original;
298-
/// The substitutions used at the call site.
299-
SubstitutionList ApplySubs;
300289
/// True, if used for inlining.
301290
bool Inlining;
302291
};

include/swift/SILOptimizer/Utils/GenericCloner.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ class GenericCloner : public TypeSubstCloner<GenericCloner> {
4141
GenericCloner(SILFunction *F,
4242
IsSerialized_t Serialized,
4343
const ReabstractionInfo &ReInfo,
44-
SubstitutionList ParamSubs,
44+
SubstitutionMap ParamSubs,
4545
StringRef NewName,
4646
CloneCollector::CallbackType Callback)
4747
: TypeSubstCloner(*initCloned(F, Serialized, ReInfo, NewName), *F,
@@ -55,7 +55,7 @@ class GenericCloner : public TypeSubstCloner<GenericCloner> {
5555
cloneFunction(SILFunction *F,
5656
IsSerialized_t Serialized,
5757
const ReabstractionInfo &ReInfo,
58-
SubstitutionList ParamSubs,
58+
SubstitutionMap ParamSubs,
5959
StringRef NewName,
6060
CloneCollector::CallbackType Callback =nullptr) {
6161
// Clone and specialize the function.

include/swift/SILOptimizer/Utils/Generics.h

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -119,13 +119,13 @@ class ReabstractionInfo {
119119

120120
void createSubstitutedAndSpecializedTypes();
121121
bool prepareAndCheck(ApplySite Apply, SILFunction *Callee,
122-
SubstitutionList ParamSubs,
122+
SubstitutionMap ParamSubs,
123123
OptRemark::Emitter *ORE = nullptr);
124124
void performFullSpecializationPreparation(SILFunction *Callee,
125-
SubstitutionList ParamSubs);
125+
SubstitutionMap ParamSubs);
126126
void performPartialSpecializationPreparation(SILFunction *Caller,
127127
SILFunction *Callee,
128-
SubstitutionList ParamSubs);
128+
SubstitutionMap ParamSubs);
129129
void finishPartialSpecializationPreparation(
130130
FunctionSignaturePartialSpecializer &FSPS);
131131

@@ -136,7 +136,7 @@ class ReabstractionInfo {
136136
/// If specialization is not possible getSpecializedType() will return an
137137
/// invalid type.
138138
ReabstractionInfo(ApplySite Apply, SILFunction *Callee,
139-
SubstitutionList ParamSubs,
139+
SubstitutionMap ParamSubs,
140140
bool ConvertIndirectToDirect = true,
141141
OptRemark::Emitter *ORE = nullptr);
142142

@@ -256,7 +256,7 @@ class ReabstractionInfo {
256256

257257
/// Returns true if a given apply can be specialized.
258258
static bool canBeSpecialized(ApplySite Apply, SILFunction *Callee,
259-
SubstitutionList ParamSubs);
259+
SubstitutionMap ParamSubs);
260260

261261
/// Returns the apply site for the current generic specialization.
262262
ApplySite getApply() const {
@@ -271,7 +271,7 @@ class ReabstractionInfo {
271271
class GenericFuncSpecializer {
272272
SILModule &M;
273273
SILFunction *GenericFunc;
274-
SubstitutionList ParamSubs;
274+
SubstitutionMap ParamSubs;
275275
IsSerialized_t Serialized;
276276
const ReabstractionInfo &ReInfo;
277277

@@ -280,7 +280,7 @@ class GenericFuncSpecializer {
280280

281281
public:
282282
GenericFuncSpecializer(SILFunction *GenericFunc,
283-
SubstitutionList ParamSubs,
283+
SubstitutionMap ParamSubs,
284284
IsSerialized_t Serialized,
285285
const ReabstractionInfo &ReInfo);
286286

include/swift/SILOptimizer/Utils/SILInliner.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ class SILInliner : public TypeSubstCloner<SILInliner> {
6161

6262
public:
6363
SILInliner(SILFunction &To, SILFunction &From, InlineKind IKind,
64-
SubstitutionList ApplySubs,
64+
SubstitutionMap ApplySubs,
6565
SILOpenedArchetypesTracker &OpenedArchetypesTracker,
6666
CloneCollector::CallbackType Callback = nullptr)
6767
: TypeSubstCloner<SILInliner>(To, From, ApplySubs,

include/swift/SILOptimizer/Utils/SpecializationMangler.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,17 +65,17 @@ class SpecializationMangler : public Mangle::ASTMangler {
6565
// The mangler for specialized generic functions.
6666
class GenericSpecializationMangler : public SpecializationMangler {
6767

68-
SubstitutionList Subs;
68+
SubstitutionMap SubMap;
6969
bool isReAbstracted;
7070

7171
public:
7272

7373
GenericSpecializationMangler(SILFunction *F,
74-
SubstitutionList Subs,
74+
SubstitutionMap SubMap,
7575
IsSerialized_t Serialized,
7676
bool isReAbstracted)
7777
: SpecializationMangler(SpecializationPass::GenericSpecializer, Serialized, F),
78-
Subs(Subs), isReAbstracted(isReAbstracted) {}
78+
SubMap(SubMap), isReAbstracted(isReAbstracted) {}
7979

8080
std::string mangle();
8181
};

lib/SIL/SILPrinter.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1083,7 +1083,7 @@ class SILPrinter : public SILInstructionVisitor<SILPrinter> {
10831083
template <class Inst>
10841084
void visitApplyInstBase(Inst *AI) {
10851085
*this << Ctx.getID(AI->getCallee());
1086-
printSubstitutions(AI->getSubstitutions());
1086+
printSubstitutions(AI->getSubstitutionMap());
10871087
*this << '(';
10881088
interleave(AI->getArguments(),
10891089
[&](const SILValue &arg) { *this << Ctx.getID(arg); },

lib/SIL/SILVerifier.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1019,12 +1019,12 @@ class SILVerifier : public SILVerifierBase<SILVerifier> {
10191019
}
10201020

10211021
/// Check the substitutions passed to an apply or partial_apply.
1022-
CanSILFunctionType checkApplySubstitutions(SubstitutionList subs,
1022+
CanSILFunctionType checkApplySubstitutions(SubstitutionMap subs,
10231023
SILType calleeTy) {
10241024
auto fnTy = requireObjectType(SILFunctionType, calleeTy, "callee operand");
10251025

10261026
// If there are substitutions, verify them and apply them to the callee.
1027-
if (subs.empty()) {
1027+
if (!subs.hasAnySubstitutableParams()) {
10281028
require(!fnTy->isPolymorphic(),
10291029
"callee of apply without substitutions must not be polymorphic");
10301030
return fnTy;
@@ -1034,8 +1034,8 @@ class SILVerifier : public SILVerifierBase<SILVerifier> {
10341034

10351035
// Each archetype occurring in the substitutions list should belong to the
10361036
// current function.
1037-
for (auto sub : subs) {
1038-
sub.getReplacement()->getCanonicalType().visit([&](CanType t) {
1037+
for (auto replacementType : subs.getReplacementTypes()) {
1038+
replacementType->getCanonicalType().visit([&](CanType t) {
10391039
auto A = dyn_cast<ArchetypeType>(t);
10401040
if (!A)
10411041
return;
@@ -1118,7 +1118,7 @@ class SILVerifier : public SILVerifierBase<SILVerifier> {
11181118

11191119
// Then make sure that we have a type that can be substituted for the
11201120
// callee.
1121-
auto substTy = checkApplySubstitutions(site.getSubstitutions(),
1121+
auto substTy = checkApplySubstitutions(site.getSubstitutionMap(),
11221122
site.getCallee()->getType());
11231123
require(site.getOrigCalleeType()->getRepresentation() ==
11241124
site.getSubstCalleeType()->getRepresentation(),
@@ -1274,7 +1274,7 @@ class SILVerifier : public SILVerifierBase<SILVerifier> {
12741274

12751275
checkApplyTypeDependentArguments(PAI);
12761276

1277-
auto substTy = checkApplySubstitutions(PAI->getSubstitutions(),
1277+
auto substTy = checkApplySubstitutions(PAI->getSubstitutionMap(),
12781278
PAI->getCallee()->getType());
12791279

12801280
require(!PAI->getSubstCalleeType()->isPolymorphic(),
@@ -4043,7 +4043,7 @@ class SILVerifier : public SILVerifierBase<SILVerifier> {
40434043
invokeTy->getExtInfo().isPseudogeneric(),
40444044
"invoke function must not take reified generic parameters");
40454045

4046-
invokeTy = checkApplySubstitutions(IBSHI->getSubstitutions().toList(),
4046+
invokeTy = checkApplySubstitutions(IBSHI->getSubstitutions(),
40474047
SILType::getPrimitiveObjectType(invokeTy));
40484048

40494049
auto storageParam = invokeTy->getParameters()[0];

lib/SILOptimizer/IPO/CapturePropagation.cpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ class CapturePropagationCloner
101101
bool IsCloningConstant;
102102
public:
103103
CapturePropagationCloner(SILFunction *OrigF, SILFunction *NewF,
104-
SubstitutionList Subs)
104+
SubstitutionMap Subs)
105105
: SuperTy(*NewF, *OrigF, Subs), OrigF(OrigF), IsCloningConstant(false) {}
106106

107107
void cloneBlocks(OperandValueArrayRef Args);
@@ -271,7 +271,7 @@ SILFunction *CapturePropagation::specializeConstClosure(PartialApplyInst *PAI,
271271
llvm::dbgs() << "CapturePropagation of generic partial_apply:\n";
272272
PAI->dumpInContext();
273273
});
274-
CapturePropagationCloner cloner(OrigF, NewF, PAI->getSubstitutions());
274+
CapturePropagationCloner cloner(OrigF, NewF, PAI->getSubstitutionMap());
275275
cloner.cloneBlocks(PAI->getArguments());
276276
assert(OrigF->getDebugScope()->Parent != NewF->getDebugScope()->Parent);
277277
return NewF;
@@ -410,11 +410,13 @@ static SILFunction *getSpecializedWithDeadParams(
410410
return nullptr;
411411

412412
// Perform a generic specialization of the Specialized function.
413-
ReabstractionInfo ReInfo(ApplySite(), Specialized, PAI->getSubstitutions(),
413+
ReabstractionInfo ReInfo(ApplySite(), Specialized,
414+
PAI->getSubstitutionMap(),
414415
/* ConvertIndirectToDirect */ false);
415-
GenericFuncSpecializer FuncSpecializer(Specialized,
416-
ReInfo.getClonerParamSubstitutions(),
417-
Specialized->isSerialized(), ReInfo);
416+
GenericFuncSpecializer FuncSpecializer(
417+
Specialized,
418+
ReInfo.getClonerParamSubstitutionMap(),
419+
Specialized->isSerialized(), ReInfo);
418420

419421
SILFunction *GenericSpecializedFunc = FuncSpecializer.trySpecialization();
420422
if (!GenericSpecializedFunc)

lib/SILOptimizer/IPO/EagerSpecializer.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -623,7 +623,7 @@ emitArgumentConversion(SmallVectorImpl<SILValue> &CallArgs) {
623623
auto CalleeSubstFnTy = CanSILFuncTy;
624624
if (CanSILFuncTy->isPolymorphic()) {
625625
CalleeSubstFnTy = CanSILFuncTy->substGenericArgs(
626-
Builder.getModule(), ReInfo.getCallerParamSubstitutions());
626+
Builder.getModule(), ReInfo.getCallerParamSubstitutionMap());
627627
assert(!CalleeSubstFnTy->isPolymorphic() &&
628628
"Substituted callee type should not be polymorphic");
629629
assert(!CalleeSubstFnTy->hasTypeParameter() &&
@@ -718,7 +718,7 @@ static SILFunction *eagerSpecialize(SILFunction *GenericFunc,
718718
Serialized = IsSerializable;
719719

720720
GenericFuncSpecializer
721-
FuncSpecializer(GenericFunc, ReInfo.getClonerParamSubstitutions(),
721+
FuncSpecializer(GenericFunc, ReInfo.getClonerParamSubstitutionMap(),
722722
Serialized, ReInfo);
723723

724724
SILFunction *NewFunc = FuncSpecializer.trySpecialization();

lib/SILOptimizer/IPO/UsePrespecialized.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -77,15 +77,15 @@ bool UsePrespecialized::replaceByPrespecialized(SILFunction &F) {
7777
// If this is the case, check if there is a specialization
7878
// available for it already and use this specialization
7979
// instead of the generic version.
80-
81-
SubstitutionList Subs = AI.getSubstitutions();
82-
if (Subs.empty())
80+
if (!AI.hasSubstitutions())
8381
continue;
8482

83+
SubstitutionMap Subs = AI.getSubstitutionMap();
84+
8585
// Bail if any generic type parameters are unbound.
8686
// TODO: Remove this limitation once public partial specializations
8787
// are supported and can be provided by other modules.
88-
if (hasArchetypes(Subs))
88+
if (Subs.hasArchetypes())
8989
continue;
9090

9191
ReabstractionInfo ReInfo(AI, ReferencedF, Subs);

lib/SILOptimizer/Mandatory/MandatoryInlining.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -535,8 +535,8 @@ runOnFunctionRecursively(SILFunction *F, FullApplySite AI,
535535

536536
// Get our list of substitutions.
537537
auto Subs = (PAI
538-
? PAI->getSubstitutions()
539-
: InnerAI.getSubstitutions());
538+
? PAI->getSubstitutionMap()
539+
: InnerAI.getSubstitutionMap());
540540

541541
SILOpenedArchetypesTracker OpenedArchetypesTracker(F);
542542
F->getModule().registerDeleteNotificationHandler(

lib/SILOptimizer/Transforms/PerformanceInliner.cpp

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ class SILPerformanceInliner {
178178
// Returns true if it is possible to perform a generic
179179
// specialization for a given call.
180180
static bool canSpecializeGeneric(ApplySite AI, SILFunction *F,
181-
SubstitutionList Subs) {
181+
SubstitutionMap Subs) {
182182
return ReabstractionInfo::canBeSpecialized(AI, F, Subs);
183183
}
184184

@@ -279,7 +279,7 @@ bool SILPerformanceInliner::isProfitableToInline(
279279
// Bail out if this generic call can be optimized by means of
280280
// the generic specialization, because we prefer generic specialization
281281
// to inlining of generics.
282-
if (IsGeneric && canSpecializeGeneric(AI, Callee, AI.getSubstitutions())) {
282+
if (IsGeneric && canSpecializeGeneric(AI, Callee, AI.getSubstitutionMap())) {
283283
return false;
284284
}
285285

@@ -350,9 +350,6 @@ bool SILPerformanceInliner::isProfitableToInline(
350350
auto SubMap = Sig->getSubstitutionMap(Subs);
351351
SubMap = SubMap.subst(CalleeSubstMap);
352352

353-
SmallVector<Substitution, 4> NewSubs;
354-
Sig->getSubstitutions(SubMap, NewSubs);
355-
356353
// Check if the call can be devirtualized.
357354
if (isa<ClassMethodInst>(def) || isa<WitnessMethodInst>(def) ||
358355
isa<SuperMethodInst>(def)) {
@@ -368,7 +365,7 @@ bool SILPerformanceInliner::isProfitableToInline(
368365
// Check if a generic specialization would be possible.
369366
if (isa<FunctionRefInst>(def)) {
370367
auto CalleeF = FAI.getCalleeFunction();
371-
if (!canSpecializeGeneric(FAI, CalleeF, NewSubs))
368+
if (!canSpecializeGeneric(FAI, CalleeF, SubMap))
372369
continue;
373370
DEBUG(llvm::dbgs() << "Generic specialization will be possible after "
374371
"inlining for the call:\n";
@@ -847,7 +844,7 @@ bool SILPerformanceInliner::inlineCallsIntoFunction(SILFunction *Caller) {
847844

848845
SILInliner Inliner(*Caller, *Callee,
849846
SILInliner::InlineKind::PerformanceInline,
850-
AI.getSubstitutions(),
847+
AI.getSubstitutionMap(),
851848
OpenedArchetypesTracker);
852849

853850
// We've already determined we should be able to inline this, so

0 commit comments

Comments
 (0)