@@ -10,6 +10,10 @@ import Builtin
10
10
import Swift
11
11
import _Concurrency
12
12
13
+ struct Pair<T> {
14
+ var value: (T, T)
15
+ }
16
+
13
17
// CHECK-LABEL: define hidden swift{{(tail)?}}cc void @get_task(ptr swiftasync %0)
14
18
sil hidden [ossa] @get_task : $@async @convention(thin) () -> @owned Builtin.NativeObject {
15
19
bb0:
@@ -241,6 +245,33 @@ bb0(%0 : @owned $Error, %1 : $Builtin.RawUnsafeContinuation):
241
245
return %21 : $()
242
246
}
243
247
248
+ // CHECK-LABEL: define {{.*}} void @async_let_generic(
249
+ sil public @async_let_generic : $@convention(thin) @async <T> () -> @out Pair<T> {
250
+ bb0(%out : $*Pair<T>):
251
+ %1 = function_ref @async_let_generic_helper : $@convention(thin) @Sendable @async <τ_0_0> () -> (@out Pair<τ_0_0>, @error any Error)
252
+ %2 = thin_to_thick_function %1 to $@Sendable @async <τ_0_0> () -> (@out Pair<τ_0_0>, @error any Error)
253
+ %fn = convert_function %2 to $@async @callee_guaranteed @substituted <τ_0_0> () -> (@out τ_0_0, @error any Error) for <Pair<T>>
254
+ %outPtr = address_to_pointer %out to $Builtin.RawPointer
255
+ %scratch = enum $Optional<Builtin.RawPointer>, #Optional.none!enumelt
256
+
257
+ // We've set up a function that has no reason to request type metadata
258
+ // for Pair<T> except to pass it to swift_asyncLet_begin. Make sure that we
259
+ // request complete metadata.
260
+
261
+ // CHECK: [[T0:%.*]] = call swiftcc %swift.metadata_response @"$s8builtins4PairVMa"([[INT]] 0, ptr %T)
262
+ // CHECK-NEXT: [[METADATA:%.*]] = extractvalue %swift.metadata_response [[T0]], 0
263
+ // CHECK-NEXT: call swiftcc void @swift_asyncLet_begin({{.*}}, ptr [[METADATA]], {{.*}})
264
+ %asyncLet = builtin "startAsyncLetWithLocalBuffer"<Pair<T>>(%scratch, %fn, %outPtr) : $Builtin.RawPointer
265
+ %t1 = builtin "endAsyncLetLifetime"(%asyncLet, %fn) : $()
266
+ %result = tuple ()
267
+ return %result
268
+ }
269
+
270
+ sil private @async_let_generic_helper : $@convention(thin) @Sendable @async <T> () -> (@out Pair<T>, @error any Error) {
271
+ bb0(%out : $*Pair<T>):
272
+ unreachable
273
+ }
274
+
244
275
// CHECK-LABEL: define hidden swift{{(tail)?}}cc void @task_group_create_destroy
245
276
sil hidden [ossa] @task_group_create_destroy : $@async () -> () {
246
277
bb0:
@@ -258,6 +289,31 @@ bb0:
258
289
return %21 : $()
259
290
}
260
291
292
+ // CHECK-LABEL: define hidden swift{{(tail)?}}cc void @task_group_create_destroy_generic
293
+ sil hidden [ossa] @task_group_create_destroy_generic : $@async <T> () -> () {
294
+ bb0:
295
+ // CHECK: [[TASKGROUP:%.*]] = alloca [32 x ptr], align 16
296
+ // CHECK: call void @llvm.lifetime.start.p0(i64 -1, ptr [[TASKGROUP]])
297
+
298
+ // We've set up a function that has no reason to request type metadata
299
+ // for Pair<T> except to pass it to swift_taskGroup_initialize. Make sure
300
+ // that we request complete metadata.
301
+
302
+ // CHECK: [[T0:%.*]] = call swiftcc %swift.metadata_response @"$s8builtins4PairVMa"([[INT]] 0, ptr %T)
303
+ // CHECK-NEXT: [[METADATA:%.*]] = extractvalue %swift.metadata_response [[T0]], 0
304
+
305
+ // CHECK-NEXT: call swiftcc void @swift_taskGroup_initialize(ptr [[TASKGROUP]], ptr [[METADATA]])
306
+
307
+ %0 = metatype $@thin Pair<T>.Type
308
+ %1 = builtin "createTaskGroup"<Pair<T>>(%0: $@thin Pair<T>.Type) : $Builtin.RawPointer
309
+
310
+ // CHECK-NEXT: call swiftcc void @swift_taskGroup_destroy(ptr [[TASKGROUP]])
311
+ // CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 -1, ptr [[TASKGROUP]])
312
+ builtin "destroyTaskGroup"(%1 : $Builtin.RawPointer) : $()
313
+
314
+ %21 = tuple ()
315
+ return %21 : $()
316
+ }
261
317
262
318
// CHECK-LABEL: define{{.*}} swiftcc void @testRunInline(
263
319
// CHECK-SAME: ptr noalias sret(%swift.opaque) [[RESULT:%[^,]+]],
@@ -276,3 +332,25 @@ entry(%result : $*T, %closure : $@noescape @async @callee_guaranteed @substitute
276
332
%void = builtin "taskRunInline"<T>(%result : $*T, %closure : $@noescape @async @callee_guaranteed @substituted <τ_0_0> () -> @out τ_0_0 for <T>) : $()
277
333
return %void : $()
278
334
}
335
+
336
+ // CHECK-LABEL: define{{.*}} swiftcc void @testRunInlineGeneric(
337
+ // CHECK-SAME: ptr noalias sret(%swift.opaque) [[RESULT:%[^,]+]],
338
+ // CHECK-SAME: ptr [[CLOSURE:%[^,]+]],
339
+ // CHECK-SAME: ptr [[CLOSURE_CONTEXT:%[^,]+]],
340
+ // CHECK-SAME: ptr %T
341
+ // CHECK-SAME: {
342
+
343
+ // Make sure we request complete metadata.
344
+ // CHECK: [[T0:%.*]] = call swiftcc %swift.metadata_response @"$s8builtins4PairVMa"([[INT]] 0, ptr %T)
345
+ // CHECK-NEXT: [[FUTURE_RESULT_TYPE:%.*]] = extractvalue %swift.metadata_response [[T0]], 0
346
+ // CHECK: call swiftcc void @swift_task_run_inline(
347
+ // CHECK-SAME: ptr [[RESULT]],
348
+ // CHECK-SAME: ptr [[CLOSURE]],
349
+ // CHECK-SAME: ptr [[CLOSURE_CONTEXT]],
350
+ // CHECK-SAME: ptr [[FUTURE_RESULT_TYPE]])
351
+ // CHECK: }
352
+ sil hidden @testRunInlineGeneric : $@convention(thin) <T> (@noescape @async @callee_guaranteed @substituted <τ_0_0> () -> @out τ_0_0 for <Pair<T>>) -> @out T {
353
+ entry(%result : $*T, %closure : $@noescape @async @callee_guaranteed @substituted <τ_0_0> () -> @out τ_0_0 for <Pair<T>>):
354
+ %void = builtin "taskRunInline"<Pair<T>>(%result : $*T, %closure : $@noescape @async @callee_guaranteed @substituted <τ_0_0> () -> @out τ_0_0 for <Pair<T>>) : $()
355
+ return %void : $()
356
+ }
0 commit comments