@@ -185,27 +185,17 @@ private func getOrCreateSpecializedFunction(basedOn callSite: CallSite, _ contex
185
185
let applySiteCallee = callSite. applyCallee
186
186
let specializedParameters = applySiteCallee. convention. getSpecializedParameters ( basedOn: callSite)
187
187
188
- let createFn = { ( functionPassContext: FunctionPassContext ) in
189
- specializedFunctionName. _withBridgedStringRef { nameRef in
190
- let bridgedParamInfos = specializedParameters. map { $0. _bridged }
191
-
192
- return bridgedParamInfos. withUnsafeBufferPointer { paramBuf in
193
- functionPassContext
194
- . _bridged
195
- . ClosureSpecializer_createEmptyFunctionWithSpecializedSignature ( nameRef, paramBuf. baseAddress, paramBuf. count,
196
- applySiteCallee. bridged,
197
- applySiteCallee. isSerialized)
198
- . function
199
- }
200
- }
201
- }
188
+ let specializedFunction =
189
+ context. createFunctionForClosureSpecialization ( from: applySiteCallee, withName: specializedFunctionName,
190
+ withParams: specializedParameters,
191
+ withSerialization: applySiteCallee. isSerialized)
202
192
203
- let buildFn = { ( emptySpecializedFunction, functionPassContext) in
204
- let closureSpecCloner = SpecializationCloner ( emptySpecializedFunction: emptySpecializedFunction, functionPassContext)
205
- closureSpecCloner. cloneAndSpecializeFunctionBody ( using: callSite)
206
- }
193
+ context. buildSpecializedFunction ( specializedFunction: specializedFunction,
194
+ buildFn: { ( emptySpecializedFunction, functionPassContext) in
195
+ let closureSpecCloner = SpecializationCloner ( emptySpecializedFunction: emptySpecializedFunction, functionPassContext)
196
+ closureSpecCloner. cloneAndSpecializeFunctionBody ( using: callSite)
197
+ } )
207
198
208
- let specializedFunction = context. createAndBuildSpecializedFunction ( createFn: createFn, buildFn: buildFn)
209
199
return ( specializedFunction, false )
210
200
}
211
201
@@ -479,7 +469,6 @@ private func handleApplies(for rootClosure: SingleValueInstruction, callSiteMap:
479
469
continue
480
470
}
481
471
482
- // Mark the converted/reabstracted closures as used.
483
472
if haveUsedReabstraction {
484
473
markConvertedAndReabstractedClosuresAsUsed ( rootClosure: rootClosure, convertedAndReabstractedClosure: use. value,
485
474
convertedAndReabstractedClosures: & convertedAndReabstractedClosures)
@@ -589,7 +578,7 @@ private extension SpecializationCloner {
589
578
590
579
let ( allSpecializedEntryBlockArgs, closureArgIndexToAllClonedReleasableClosures) = cloneAllClosures ( at: callSite)
591
580
592
- self . cloneFunctionBody ( from: callSite. applyCallee, entryBlockArgs : allSpecializedEntryBlockArgs)
581
+ self . cloneFunctionBody ( from: callSite. applyCallee, entryBlockArguments : allSpecializedEntryBlockArgs)
593
582
594
583
self . insertCleanupCodeForClonedReleasableClosures (
595
584
from: callSite, closureArgIndexToAllClonedReleasableClosures: closureArgIndexToAllClonedReleasableClosures)
@@ -672,9 +661,7 @@ private extension SpecializationCloner {
672
661
673
662
let ( finalClonedReabstractedClosure, releasableClonedReabstractedClosures) =
674
663
builder. cloneRootClosureReabstractions ( rootClosure: closureArgDesc. closure, clonedRootClosure: clonedRootClosure,
675
- reabstractedClosure: callSite
676
- . appliedArgForClosure (
677
- at: closureArgDesc. closureArgIndex) !,
664
+ reabstractedClosure: callSite. appliedArgForClosure ( at: closureArgDesc. closureArgIndex) !,
678
665
origToClonedValueMap: origToClonedValueMap,
679
666
self . context)
680
667
@@ -715,7 +702,7 @@ private extension SpecializationCloner {
715
702
// Insert a `destroy_value`, for all releasable closures, in all reachable exit BBs if the closure was passed as a
716
703
// guaranteed parameter or its type was noescape+thick. This is b/c the closure was passed at +0 originally and we
717
704
// need to balance the initial increment of the newly created closure(s).
718
- if closureArgDesc. isClosureGuaranteed || closureArgDesc. isClosureTrivialNoEscape ,
705
+ if closureArgDesc. isClosureGuaranteed || closureArgDesc. parameterInfo . isTrivialNoescapeClosure ,
719
706
!allClonedReleasableClosures. isEmpty
720
707
{
721
708
for exitBlock in closureArgDesc. reachableExitBBs {
@@ -745,10 +732,10 @@ private extension SpecializationCloner {
745
732
private extension [ HashableValue : Value ] {
746
733
subscript( key: Value ) -> Value ? {
747
734
get {
748
- self [ HashableValue ( key) ]
735
+ self [ key. hashable ]
749
736
}
750
737
set {
751
- self [ HashableValue ( key) ] = newValue
738
+ self [ key. hashable ] = newValue
752
739
}
753
740
}
754
741
}
@@ -760,8 +747,8 @@ private extension Builder {
760
747
let function = self . createFunctionRef ( closureArgDesc. callee)
761
748
762
749
if let pai = closureArgDesc. closure as? PartialApplyInst {
763
- return self . createPartialApply ( forFunction : function, substitutionMap: SubstitutionMap ( ) ,
764
- capturedArgs : capturedArgs, calleeConvention: pai. calleeConvention,
750
+ return self . createPartialApply ( function : function, substitutionMap: SubstitutionMap ( ) ,
751
+ capturedArguments : capturedArgs, calleeConvention: pai. calleeConvention,
765
752
hasUnknownResultIsolation: pai. hasUnknownResultIsolation,
766
753
isOnStack: pai. isOnStack)
767
754
} else {
@@ -806,8 +793,8 @@ private extension Builder {
806
793
}
807
794
808
795
let fri = self . createFunctionRef ( function)
809
- let reabstracted = self . createPartialApply ( forFunction : fri, substitutionMap: SubstitutionMap ( ) ,
810
- capturedArgs : [ toBeReabstracted] ,
796
+ let reabstracted = self . createPartialApply ( function : fri, substitutionMap: SubstitutionMap ( ) ,
797
+ capturedArguments : [ toBeReabstracted] ,
811
798
calleeConvention: pai. calleeConvention,
812
799
hasUnknownResultIsolation: pai. hasUnknownResultIsolation,
813
800
isOnStack: pai. isOnStack)
@@ -895,7 +882,7 @@ private extension FunctionConvention {
895
882
private extension ParameterInfo {
896
883
func withSpecializedConvention( isArgTypeTrivial: Bool ) -> Self {
897
884
let specializedParamConvention =
898
- if self . hasAllowedIndirectConvForClosureSpec {
885
+ if self . convention . isAllowedIndirectConvForClosureSpec {
899
886
self . convention
900
887
} else {
901
888
isArgTypeTrivial ? ArgumentConvention . directUnowned : ArgumentConvention . directOwned
@@ -905,13 +892,8 @@ private extension ParameterInfo {
905
892
hasLoweredAddresses: self . hasLoweredAddresses)
906
893
}
907
894
908
- var hasAllowedIndirectConvForClosureSpec : Bool {
909
- switch convention {
910
- case . indirectInout, . indirectInoutAliasable:
911
- return true
912
- default :
913
- return false
914
- }
895
+ var isTrivialNoescapeClosure : Bool {
896
+ self . type. SILFunctionType_isTrivialNoescape ( )
915
897
}
916
898
}
917
899
@@ -995,21 +977,6 @@ private extension Function {
995
977
}
996
978
997
979
// ===================== Utility Types ===================== //
998
- private enum HashableValue : Hashable {
999
- case Argument( FunctionArgument )
1000
- case Instruction( SingleValueInstruction )
1001
-
1002
- init ( _ value: Value ) {
1003
- if let instr = value as? SingleValueInstruction {
1004
- self = . Instruction( instr)
1005
- } else if let arg = value as? FunctionArgument {
1006
- self = . Argument( arg)
1007
- } else {
1008
- fatalError ( " Invalid hashable value: \( value) " )
1009
- }
1010
- }
1011
- }
1012
-
1013
980
private struct OrderedDict < Key: Hashable , Value> {
1014
981
private var valueIndexDict : [ Key : Int ] = [ : ]
1015
982
private var entryList : [ ( Key , Value ) ] = [ ]
@@ -1077,10 +1044,6 @@ private struct ClosureArgDescriptor {
1077
1044
closureInfo. closure
1078
1045
}
1079
1046
1080
- var isPartialApply : Bool {
1081
- closure is PartialApplyInst
1082
- }
1083
-
1084
1047
var isPartialApplyOnStack : Bool {
1085
1048
if let pai = closure as? PartialApplyInst {
1086
1049
return pai. isOnStack
@@ -1116,7 +1079,7 @@ private struct ClosureArgDescriptor {
1116
1079
}
1117
1080
}
1118
1081
1119
- var arguments : ( some Sequence < Value > ) ? {
1082
+ var arguments : LazyMapSequence < OperandArray , Value > ? {
1120
1083
if let pai = closure as? PartialApplyInst {
1121
1084
return pai. arguments
1122
1085
}
@@ -1131,14 +1094,6 @@ private struct ClosureArgDescriptor {
1131
1094
closureParamInfo. convention. isConsumed
1132
1095
}
1133
1096
1134
- var isClosureTrivialNoEscape : Bool {
1135
- closureParamInfo. type. SILFunctionType_isTrivialNoescape ( )
1136
- }
1137
-
1138
- var parentFunction : Function {
1139
- closure. parentFunction
1140
- }
1141
-
1142
1097
var reachableExitBBs : [ BasicBlock ] {
1143
1098
closure. parentFunction. blocks. filter { $0. isReachableExitBlock }
1144
1099
}
@@ -1161,14 +1116,6 @@ private struct CallSite {
1161
1116
applySite. referencedFunction!
1162
1117
}
1163
1118
1164
- var isCalleeSerialized : Bool {
1165
- applyCallee. isSerialized
1166
- }
1167
-
1168
- var firstClosureArgDesc : ClosureArgDescriptor ? {
1169
- closureArgDescriptors. first
1170
- }
1171
-
1172
1119
func hasClosureArg( at index: Int ) -> Bool {
1173
1120
closureArgDescriptors. contains { $0. closureArgumentIndex == index }
1174
1121
}
@@ -1177,10 +1124,6 @@ private struct CallSite {
1177
1124
closureArgDescriptors. first { $0. closureArgumentIndex == index }
1178
1125
}
1179
1126
1180
- func closureArg( at index: Int ) -> SingleValueInstruction ? {
1181
- closureArgDesc ( at: index) ? . closure
1182
- }
1183
-
1184
1127
func appliedArgForClosure( at index: Int ) -> Value ? {
1185
1128
if let closureArgDesc = closureArgDesc ( at: index) {
1186
1129
return applySite. arguments [ closureArgDesc. closureArgIndex - applySite. unappliedArgumentCount]
@@ -1189,14 +1132,6 @@ private struct CallSite {
1189
1132
return nil
1190
1133
}
1191
1134
1192
- func closureCallee( at index: Int ) -> Function ? {
1193
- closureArgDesc ( at: index) ? . callee
1194
- }
1195
-
1196
- func closureLoc( at index: Int ) -> Location ? {
1197
- closureArgDesc ( at: index) ? . location
1198
- }
1199
-
1200
1135
func specializedCalleeName( _ context: FunctionPassContext ) -> String {
1201
1136
let closureArgs = Array ( self . closureArgDescriptors. map { $0. closure } )
1202
1137
let closureIndices = Array ( self . closureArgDescriptors. map { $0. closureArgIndex } )
0 commit comments