@@ -105,3 +105,159 @@ bb7(%64 : $Optional<Data>):
105105 %102 = tuple ()
106106 return %102 : $()
107107}
108+
109+ sil @$sSS10FoundationE19_bridgeToObjectiveCSo8NSStringCyF : $@convention(method) (@guaranteed String) -> @owned NSString
110+ sil @$sSS21_builtinStringLiteral17utf8CodeUnitCount7isASCIISSBp_BwBi1_tcfC : $@convention(method) (Builtin.RawPointer, Builtin.Word, Builtin.Int1, @thin String.Type) -> @owned String
111+ sil @get : $@convention(thin) () -> @owned String
112+
113+ @objc class Ty {
114+ @objc static func take2(_: String?, _: String?)
115+ @objc static func take3(_: String?, _: String?, _: String?)
116+ }
117+
118+ // CHECK-LABEL: sil [Osize] [ossa] @reuse_owned_2 : {{.*}} {
119+ // CHECK: [[NATIVE:%[^,]+]] = apply {{%[^,]+}}()
120+ // CHECK: [[TY:%[^,]+]] = metatype
121+ // CHECK: [[OUTLINED:%[^,]+]] = function_ref @$s4main2TyC5take2yySSSg_AEtFZToTembgbgnn_
122+ // CHECK: apply [[OUTLINED]]([[NATIVE]], [[NATIVE]], [[TY]])
123+ // CHECK: destroy_value [[NATIVE]] : $String
124+ // CHECK-LABEL: } // end sil function 'reuse_owned_2'
125+ sil [ossa] [Osize] @reuse_owned_2 : $@convention(thin) () -> () {
126+ bb0:
127+ %get = function_ref @get : $@convention(thin) () -> @owned String
128+ %native = apply %get() : $@convention(thin) () -> @owned String
129+ %ty = metatype $@objc_metatype Ty.Type
130+ %bridge = function_ref @$sSS10FoundationE19_bridgeToObjectiveCSo8NSStringCyF : $@convention(method) (@guaranteed String) -> @owned NSString
131+ %bridged1 = apply %bridge(%native) : $@convention(method) (@guaranteed String) -> @owned NSString
132+ %optbridged1 = enum $Optional<NSString>, #Optional.some!enumelt, %bridged1 : $NSString
133+ %bridge2 = function_ref @$sSS10FoundationE19_bridgeToObjectiveCSo8NSStringCyF : $@convention(method) (@guaranteed String) -> @owned NSString
134+ %bridged2 = apply %bridge2(%native) : $@convention(method) (@guaranteed String) -> @owned NSString
135+ %optbridged2 = enum $Optional<NSString>, #Optional.some!enumelt, %bridged2 : $NSString
136+ destroy_value %native : $String
137+ %take2 = objc_method %ty : $@objc_metatype Ty.Type, #Ty.take2!foreign : (Ty.Type) -> (String?, String?) -> (), $@convention(objc_method) (Optional<NSString>, Optional<NSString>, @objc_metatype Ty.Type) -> ()
138+ %27 = apply %take2(%optbridged1, %optbridged2, %ty) : $@convention(objc_method) (Optional<NSString>, Optional<NSString>, @objc_metatype Ty.Type) -> ()
139+ destroy_value %optbridged2 : $Optional<NSString>
140+ destroy_value %optbridged1 : $Optional<NSString>
141+ %31 = tuple ()
142+ return %31 : $()
143+ }
144+
145+ // CHECK-LABEL: sil [Osize] [ossa] @reuse_owned_3 : {{.*}} {
146+ // CHECK: [[NATIVE:%[^,]+]] = apply {{%[^,]+}}()
147+ // CHECK: [[TY:%[^,]+]] = metatype
148+ // CHECK: [[OUTLINED:%[^,]+]] = function_ref @$s4main2TyC5take3yySSSg_A2EtFZToTembgbgbgnn_
149+ // CHECK: apply [[OUTLINED]]([[NATIVE]], [[NATIVE]], [[NATIVE]], [[TY]])
150+ // CHECK: destroy_value [[NATIVE]] : $String
151+ // CHECK-LABEL: } // end sil function 'reuse_owned_3'
152+ sil [ossa] [Osize] @reuse_owned_3 : $@convention(thin) () -> () {
153+ bb0:
154+ %get = function_ref @get : $@convention(thin) () -> @owned String
155+ %native = apply %get() : $@convention(thin) () -> @owned String
156+ %ty = metatype $@objc_metatype Ty.Type
157+ %bridge = function_ref @$sSS10FoundationE19_bridgeToObjectiveCSo8NSStringCyF : $@convention(method) (@guaranteed String) -> @owned NSString
158+ %bridged1 = apply %bridge(%native) : $@convention(method) (@guaranteed String) -> @owned NSString
159+ %optbridged1 = enum $Optional<NSString>, #Optional.some!enumelt, %bridged1 : $NSString
160+ %bridge2 = function_ref @$sSS10FoundationE19_bridgeToObjectiveCSo8NSStringCyF : $@convention(method) (@guaranteed String) -> @owned NSString
161+ %bridged2 = apply %bridge2(%native) : $@convention(method) (@guaranteed String) -> @owned NSString
162+ %optbridged2 = enum $Optional<NSString>, #Optional.some!enumelt, %bridged2 : $NSString
163+ %bridge3 = function_ref @$sSS10FoundationE19_bridgeToObjectiveCSo8NSStringCyF : $@convention(method) (@guaranteed String) -> @owned NSString
164+ %bridged3 = apply %bridge3(%native) : $@convention(method) (@guaranteed String) -> @owned NSString
165+ %optbridged3 = enum $Optional<NSString>, #Optional.some!enumelt, %bridged3 : $NSString
166+ destroy_value %native : $String
167+ %take2 = objc_method %ty : $@objc_metatype Ty.Type, #Ty.take3!foreign : (Ty.Type) -> (String?, String?, String?) -> (), $@convention(objc_method) (Optional<NSString>, Optional<NSString>, Optional<NSString>, @objc_metatype Ty.Type) -> ()
168+ %27 = apply %take2(%optbridged1, %optbridged2, %optbridged3, %ty) : $@convention(objc_method) (Optional<NSString>, Optional<NSString>, Optional<NSString>, @objc_metatype Ty.Type) -> ()
169+ destroy_value %optbridged3 : $Optional<NSString>
170+ destroy_value %optbridged2 : $Optional<NSString>
171+ destroy_value %optbridged1 : $Optional<NSString>
172+ %31 = tuple ()
173+ return %31 : $()
174+ }
175+
176+ // CHECK-LABEL: sil [Osize] [ossa] @reuse_guaranteed_2 : {{.*}} {
177+ // CHECK: bb0([[NATIVE:%[^,]+]] :
178+ // CHECK: [[TY:%[^,]+]] = metatype
179+ // CHECK: [[OUTLINED:%[^,]+]] = function_ref @$s4main2TyC5take2yySSSg_AEtFZToTembgbgnn_
180+ // CHECK: apply [[OUTLINED]]([[NATIVE]], [[NATIVE]], [[TY]])
181+ // CHECK-LABEL: } // end sil function 'reuse_guaranteed_2'
182+ sil [ossa] [Osize] @reuse_guaranteed_2 : $@convention(thin) (@guaranteed String) -> () {
183+ bb0(%native : @guaranteed $String):
184+ %ty = metatype $@objc_metatype Ty.Type
185+ %bridge = function_ref @$sSS10FoundationE19_bridgeToObjectiveCSo8NSStringCyF : $@convention(method) (@guaranteed String) -> @owned NSString
186+ %bridged1 = apply %bridge(%native) : $@convention(method) (@guaranteed String) -> @owned NSString
187+ %optbridged1 = enum $Optional<NSString>, #Optional.some!enumelt, %bridged1 : $NSString
188+ %bridge2 = function_ref @$sSS10FoundationE19_bridgeToObjectiveCSo8NSStringCyF : $@convention(method) (@guaranteed String) -> @owned NSString
189+ %bridged2 = apply %bridge2(%native) : $@convention(method) (@guaranteed String) -> @owned NSString
190+ %optbridged2 = enum $Optional<NSString>, #Optional.some!enumelt, %bridged2 : $NSString
191+ %take2 = objc_method %ty : $@objc_metatype Ty.Type, #Ty.take2!foreign : (Ty.Type) -> (String?, String?) -> (), $@convention(objc_method) (Optional<NSString>, Optional<NSString>, @objc_metatype Ty.Type) -> ()
192+ %27 = apply %take2(%optbridged1, %optbridged2, %ty) : $@convention(objc_method) (Optional<NSString>, Optional<NSString>, @objc_metatype Ty.Type) -> ()
193+ destroy_value %optbridged2 : $Optional<NSString>
194+ destroy_value %optbridged1 : $Optional<NSString>
195+ %31 = tuple ()
196+ return %31 : $()
197+ }
198+
199+ // CHECK-LABEL: sil [Osize] [ossa] @reuse_guaranteed_3 : {{.*}} {
200+ // CHECK: bb0([[NATIVE:%[^,]+]] :
201+ // CHECK: [[TY:%[^,]+]] = metatype
202+ // CHECK: [[OUTLINED:%[^,]+]] = function_ref @$s4main2TyC5take3yySSSg_A2EtFZToTembgbgbgnn_
203+ // CHECK: apply [[OUTLINED]]([[NATIVE]], [[NATIVE]], [[NATIVE]], [[TY]])
204+ // CHECK-LABEL: } // end sil function 'reuse_guaranteed_3'
205+ sil [ossa] [Osize] @reuse_guaranteed_3 : $@convention(thin) (@guaranteed String) -> () {
206+ bb0(%native : @guaranteed $String):
207+ %ty = metatype $@objc_metatype Ty.Type
208+ %bridge = function_ref @$sSS10FoundationE19_bridgeToObjectiveCSo8NSStringCyF : $@convention(method) (@guaranteed String) -> @owned NSString
209+ %bridged1 = apply %bridge(%native) : $@convention(method) (@guaranteed String) -> @owned NSString
210+ %optbridged1 = enum $Optional<NSString>, #Optional.some!enumelt, %bridged1 : $NSString
211+ %bridge2 = function_ref @$sSS10FoundationE19_bridgeToObjectiveCSo8NSStringCyF : $@convention(method) (@guaranteed String) -> @owned NSString
212+ %bridged2 = apply %bridge2(%native) : $@convention(method) (@guaranteed String) -> @owned NSString
213+ %optbridged2 = enum $Optional<NSString>, #Optional.some!enumelt, %bridged2 : $NSString
214+ %bridge3 = function_ref @$sSS10FoundationE19_bridgeToObjectiveCSo8NSStringCyF : $@convention(method) (@guaranteed String) -> @owned NSString
215+ %bridged3 = apply %bridge3(%native) : $@convention(method) (@guaranteed String) -> @owned NSString
216+ %optbridged3 = enum $Optional<NSString>, #Optional.some!enumelt, %bridged3 : $NSString
217+ %take2 = objc_method %ty : $@objc_metatype Ty.Type, #Ty.take3!foreign : (Ty.Type) -> (String?, String?, String?) -> (), $@convention(objc_method) (Optional<NSString>, Optional<NSString>, Optional<NSString>, @objc_metatype Ty.Type) -> ()
218+ %27 = apply %take2(%optbridged1, %optbridged2, %optbridged3, %ty) : $@convention(objc_method) (Optional<NSString>, Optional<NSString>, Optional<NSString>, @objc_metatype Ty.Type) -> ()
219+ destroy_value %optbridged3 : $Optional<NSString>
220+ destroy_value %optbridged2 : $Optional<NSString>
221+ destroy_value %optbridged1 : $Optional<NSString>
222+ %31 = tuple ()
223+ return %31 : $()
224+ }
225+
226+ // CHECK-LABEL: sil shared [serialized] [noinline] [ossa] @$s4main2TyC5take2yySSSg_AEtFZToTembgbgnn_ : {{.*}} {
227+ // CHECK: bb0([[FIRST:%[^,]+]] : @guaranteed
228+ // CHECK-SAME: , [[SECOND:%[^,]+]] : @guaranteed
229+ // CHECK-SAME: , [[TY:%[^,]+]] : $@objc_metatype
230+ // CHECK-SAME: ):
231+ // CHECK: [[CALLEE:%[^,]+]] = objc_method [[TY]]
232+ // CHECK: [[BRIDGE_1:%[^,]+]] = function_ref @$sSS10FoundationE19_bridgeToObjectiveCSo8NSStringCyF
233+ // CHECK: [[BRIDGED_1:%[^,]+]] = apply [[BRIDGE_1]]([[FIRST]])
234+ // CHECK: [[OPT_BRIDGED_1:%[^,]+]] = enum $Optional<NSString>, #Optional.some!enumelt, [[BRIDGED_1]]
235+ // CHECK: [[BRIDGE_2:%[^,]+]] = function_ref @$sSS10FoundationE19_bridgeToObjectiveCSo8NSStringCyF
236+ // CHECK: [[BRIDGED_2:%[^,]+]] = apply [[BRIDGE_2]]([[SECOND]])
237+ // CHECK: [[OPT_BRIDGED_2:%[^,]+]] = enum $Optional<NSString>, #Optional.some!enumelt, [[BRIDGED_2]]
238+ // CHECK: apply [[CALLEE]]([[OPT_BRIDGED_1]], [[OPT_BRIDGED_2]], [[TY]])
239+ // CHECK: destroy_value [[OPT_BRIDGED_2]]
240+ // CHECK: destroy_value [[OPT_BRIDGED_1]]
241+ // CHECK-LABEL: } // end sil function '$s4main2TyC5take2yySSSg_AEtFZToTembgbgnn_'
242+
243+ // CHECK-LABEL: sil shared [serialized] [noinline] [ossa] @$s4main2TyC5take3yySSSg_A2EtFZToTembgbgbgnn_ : {{.*}} {
244+ // CHECK: bb0([[FIRST:%[^,]+]] : @guaranteed
245+ // CHECK-SAME: , [[SECOND:%[^,]+]] : @guaranteed
246+ // CHECK-SAME: , [[THIRD:%[^,]+]] : @guaranteed
247+ // CHECK-SAME: , [[TY:%[^,]+]] : $@objc_metatype
248+ // CHECK-SAME: ):
249+ // CHECK: [[CALLEE:%[^,]+]] = objc_method [[TY]]
250+ // CHECK: [[BRIDGE_1:%[^,]+]] = function_ref @$sSS10FoundationE19_bridgeToObjectiveCSo8NSStringCyF
251+ // CHECK: [[BRIDGED_1:%[^,]+]] = apply [[BRIDGE_1]]([[FIRST]])
252+ // CHECK: [[OPT_BRIDGED_1:%[^,]+]] = enum $Optional<NSString>, #Optional.some!enumelt, [[BRIDGED_1]]
253+ // CHECK: [[BRIDGE_2:%[^,]+]] = function_ref @$sSS10FoundationE19_bridgeToObjectiveCSo8NSStringCyF
254+ // CHECK: [[BRIDGED_2:%[^,]+]] = apply [[BRIDGE_2]]([[SECOND]])
255+ // CHECK: [[OPT_BRIDGED_2:%[^,]+]] = enum $Optional<NSString>, #Optional.some!enumelt, [[BRIDGED_2]]
256+ // CHECK: [[BRIDGE_3:%[^,]+]] = function_ref @$sSS10FoundationE19_bridgeToObjectiveCSo8NSStringCyF
257+ // CHECK: [[BRIDGED_3:%[^,]+]] = apply [[BRIDGE_3]]([[THIRD]])
258+ // CHECK: [[OPT_BRIDGED_3:%[^,]+]] = enum $Optional<NSString>, #Optional.some!enumelt, [[BRIDGED_3]]
259+ // CHECK: apply [[CALLEE]]([[OPT_BRIDGED_1]], [[OPT_BRIDGED_2]], [[OPT_BRIDGED_3]], [[TY]])
260+ // CHECK: destroy_value [[OPT_BRIDGED_3]]
261+ // CHECK: destroy_value [[OPT_BRIDGED_2]]
262+ // CHECK: destroy_value [[OPT_BRIDGED_1]]
263+ // CHECK-LABEL: } // end sil function '$s4main2TyC5take3yySSSg_A2EtFZToTembgbgbgnn_'
0 commit comments