Skip to content

Commit 8f284e5

Browse files
Merge pull request #19463 from aschwaighofer/fix_silfunctiontype_uniquing
SIL: Profile the witnesMethodConformance as part of the SILFunctionType
2 parents 15214b3 + 7ba31e3 commit 8f284e5

File tree

3 files changed

+32
-7
lines changed

3 files changed

+32
-7
lines changed

include/swift/AST/Types.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4088,7 +4088,8 @@ class SILFunctionType final : public TypeBase, public llvm::FoldingSetNode,
40884088
void Profile(llvm::FoldingSetNodeID &ID) {
40894089
Profile(ID, getGenericSignature(), getExtInfo(), getCoroutineKind(),
40904090
getCalleeConvention(), getParameters(), getYields(),
4091-
getResults(), getOptionalErrorResult());
4091+
getResults(), getOptionalErrorResult(),
4092+
getWitnessMethodConformanceOrNone());
40924093
}
40934094
static void Profile(llvm::FoldingSetNodeID &ID,
40944095
GenericSignature *genericSig,
@@ -4098,7 +4099,8 @@ class SILFunctionType final : public TypeBase, public llvm::FoldingSetNode,
40984099
ArrayRef<SILParameterInfo> params,
40994100
ArrayRef<SILYieldInfo> yields,
41004101
ArrayRef<SILResultInfo> results,
4101-
Optional<SILResultInfo> errorResult);
4102+
Optional<SILResultInfo> errorResult,
4103+
Optional<ProtocolConformanceRef> conformance);
41024104

