Skip to content

Commit 60a28cd

Browse files
eecksteinaschwaighofer
authored andcommitted
embedded: don't re-abstract witness method calls for existentials
Don't convert indirect to direct arguments. This is needed to support general existentials in embedded swift.
1 parent 920def9 commit 60a28cd

File tree

3 files changed

+8
-4
lines changed

3 files changed

+8
-4
lines changed

SwiftCompilerSources/Sources/Optimizer/Utilities/GenericSpecialization.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ func specializeWitnessTable(for conformance: Conformance, _ context: ModulePassC
148148
guard !methodSubs.conformances.contains(where: {!$0.isValid}),
149149
context.loadFunction(function: origMethod, loadCalleesRecursively: true),
150150
let specializedMethod = context.specialize(function: origMethod, for: methodSubs,
151-
convertIndirectToDirect: true, isMandatory: true)
151+
convertIndirectToDirect: false, isMandatory: true)
152152
else {
153153
return origEntry
154154
}
@@ -215,7 +215,7 @@ private func specializeDefaultMethods(for conformance: Conformance,
215215
guard !methodSubs.conformances.contains(where: {!$0.isValid}),
216216
context.loadFunction(function: origMethod, loadCalleesRecursively: true),
217217
let specializedMethod = context.specialize(function: origMethod, for: methodSubs,
218-
convertIndirectToDirect: true, isMandatory: true)
218+
convertIndirectToDirect: false, isMandatory: true)
219219
else {
220220
return origEntry
221221
}

include/swift/SILOptimizer/Utils/Generics.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,9 @@ class ReabstractionInfo {
216216

217217
ReabstractionInfo(CanSILFunctionType substitutedType,
218218
SILDeclRef methodDecl,
219+
bool convertIndirectToDirect,
219220
SILModule &M) :
221+
ConvertIndirectToDirect(convertIndirectToDirect),
220222
SubstitutedType(substitutedType),
221223
methodDecl(methodDecl),
222224
M(&M), isWholeModule(M.isWholeModule()) {}

lib/SILOptimizer/Utils/Generics.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2413,7 +2413,8 @@ bool swift::specializeClassMethodInst(ClassMethodInst *cm) {
24132413
SILType substitutedType =
24142414
funcTy.substGenericArgs(m, subs, TypeExpansionContext::minimal());
24152415

2416-
ReabstractionInfo reInfo(substitutedType.getAs<SILFunctionType>(), cm->getMember(), m);
2416+
ReabstractionInfo reInfo(substitutedType.getAs<SILFunctionType>(), cm->getMember(),
2417+
/*convertIndirectToDirect=*/ true, m);
24172418
reInfo.createSubstitutedAndSpecializedTypes();
24182419
CanSILFunctionType finalFuncTy = reInfo.getSpecializedType();
24192420
SILType finalSILTy = SILType::getPrimitiveObjectType(finalFuncTy);
@@ -2465,7 +2466,8 @@ bool swift::specializeWitnessMethodInst(WitnessMethodInst *wm) {
24652466
SILType substitutedType =
24662467
funcTy.substGenericArgs(m, subs, TypeExpansionContext::minimal());
24672468

2468-
ReabstractionInfo reInfo(substitutedType.getAs<SILFunctionType>(), wm->getMember(), m);
2469+
ReabstractionInfo reInfo(substitutedType.getAs<SILFunctionType>(), wm->getMember(),
2470+
/*convertIndirectToDirect=*/ false, m);
24692471
reInfo.createSubstitutedAndSpecializedTypes();
24702472
CanSILFunctionType finalFuncTy = reInfo.getSpecializedType();
24712473
SILType finalSILTy = SILType::getPrimitiveObjectType(finalFuncTy);

0 commit comments

Comments
 (0)