Skip to content

Commit d457f1c

Browse files
committed
[IRGen/SIL] More widespread use of SubstitutionMap.
1 parent 09446de commit d457f1c

File tree

12 files changed

+33
-54
lines changed

12 files changed

+33
-54
lines changed

lib/IRGen/GenFunc.cpp

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -757,7 +757,7 @@ static llvm::Function *emitPartialApplicationForwarder(IRGenModule &IGM,
757757
CanSILFunctionType origType,
758758
CanSILFunctionType substType,
759759
CanSILFunctionType outType,
760-
SubstitutionList subs,
760+
SubstitutionMap subs,
761761
HeapLayout const *layout,
762762
ArrayRef<ParameterConvention> conventions) {
763763
auto outSig = IGM.getSignature(outType);
@@ -947,8 +947,9 @@ static llvm::Function *emitPartialApplicationForwarder(IRGenModule &IGM,
947947
Explosion polyArgs;
948948

949949
// Emit the polymorphic arguments.
950-
assert((subs.empty() != hasPolymorphicParameters(origType) ||
951-
(subs.empty() && origType->getRepresentation() ==
950+
assert((subs.hasAnySubstitutableParams()
951+
== hasPolymorphicParameters(origType) ||
952+
(!subs.hasAnySubstitutableParams() && origType->getRepresentation() ==
952953
SILFunctionTypeRepresentation::WitnessMethod))
953954
&& "should have substitutions iff original function is generic");
954955
WitnessMetadata witnessMetadata;
@@ -984,10 +985,7 @@ static llvm::Function *emitPartialApplicationForwarder(IRGenModule &IGM,
984985
(void)param.claimAll();
985986
}
986987

987-
SubstitutionMap subMap;
988-
if (auto genericSig = origType->getGenericSignature())
989-
subMap = genericSig->getSubstitutionMap(subs);
990-
emitPolymorphicArguments(subIGF, origType, subMap,
988+
emitPolymorphicArguments(subIGF, origType, subs,
991989
&witnessMetadata, polyArgs);
992990
}
993991

@@ -1184,10 +1182,7 @@ static llvm::Function *emitPartialApplicationForwarder(IRGenModule &IGM,
11841182
// Now that we have bound generic parameters from the captured arguments
11851183
// emit the polymorphic arguments.
11861184
if (hasPolymorphicParameters(origType)) {
1187-
SubstitutionMap subMap;
1188-
if (auto genericSig = origType->getGenericSignature())
1189-
subMap = genericSig->getSubstitutionMap(subs);
1190-
emitPolymorphicArguments(subIGF, origType, subMap,
1185+
emitPolymorphicArguments(subIGF, origType, subs,
11911186
&witnessMetadata, polyArgs);
11921187
}
11931188
}
@@ -1333,7 +1328,7 @@ static llvm::Function *emitPartialApplicationForwarder(IRGenModule &IGM,
13331328
void irgen::emitFunctionPartialApplication(
13341329
IRGenFunction &IGF, SILFunction &SILFn, const FunctionPointer &fn,
13351330
llvm::Value *fnContext, Explosion &args, ArrayRef<SILParameterInfo> params,
1336-
SubstitutionList subs, CanSILFunctionType origType,
1331+
SubstitutionMap subs, CanSILFunctionType origType,
13371332
CanSILFunctionType substType, CanSILFunctionType outType, Explosion &out,
13381333
bool isOutlined) {
13391334
// If we have a single Swift-refcounted context value, we can adopt it
@@ -1349,11 +1344,8 @@ void irgen::emitFunctionPartialApplication(
13491344
assert(!outType->isNoEscape());
13501345

13511346
// Reserve space for polymorphic bindings.
1352-
SubstitutionMap subMap;
1353-
if (auto genericSig = origType->getGenericSignature())
1354-
subMap = genericSig->getSubstitutionMap(subs);
13551347
auto bindings = NecessaryBindings::forFunctionInvocations(IGF.IGM,
1356-
origType, subMap);
1348+
origType, subs);
13571349
if (!bindings.empty()) {
13581350
hasSingleSwiftRefcountedContext = No;
13591351
auto bindingsSize = bindings.getBufferSize(IGF.IGM);

lib/IRGen/GenFunc.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ namespace irgen {
5050
void emitFunctionPartialApplication(
5151
IRGenFunction &IGF, SILFunction &SILFn, const FunctionPointer &fnPtr,
5252
llvm::Value *fnContext, Explosion &args,
53-
ArrayRef<SILParameterInfo> argTypes, SubstitutionList subs,
53+
ArrayRef<SILParameterInfo> argTypes, SubstitutionMap subs,
5454
CanSILFunctionType origType, CanSILFunctionType substType,
5555
CanSILFunctionType outType, Explosion &out, bool isOutlined);
5656

lib/IRGen/GenReflection.cpp

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -558,14 +558,14 @@ class CaptureDescriptorBuilder : public ReflectionMetadataBuilder {
558558
swift::reflection::MetadataSourceBuilder SourceBuilder;
559559
CanSILFunctionType OrigCalleeType;
560560
CanSILFunctionType SubstCalleeType;
561-
SubstitutionList Subs;
561+
SubstitutionMap Subs;
562562
const HeapLayout &Layout;
563563

564564
public:
565565
CaptureDescriptorBuilder(IRGenModule &IGM,
566566
CanSILFunctionType OrigCalleeType,
567567
CanSILFunctionType SubstCalleeType,
568-
SubstitutionList Subs,
568+
SubstitutionMap Subs,
569569
const HeapLayout &Layout)
570570
: ReflectionMetadataBuilder(IGM),
571571
OrigCalleeType(OrigCalleeType),
@@ -656,9 +656,6 @@ class CaptureDescriptorBuilder : public ReflectionMetadataBuilder {
656656
// Check if any requirements were fulfilled by metadata stored inside a
657657
// captured value.
658658

659-
auto SubstMap =
660-
OrigCalleeType->getGenericSignature()->getSubstitutionMap(Subs);
661-
662659
enumerateGenericParamFulfillments(IGM, OrigCalleeType,
663660
[&](CanType GenericParam,
664661
const irgen::MetadataSource &Source,
@@ -690,7 +687,7 @@ class CaptureDescriptorBuilder : public ReflectionMetadataBuilder {
690687
// parameters.
691688
auto Src = Path.getMetadataSource(SourceBuilder, Root);
692689

693-
auto SubstType = GenericParam.subst(SubstMap);
690+
auto SubstType = GenericParam.subst(Subs);
694691
auto InterfaceType = SubstType->mapTypeOutOfContext();
695692
SourceMap.push_back({InterfaceType->getCanonicalType(), Src});
696693
});
@@ -845,7 +842,7 @@ llvm::Constant *
845842
IRGenModule::getAddrOfCaptureDescriptor(SILFunction &Caller,
846843
CanSILFunctionType OrigCalleeType,
847844
CanSILFunctionType SubstCalleeType,
848-
SubstitutionList Subs,
845+
SubstitutionMap Subs,
849846
const HeapLayout &Layout) {
850847
if (!IRGen.Opts.EnableReflectionMetadata)
851848
return llvm::Constant::getNullValue(CaptureDescriptorPtrTy);

lib/IRGen/IRGenModule.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -979,7 +979,7 @@ class IRGenModule {
979979
llvm::Constant *getAddrOfCaptureDescriptor(SILFunction &caller,
980980
CanSILFunctionType origCalleeType,
981981
CanSILFunctionType substCalleeType,
982-
SubstitutionList subs,
982+
SubstitutionMap subs,
983983
const HeapLayout &layout);
984984
llvm::Constant *getAddrOfBoxDescriptor(CanType boxedType);
985985

lib/IRGen/IRGenSIL.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2316,9 +2316,7 @@ void IRGenSILFunction::visitFullApplySite(FullApplySite site) {
23162316

23172317
// Pass the generic arguments.
23182318
if (hasPolymorphicParameters(origCalleeType)) {
2319-
SubstitutionMap subMap;
2320-
if (auto genericSig = origCalleeType->getGenericSignature())
2321-
subMap = genericSig->getSubstitutionMap(site.getSubstitutions());
2319+
SubstitutionMap subMap = site.getSubstitutionMap();
23222320
emitPolymorphicArguments(*this, origCalleeType,
23232321
subMap, &witnessMetadata, llArgs);
23242322
}
@@ -2518,7 +2516,7 @@ void IRGenSILFunction::visitPartialApplyInst(swift::PartialApplyInst *i) {
25182516
Explosion function;
25192517
emitFunctionPartialApplication(
25202518
*this, *CurSILFn, calleeFn, innerContext, llArgs, params,
2521-
i->getSubstitutions(), origCalleeTy, i->getSubstCalleeType(),
2519+
i->getSubstitutionMap(), origCalleeTy, i->getSubstCalleeType(),
25222520
i->getType().castTo<SILFunctionType>(), function, false);
25232521
setLoweredExplosion(v, function);
25242522
}

lib/SIL/Linker.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -156,21 +156,21 @@ void SILLinkerVisitor::linkInVTable(ClassDecl *D) {
156156
void SILLinkerVisitor::visitApplyInst(ApplyInst *AI) {
157157
if (auto sig = AI->getCallee()->getType().castTo<SILFunctionType>()
158158
->getGenericSignature()) {
159-
visitApplySubstitutions(sig->getSubstitutionMap(AI->getSubstitutions()));
159+
visitApplySubstitutions(AI->getSubstitutionMap());
160160
}
161161
}
162162

163163
void SILLinkerVisitor::visitTryApplyInst(TryApplyInst *TAI) {
164164
if (auto sig = TAI->getCallee()->getType().castTo<SILFunctionType>()
165165
->getGenericSignature()) {
166-
visitApplySubstitutions(sig->getSubstitutionMap(TAI->getSubstitutions()));
166+
visitApplySubstitutions(TAI->getSubstitutionMap());
167167
}
168168
}
169169

170170
void SILLinkerVisitor::visitPartialApplyInst(PartialApplyInst *PAI) {
171171
if (auto sig = PAI->getCallee()->getType().castTo<SILFunctionType>()
172172
->getGenericSignature()) {
173-
visitApplySubstitutions(sig->getSubstitutionMap(PAI->getSubstitutions()));
173+
visitApplySubstitutions(PAI->getSubstitutionMap());
174174
}
175175
}
176176

lib/SIL/SILInstruction.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -609,7 +609,7 @@ namespace {
609609

610610
bool visitApplyInst(ApplyInst *RHS) {
611611
auto *X = cast<ApplyInst>(LHS);
612-
return X->getSubstitutions() == RHS->getSubstitutions();
612+
return X->getSubstitutionMap() == RHS->getSubstitutionMap();
613613
}
614614

615615
bool visitBuiltinInst(BuiltinInst *RHS) {

lib/SILOptimizer/IPO/CapturePromotion.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1221,7 +1221,7 @@ processPartialApplyInst(PartialApplyInst *PAI, IndicesSet &PromotableIndices,
12211221
auto SubstCalleeFunctionTy = CalleeFunctionTy;
12221222
if (PAI->hasSubstitutions())
12231223
SubstCalleeFunctionTy =
1224-
CalleeFunctionTy->substGenericArgs(M, PAI->getSubstitutions());
1224+
CalleeFunctionTy->substGenericArgs(M, PAI->getSubstitutionMap());
12251225
SILFunctionConventions calleeConv(SubstCalleeFunctionTy, M);
12261226
auto CalleePInfo = SubstCalleeFunctionTy->getParameters();
12271227
SILFunctionConventions paConv(PAI->getType().castTo<SILFunctionType>(), M);

lib/SILOptimizer/IPO/CapturePropagation.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,8 @@ CanSILFunctionType getPartialApplyInterfaceResultType(PartialApplyInst *PAI) {
218218
// expressed as literals. So its callee signature will be the same as its
219219
// return signature.
220220
auto FTy = PAI->getType().castTo<SILFunctionType>();
221-
assert(!PAI->hasSubstitutions() || !hasArchetypes(PAI->getSubstitutions()));
221+
assert(!PAI->hasSubstitutions() ||
222+
!PAI->getSubstitutionMap().hasArchetypes());
222223
FTy = cast<SILFunctionType>(
223224
FTy->mapTypeOutOfContext()->getCanonicalType());
224225
auto NewFTy = FTy;
@@ -434,7 +435,7 @@ bool CapturePropagation::optimizePartialApply(PartialApplyInst *PAI) {
434435
if (SubstF->isExternalDeclaration())
435436
return false;
436437

437-
if (PAI->hasSubstitutions() && hasArchetypes(PAI->getSubstitutions())) {
438+
if (PAI->hasSubstitutions() && PAI->getSubstitutionMap().hasArchetypes()) {
438439
DEBUG(llvm::dbgs()
439440
<< "CapturePropagation: cannot handle partial specialization "
440441
"of partial_apply:\n";

lib/SILOptimizer/Transforms/PerformanceInliner.cpp

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ bool SILPerformanceInliner::isProfitableToInline(
240240
int &NumCallerBlocks,
241241
const llvm::DenseMap<SILBasicBlock *, uint64_t> &BBToWeightMap) {
242242
SILFunction *Callee = AI.getReferencedFunction();
243-
bool IsGeneric = !AI.getSubstitutions().empty();
243+
bool IsGeneric = AI.hasSubstitutions();
244244

245245
assert(EnableSILInliningOfGenerics || !IsGeneric);
246246

@@ -296,12 +296,7 @@ bool SILPerformanceInliner::isProfitableToInline(
296296
int CalleeCost = 0;
297297
int Benefit = 0;
298298

299-
SubstitutionMap CalleeSubstMap;
300-
if (IsGeneric) {
301-
CalleeSubstMap = Callee->getLoweredFunctionType()
302-
->getGenericSignature()
303-
->getSubstitutionMap(AI.getSubstitutions());
304-
}
299+
SubstitutionMap CalleeSubstMap = AI.getSubstitutionMap();
305300

306301
CallerWeight.updateBenefit(Benefit, BaseBenefit);
307302

@@ -330,7 +325,7 @@ bool SILPerformanceInliner::isProfitableToInline(
330325
if (!def)
331326
continue;
332327

333-
auto Subs = FAI.getSubstitutions();
328+
auto Subs = FAI.getSubstitutionMap();
334329

335330
// Bail if it is not a generic call or inlining of generics is forbidden.
336331
if (!EnableSILInliningOfGenerics || Subs.empty())
@@ -346,9 +341,7 @@ bool SILPerformanceInliner::isProfitableToInline(
346341

347342
// Create the list of substitutions as they will be after
348343
// inlining.
349-
auto Sig = FAI.getOrigCalleeType()->getGenericSignature();
350-
auto SubMap = Sig->getSubstitutionMap(Subs);
351-
SubMap = SubMap.subst(CalleeSubstMap);
344+
auto SubMap = Subs.subst(CalleeSubstMap);
352345

353346
// Check if the call can be devirtualized.
354347
if (isa<ClassMethodInst>(def) || isa<WitnessMethodInst>(def) ||
@@ -512,7 +505,7 @@ static Optional<bool> shouldInlineGeneric(FullApplySite AI) {
512505
// If all substitutions are concrete, then there is no need to perform the
513506
// generic inlining. Let the generic specializer create a specialized
514507
// function and then decide if it is beneficial to inline it.
515-
if (!hasArchetypes(AI.getSubstitutions()))
508+
if (!AI.getSubstitutionMap().hasArchetypes())
516509
return false;
517510

518511
// It is not clear yet if this function should be decided or not.

lib/SILOptimizer/Transforms/SimplifyCFG.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2085,14 +2085,14 @@ bool SimplifyCFG::simplifyTryApplyBlock(TryApplyInst *TAI) {
20852085
auto TargetFnTy = CalleeFnTy;
20862086
if (TargetFnTy->isPolymorphic()) {
20872087
TargetFnTy = TargetFnTy->substGenericArgs(TAI->getModule(),
2088-
TAI->getSubstitutions());
2088+
TAI->getSubstitutionMap());
20892089
}
20902090
SILFunctionConventions targetConv(TargetFnTy, TAI->getModule());
20912091

20922092
auto OrigFnTy = TAI->getCallee()->getType().getAs<SILFunctionType>();
20932093
if (OrigFnTy->isPolymorphic()) {
20942094
OrigFnTy = OrigFnTy->substGenericArgs(TAI->getModule(),
2095-
TAI->getSubstitutions());
2095+
TAI->getSubstitutionMap());
20962096
}
20972097
SILFunctionConventions origConv(OrigFnTy, TAI->getModule());
20982098

lib/SILOptimizer/Utils/PerformanceInlinerUtils.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -580,14 +580,12 @@ static bool calleeHasPartialApplyWithOpenedExistentials(FullApplySite AI) {
580580
for (auto &BB : *Callee) {
581581
for (auto &I : BB) {
582582
if (auto PAI = dyn_cast<PartialApplyInst>(&I)) {
583-
auto PAISubs = PAI->getSubstitutions();
584-
if (PAISubs.empty())
583+
if (!PAI->hasSubstitutions())
585584
continue;
586585

587586
// Check if any of substitutions would contain open existentials
588587
// after inlining.
589-
auto PAISubMap = PAI->getOrigCalleeType()
590-
->getGenericSignature()->getSubstitutionMap(PAISubs);
588+
auto PAISubMap = PAI->getSubstitutionMap();
591589
PAISubMap = PAISubMap.subst(SubsMap);
592590
if (PAISubMap.hasOpenedExistential())
593591
return true;

0 commit comments

Comments
 (0)