41034105
// Implement isa/cast/dyncast/etc.
41044106
static bool classof(const TypeBase *T) {

lib/AST/ASTContext.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3891,7 +3891,8 @@ void SILFunctionType::Profile(llvm::FoldingSetNodeID &id,
38913891
ArrayRef<SILParameterInfo> params,
38923892
ArrayRef<SILYieldInfo> yields,
38933893
ArrayRef<SILResultInfo> results,
3894-
Optional<SILResultInfo> errorResult) {
3894+
Optional<SILResultInfo> errorResult,
3895+
Optional<ProtocolConformanceRef> conformance) {
38953896
id.AddPointer(genericParams);
38963897
id.AddInteger(info.getFuncAttrKey());
38973898
id.AddInteger(unsigned(coroutineKind));
@@ -3909,6 +3910,8 @@ void SILFunctionType::Profile(llvm::FoldingSetNodeID &id,
39093910
// Just allow the profile length to implicitly distinguish the
39103911
// presence of an error result.
39113912
if (errorResult) errorResult->profile(id);
3913+
if (conformance)
3914+
id.AddPointer(conformance->getRequirement());
39123915
}
39133916

39143917
SILFunctionType::SILFunctionType(GenericSignature *genericSig, ExtInfo ext,
@@ -4045,8 +4048,9 @@ CanSILFunctionType SILFunctionType::get(GenericSignature *genericSig,
40454048
assert(!ext.isPseudogeneric() || genericSig);
40464049

40474050
llvm::FoldingSetNodeID id;
4048-
SILFunctionType::Profile(id, genericSig, ext, coroutineKind, callee,
4049-
params, yields, normalResults, errorResult);
4051+
SILFunctionType::Profile(id, genericSig, ext, coroutineKind, callee, params,
4052+
yields, normalResults, errorResult,
4053+
witnessMethodConformance);
40504054

40514055
// Do we already have this generic function type?
40524056
void *insertPos;

test/SILGen/witnesses.swift

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,7 @@ protocol IUOFailableRequirement {
337337
struct NonFailableModel: FailableRequirement, NonFailableRefinement, IUOFailableRequirement {
338338
// CHECK-LABEL: sil private [transparent] [thunk] @$s9witnesses16NonFailableModelVAA0C11Requirement{{[_0-9a-zA-Z]*}}fCTW : $@convention(witness_method: FailableRequirement) (Int, @thick NonFailableModel.Type) -> @out Optional<NonFailableModel>
339339
// CHECK-LABEL: sil private [transparent] [thunk] @$s9witnesses16NonFailableModelVAA0bC10Refinement{{[_0-9a-zA-Z]*}}fCTW : $@convention(witness_method: NonFailableRefinement) (Int, @thick NonFailableModel.Type) -> @out NonFailableModel
340-
// CHECK-LABEL: sil private [transparent] [thunk] @$s9witnesses16NonFailableModelVAA22IUOFailableRequirement{{[_0-9a-zA-Z]*}}fCTW : $@convention(witness_method: FailableRequirement) (Int, @thick NonFailableModel.Type) -> @out Optional<NonFailableModel>
340+
// CHECK-LABEL: sil private [transparent] [thunk] @$s9witnesses16NonFailableModelVAA22IUOFailableRequirement{{[_0-9a-zA-Z]*}}fCTW : $@convention(witness_method: IUOFailableRequirement) (Int, @thick NonFailableModel.Type) -> @out Optional<NonFailableModel>
341341
init(foo: Int) {}
342342
}
343343

@@ -380,7 +380,7 @@ protocol IUOFailableClassRequirement: class {
380380
final class NonFailableClassModel: FailableClassRequirement, NonFailableClassRefinement, IUOFailableClassRequirement {
381381
// CHECK-LABEL: sil private [transparent] [thunk] @$s9witnesses21NonFailableClassModelCAA0cD11Requirement{{[_0-9a-zA-Z]*}}fCTW : $@convention(witness_method: FailableClassRequirement) (Int, @thick NonFailableClassModel.Type) -> @owned Optional<NonFailableClassModel>
382382
// CHECK-LABEL: sil private [transparent] [thunk] @$s9witnesses21NonFailableClassModelCAA0bcD10Refinement{{[_0-9a-zA-Z]*}}fCTW : $@convention(witness_method: NonFailableClassRefinement) (Int, @thick NonFailableClassModel.Type) -> @owned NonFailableClassModel
383-
// CHECK-LABEL: sil private [transparent] [thunk] @$s9witnesses21NonFailableClassModelCAA011IUOFailableD11Requirement{{[_0-9a-zA-Z]*}}fCTW : $@convention(witness_method: FailableClassRequirement) (Int, @thick NonFailableClassModel.Type) -> @owned Optional<NonFailableClassModel>
383+
// CHECK-LABEL: sil private [transparent] [thunk] @$s9witnesses21NonFailableClassModelCAA011IUOFailableD11Requirement{{[_0-9a-zA-Z]*}}fCTW : $@convention(witness_method: IUOFailableClassRequirement) (Int, @thick NonFailableClassModel.Type) -> @owned Optional<NonFailableClassModel>
384384
init(foo: Int) {}
385385
}
386386

@@ -559,3 +559,22 @@ protocol InoutFunctionReq {
559559
struct InoutFunction : InoutFunctionReq {
560560
func updateFunction(x: inout () -> ()) {}
561561
}
562+
563+
564+
protocol Base {
565+
func foo()
566+
}
567+
568+
protocol Sub : Base {
569+
func bar()
570+
}
571+
572+
struct MyImpl :Sub {
573+
func bar() {}
574+
func foo() {}
575+
}
576+
577+
// protocol witness for witnesses.Sub.bar() -> () in conformance witnesses.MyImpl : witnesses.Sub in witnesses
578+
// CHECK: sil private [transparent] [thunk] @$s9witnesses6MyImplVAA3SubA2aDP3baryyFTW : $@convention(witness_method: Sub) (@in_guaranteed MyImpl) -> ()
579+
// protocol witness for witnesses.Base.foo() -> () in conformance witnesses.MyImpl : witnesses.Base in witnesses
580+
// CHECK: sil private [transparent] [thunk] @$s9witnesses6MyImplVAA4BaseA2aDP3fooyyFTW : $@convention(witness_method: Base) (@in_guaranteed MyImpl) -> ()

0 commit comments

Comments
 (0)