Skip to content

Commit 4a7005a

Browse files
committed
[SILOptimizer] Distributed: Suppress signature specialization for witnesses with ad-hoc serialization requirement
1 parent acd9299 commit 4a7005a

File tree

3 files changed

+31
-11
lines changed

3 files changed

+31
-11
lines changed

include/swift/AST/Decl.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7497,6 +7497,17 @@ class AbstractFunctionDecl : public GenericContext, public ValueDecl {
74977497
/// 'DistributedTargetInvocationResultHandler' protocol.
74987498
bool isDistributedTargetInvocationResultHandlerOnReturn() const;
74997499

7500+
/// Determines whether this declaration is a witness to a
7501+
/// protocol requirement with ad-hoc `SerializationRequirement`
7502+
/// conformance.
7503+
bool isDistributedWitnessWithAdHocSerializationRequirement() const {
7504+
return isDistributedActorSystemRemoteCall(/*isVoidResult=*/false) ||
7505+
isDistributedTargetInvocationEncoderRecordArgument() ||
7506+
isDistributedTargetInvocationEncoderRecordReturnType() ||
7507+
isDistributedTargetInvocationDecoderDecodeNextArgument() ||
7508+
isDistributedTargetInvocationResultHandlerOnReturn();
7509+
}
7510+
75007511
/// For a method of a class, checks whether it will require a new entry in the
75017512
/// vtable.
75027513
bool needsNewVTableEntry() const;

lib/IRGen/GenProto.cpp

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -745,23 +745,21 @@ void EmitPolymorphicParameters::injectAdHocDistributedRequirements() {
745745
if (!(funcDecl && funcDecl->isGeneric()))
746746
return;
747747

748+
if (!funcDecl->isDistributedWitnessWithAdHocSerializationRequirement())
749+
return;
750+
748751
Type genericParam;
749752

753+
auto sig = funcDecl->getGenericSignature();
754+
750755
// DistributedActorSystem.remoteCall
751756
if (funcDecl->isDistributedActorSystemRemoteCall(
752757
/*isVoidReturn=*/false)) {
753758
genericParam = funcDecl->getResultInterfaceType();
754-
}
755-
756-
auto sig = funcDecl->getGenericSignature();
757-
758-
// DistributedTargetInvocationEncoder.record{Argument, ReturnType}
759-
// DistributedTargetInvocationDecoder.decodeNextArgument
760-
// DistributedTargetInvocationResultHandler.onReturn
761-
if (funcDecl->isDistributedTargetInvocationEncoderRecordArgument() ||
762-
funcDecl->isDistributedTargetInvocationEncoderRecordReturnType() ||
763-
funcDecl->isDistributedTargetInvocationDecoderDecodeNextArgument() ||
764-
funcDecl->isDistributedTargetInvocationResultHandlerOnReturn()) {
759+
} else {
760+
// DistributedTargetInvocationEncoder.record{Argument, ReturnType}
761+
// DistributedTargetInvocationDecoder.decodeNextArgument
762+
// DistributedTargetInvocationResultHandler.onReturn
765763
genericParam = sig.getInnermostGenericParams().front();
766764
}
767765

lib/SILOptimizer/FunctionSignatureTransforms/FunctionSignatureOpts.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,17 @@ static bool canSpecializeFunction(SILFunction *F,
141141
OptForPartialApply))
142142
return false;
143143

144+
// Cannot specialize witnesses of distributed protocol requirements with
145+
// ad-hoc `SerializationRequirement` because that erases information
146+
// IRGen relies on to emit protocol conformances at runtime.
147+
if (F->hasLocation()) {
148+
if (auto *funcDecl =
149+
dyn_cast_or_null<FuncDecl>(F->getLocation().getAsDeclContext())) {
150+
if (funcDecl->isDistributedWitnessWithAdHocSerializationRequirement())
151+
return false;
152+
}
153+
}
154+
144155
return true;
145156
}
146157

0 commit comments

Comments
 (0)