Merge pull request #19464 from aschwaighofer/fix-sil-function-type-profile-4.2
[4.2] SIL: Profile the witnessMethodConformance as part of the SILFun…
diff --git a/include/swift/AST/Types.h b/include/swift/AST/Types.h
index 55154c3..b34b28d 100644
--- a/include/swift/AST/Types.h
+++ b/include/swift/AST/Types.h
@@ -4034,7 +4034,8 @@
void Profile(llvm::FoldingSetNodeID &ID) {
Profile(ID, getGenericSignature(), getExtInfo(), getCoroutineKind(),
getCalleeConvention(), getParameters(), getYields(),
- getResults(), getOptionalErrorResult());
+ getResults(), getOptionalErrorResult(),
+ getWitnessMethodConformanceOrNone());
}
static void Profile(llvm::FoldingSetNodeID &ID,
GenericSignature *genericSig,
@@ -4044,7 +4045,8 @@
ArrayRef<SILParameterInfo> params,
ArrayRef<SILYieldInfo> yields,
ArrayRef<SILResultInfo> results,
- Optional<SILResultInfo> errorResult);
+ Optional<SILResultInfo> errorResult,
+ Optional<ProtocolConformanceRef> conformance);
// Implement isa/cast/dyncast/etc.
static bool classof(const TypeBase *T) {
diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp
index f5542e1..309421f 100644
--- a/lib/AST/ASTContext.cpp
+++ b/lib/AST/ASTContext.cpp
@@ -3863,7 +3863,8 @@
ArrayRef<SILParameterInfo> params,
ArrayRef<SILYieldInfo> yields,
ArrayRef<SILResultInfo> results,
- Optional<SILResultInfo> errorResult) {
+ Optional<SILResultInfo> errorResult,
+ Optional<ProtocolConformanceRef> conformance) {
id.AddPointer(genericParams);
id.AddInteger(info.getFuncAttrKey());
id.AddInteger(unsigned(coroutineKind));
@@ -3881,6 +3882,8 @@
// Just allow the profile length to implicitly distinguish the
// presence of an error result.
if (errorResult) errorResult->profile(id);
+ if (conformance)
+ id.AddPointer(conformance->getRequirement());
}
SILFunctionType::SILFunctionType(GenericSignature *genericSig, ExtInfo ext,
@@ -4016,8 +4019,9 @@
assert(coroutineKind != SILCoroutineKind::None || yields.empty());
llvm::FoldingSetNodeID id;
- SILFunctionType::Profile(id, genericSig, ext, coroutineKind, callee,
- params, yields, normalResults, errorResult);
+ SILFunctionType::Profile(id, genericSig, ext, coroutineKind, callee, params,
+ yields, normalResults, errorResult,
+ witnessMethodConformance);
// Do we already have this generic function type?
void *insertPos;
diff --git a/test/SILGen/witnesses.swift b/test/SILGen/witnesses.swift
index fe4f550..dab1df7 100644
--- a/test/SILGen/witnesses.swift
+++ b/test/SILGen/witnesses.swift
@@ -337,7 +337,7 @@
struct NonFailableModel: FailableRequirement, NonFailableRefinement, IUOFailableRequirement {
// CHECK-LABEL: sil private [transparent] [thunk] @$S9witnesses16NonFailableModelVAA0C11Requirement{{[_0-9a-zA-Z]*}}fCTW : $@convention(witness_method: FailableRequirement) (Int, @thick NonFailableModel.Type) -> @out Optional<NonFailableModel>
// CHECK-LABEL: sil private [transparent] [thunk] @$S9witnesses16NonFailableModelVAA0bC10Refinement{{[_0-9a-zA-Z]*}}fCTW : $@convention(witness_method: NonFailableRefinement) (Int, @thick NonFailableModel.Type) -> @out NonFailableModel
- // CHECK-LABEL: sil private [transparent] [thunk] @$S9witnesses16NonFailableModelVAA22IUOFailableRequirement{{[_0-9a-zA-Z]*}}fCTW : $@convention(witness_method: FailableRequirement) (Int, @thick NonFailableModel.Type) -> @out Optional<NonFailableModel>
+ // CHECK-LABEL: sil private [transparent] [thunk] @$S9witnesses16NonFailableModelVAA22IUOFailableRequirement{{[_0-9a-zA-Z]*}}fCTW : $@convention(witness_method: IUOFailableRequirement) (Int, @thick NonFailableModel.Type) -> @out Optional<NonFailableModel>
init(foo: Int) {}
}
@@ -380,7 +380,7 @@
final class NonFailableClassModel: FailableClassRequirement, NonFailableClassRefinement, IUOFailableClassRequirement {
// CHECK-LABEL: sil private [transparent] [thunk] @$S9witnesses21NonFailableClassModelCAA0cD11Requirement{{[_0-9a-zA-Z]*}}fCTW : $@convention(witness_method: FailableClassRequirement) (Int, @thick NonFailableClassModel.Type) -> @owned Optional<NonFailableClassModel>
// CHECK-LABEL: sil private [transparent] [thunk] @$S9witnesses21NonFailableClassModelCAA0bcD10Refinement{{[_0-9a-zA-Z]*}}fCTW : $@convention(witness_method: NonFailableClassRefinement) (Int, @thick NonFailableClassModel.Type) -> @owned NonFailableClassModel
- // CHECK-LABEL: sil private [transparent] [thunk] @$S9witnesses21NonFailableClassModelCAA011IUOFailableD11Requirement{{[_0-9a-zA-Z]*}}fCTW : $@convention(witness_method: FailableClassRequirement) (Int, @thick NonFailableClassModel.Type) -> @owned Optional<NonFailableClassModel>
+ // CHECK-LABEL: sil private [transparent] [thunk] @$S9witnesses21NonFailableClassModelCAA011IUOFailableD11Requirement{{[_0-9a-zA-Z]*}}fCTW : $@convention(witness_method: IUOFailableClassRequirement) (Int, @thick NonFailableClassModel.Type) -> @owned Optional<NonFailableClassModel>
init(foo: Int) {}
}
@@ -525,3 +525,22 @@
struct EscapingCovariance: EscapingReq {
func f(_: (Int) -> Int) { }
}
+
+
+protocol Base {
+ func foo()
+}
+
+protocol Sub : Base {
+ func bar()
+}
+
+struct MyImpl :Sub {
+ func bar() {}
+ func foo() {}
+}
+
+// protocol witness for witnesses.Sub.bar() -> () in conformance witnesses.MyImpl : witnesses.Sub in witnesses
+// CHECK: sil private [transparent] [thunk] @$S9witnesses6MyImplVAA3SubA2aDP3baryyFTW : $@convention(witness_method: Sub) (@in_guaranteed MyImpl) -> ()
+// protocol witness for witnesses.Base.foo() -> () in conformance witnesses.MyImpl : witnesses.Base in witnesses
+// CHECK: sil private [transparent] [thunk] @$S9witnesses6MyImplVAA4BaseA2aDP3fooyyFTW : $@convention(witness_method: Base) (@in_guaranteed MyImpl) -> ()