mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
This attribute was introduced in 7eca38ce76d5d1915f4ab7e665964062c0b37697 (llvm-project). Match it using a wildcard regex, since it is not relevant to these tests. This is intended to reduce future conflicts with rebranch.
279 lines
20 KiB
Plaintext
279 lines
20 KiB
Plaintext
// RUN: %target-swift-frontend -enable-objc-interop -primary-file %s -emit-ir -sil-verify-all | %FileCheck %s -DINT=i%target-ptrsize --check-prefixes=CHECK,CHECK-objc,CHECK-%target-ptrsize
|
|
// RUN: %target-swift-frontend -disable-objc-interop -primary-file %s -emit-ir -sil-verify-all | %FileCheck %s -DINT=i%target-ptrsize --check-prefixes=CHECK,CHECK-native,CHECK-%target-ptrsize
|
|
|
|
// REQUIRES: concurrency, objc_codegen
|
|
// XFAIL: CPU=arm64e
|
|
|
|
sil_stage canonical
|
|
|
|
import Builtin
|
|
import Swift
|
|
import _Concurrency
|
|
|
|
// CHECK-LABEL: define hidden swift{{(tail)?}}cc void @get_task(ptr swiftasync %0)
|
|
sil hidden [ossa] @get_task : $@async @convention(thin) () -> @owned Builtin.NativeObject {
|
|
bb0:
|
|
// CHECK: [[TASK:%.*]] = call swiftcc ptr @swift_task_getCurrent()
|
|
%0 = builtin "getCurrentAsyncTask"() : $Builtin.NativeObject
|
|
// CHECK-NEXT: [[TASK_COPY:%.*]] = call ptr @swift_retain(ptr returned [[TASK]])
|
|
%1 = copy_value %0 : $Builtin.NativeObject
|
|
end_lifetime %0 : $Builtin.NativeObject
|
|
return %1 : $Builtin.NativeObject
|
|
}
|
|
|
|
// CHECK-LABEL: define hidden swift{{(tail)?}}cc void @cancel_task(ptr %0)
|
|
// CHECK: call swift{{(tail)?}}cc void @swift_task_cancel(ptr %0)
|
|
sil hidden [ossa] @cancel_task : $@convention(method) (@guaranteed Builtin.NativeObject) -> () {
|
|
bb0(%0 : @guaranteed $Builtin.NativeObject):
|
|
%4 = builtin "cancelAsyncTask"(%0 : $Builtin.NativeObject) : $()
|
|
%5 = tuple ()
|
|
return %5 : $()
|
|
}
|
|
|
|
// CHECK-LABEL: define hidden swift{{(tail)?}}cc void @launch_future
|
|
sil hidden [ossa] @launch_future : $@convention(method) <T> (Int, @owned @async @callee_guaranteed @substituted <τ_0_0> () -> (@out τ_0_0, @error Error) for <T>) -> () {
|
|
bb0(%flags : $Int, %taskFunction: @owned $@async @callee_guaranteed @substituted <τ_0_0> () -> (@out τ_0_0, @error Error) for <T>):
|
|
// CHECK-NOT: br i1
|
|
// CHECK: [[NEW_TASK_AND_CONTEXT:%.*]] = call swift{{(tail)?}}cc %swift.async_task_and_context @swift_task_create([[INT]] %0, ptr null, ptr %T, ptr %1, ptr %2)
|
|
%optSerialExecutor = enum $Optional<Builtin.Executor>, #Optional.none
|
|
%optTaskGroup = enum $Optional<Builtin.RawPointer>, #Optional.none
|
|
%optTaskExecutor = enum $Optional<Builtin.Executor>, #Optional.none
|
|
%optTaskExecutorOwned = enum $Optional<any TaskExecutor>, #Optional.none
|
|
%taskName = enum $Optional<Builtin.RawPointer>, #Optional.none
|
|
%20 = builtin "createAsyncTask"<T>(%flags : $Int, %optSerialExecutor : $Optional<Builtin.Executor>, %optTaskGroup : $Optional<Builtin.RawPointer>, %optTaskExecutor : $Optional<Builtin.Executor>, %optTaskExecutorOwned : $Optional<any TaskExecutor>, %taskName : $Optional<Builtin.RawPointer>, %taskFunction : $@async @callee_guaranteed @substituted <τ_0_0> () -> (@out τ_0_0, @error Error) for <T>) : $(Builtin.NativeObject, Builtin.RawPointer)
|
|
destroy_value %20 : $(Builtin.NativeObject, Builtin.RawPointer)
|
|
%21 = tuple ()
|
|
return %21 : $()
|
|
}
|
|
|
|
// CHECK-LABEL: define hidden swift{{(tail)?}}cc void @launch_future_on(
|
|
sil hidden [ossa] @launch_future_on : $@convention(method) <T> (Int, Builtin.Executor, @owned @async @callee_guaranteed @substituted <τ_0_0> () -> (@out τ_0_0, @error Error) for <T>) -> () {
|
|
bb0(%flags : $Int, %serialExecutor : $Builtin.Executor, %taskFunction: @owned $@async @callee_guaranteed @substituted <τ_0_0> () -> (@out τ_0_0, @error Error) for <T>):
|
|
// CHECK: [[EXECUTOR_RECORD:%.*]] = alloca %swift.serial_executor_task_option
|
|
// CHECK-NOT: br i1
|
|
// CHECK: [[BASE_GEP:%.*]] = getelementptr inbounds{{.*}} %swift.serial_executor_task_option, ptr [[EXECUTOR_RECORD]], i32 0, i32 0
|
|
// CHECK: [[FLAGS_GEP:%.*]] = getelementptr inbounds{{.*}} %swift.task_option, ptr [[BASE_GEP]], i32 0, i32 0
|
|
// CHECK: store [[INT]] 0, ptr [[FLAGS_GEP]], align
|
|
// CHECK: [[PARENT_GEP:%.*]] = getelementptr inbounds{{.*}} %swift.task_option, ptr [[BASE_GEP]], i32 0, i32 1
|
|
// CHECK: store ptr null, ptr [[PARENT_GEP]], align
|
|
// CHECK: [[EXECUTOR_GEP:%.*]] = getelementptr inbounds{{.*}} %swift.serial_executor_task_option, ptr [[EXECUTOR_RECORD]], i32 0, i32 1
|
|
// CHECK: [[EXECUTOR_IDENT_GEP:%.*]] = getelementptr inbounds{{.*}} %swift.executor, ptr [[EXECUTOR_GEP]], i32 0, i32 0
|
|
// CHECK: store [[INT]] %1, ptr [[EXECUTOR_IDENT_GEP]], align
|
|
// CHECK: [[EXECUTOR_IMPL_GEP:%.*]] = getelementptr inbounds{{.*}} %swift.executor, ptr [[EXECUTOR_GEP]], i32 0, i32 1
|
|
// CHECK: store [[INT]] %2, ptr [[EXECUTOR_IMPL_GEP]], align
|
|
// CHECK: [[NEW_TASK_AND_CONTEXT:%.*]] = call swift{{(tail)?}}cc %swift.async_task_and_context @swift_task_create([[INT]] %0, ptr [[EXECUTOR_RECORD]], ptr %T, ptr %3, ptr %4)
|
|
%optSerialExecutor = enum $Optional<Builtin.Executor>, #Optional.some, %serialExecutor : $Builtin.Executor
|
|
%optTaskGroup = enum $Optional<Builtin.RawPointer>, #Optional.none
|
|
%optTaskExecutor = enum $Optional<Builtin.Executor>, #Optional.none
|
|
%optTaskExecutorOwned = enum $Optional<any TaskExecutor>, #Optional.none
|
|
%taskName = enum $Optional<Builtin.RawPointer>, #Optional.none
|
|
%20 = builtin "createAsyncTask"<T>(%flags : $Int, %optSerialExecutor : $Optional<Builtin.Executor>, %optTaskGroup : $Optional<Builtin.RawPointer>, %optTaskExecutor : $Optional<Builtin.Executor>, %optTaskExecutorOwned : $Optional<any TaskExecutor>, %taskName : $Optional<Builtin.RawPointer>, %taskFunction : $@async @callee_guaranteed @substituted <τ_0_0> () -> (@out τ_0_0, @error Error) for <T>) : $(Builtin.NativeObject, Builtin.RawPointer)
|
|
destroy_value %20 : $(Builtin.NativeObject, Builtin.RawPointer)
|
|
%21 = tuple ()
|
|
return %21 : $()
|
|
}
|
|
|
|
// CHECK-LABEL: define hidden swift{{(tail)?}}cc void @launch_future_in_group
|
|
// CHECK: [[OPTIONS:%.*]] = alloca %swift.task_group_task_option
|
|
// CHECK-NOT: br i1
|
|
// CHECK: [[BASE_GEP:%.*]] = getelementptr inbounds{{.*}} %swift.task_group_task_option, ptr [[OPTIONS]], i32 0, i32 0
|
|
// CHECK: [[FLAGS_GEP:%.*]] = getelementptr inbounds{{.*}} %swift.task_option, ptr [[BASE_GEP]], i32 0, i32 0
|
|
// CHECK: store [[INT]] 1, ptr [[FLAGS_GEP]], align
|
|
// CHECK: [[PARENT_GEP:%.*]] = getelementptr inbounds{{.*}} %swift.task_option, ptr [[BASE_GEP]], i32 0, i32 1
|
|
// CHECK: store ptr null, ptr [[PARENT_GEP]], align
|
|
// CHECK: [[GROUP_GEP:%.*]] = getelementptr inbounds{{.*}} %swift.task_group_task_option, ptr [[OPTIONS]], i32 0, i32 1
|
|
// CHECK: store ptr %0, ptr [[GROUP_GEP]], align
|
|
// CHECK: call swiftcc %swift.async_task_and_context @swift_task_create([[INT]] %3, ptr [[OPTIONS]],
|
|
sil hidden @launch_future_in_group : $@convention(thin) (Builtin.RawPointer, @owned @async @callee_guaranteed @substituted <τ_0_0> () -> (@out τ_0_0, @error Error) for <Int>, Int) -> () {
|
|
bb0(%taskGroup : $Builtin.RawPointer, %taskFunction : $@async @callee_guaranteed @substituted <τ_0_0> () -> (@out τ_0_0, @error Error) for <Int>, %flags: $Int):
|
|
%optSerialExecutor = enum $Optional<Builtin.Executor>, #Optional.none
|
|
%optTaskGroup = enum $Optional<Builtin.RawPointer>, #Optional.some!enumelt, %taskGroup : $Builtin.RawPointer
|
|
%optTaskExecutor = enum $Optional<Builtin.Executor>, #Optional.none
|
|
%optTaskExecutorOwned = enum $Optional<any TaskExecutor>, #Optional.none
|
|
%taskName = enum $Optional<Builtin.RawPointer>, #Optional.none
|
|
%9 = builtin "createAsyncTask"<Int>(%flags : $Int, %optSerialExecutor : $Optional<Builtin.Executor>, %optTaskGroup : $Optional<Builtin.RawPointer>, %optTaskExecutor : $Optional<Builtin.Executor>, %optTaskExecutorOwned : $Optional<any TaskExecutor>, %taskName : $Optional<Builtin.RawPointer>, %taskFunction : $@async @callee_guaranteed @substituted <τ_0_0> () -> (@out τ_0_0, @error Error) for <Int>) : $(Builtin.NativeObject, Builtin.RawPointer)
|
|
%10 = tuple_extract %9 : $(Builtin.NativeObject, Builtin.RawPointer), 0
|
|
strong_release %10 : $Builtin.NativeObject
|
|
%12 = tuple ()
|
|
return %12 : $()
|
|
}
|
|
|
|
// CHECK-LABEL: define hidden swift{{(tail)?}}cc void @launch_future_opt_task_group
|
|
sil hidden [ossa] @launch_future_opt_task_group : $@convention(method) <T> (Int, Optional<Builtin.RawPointer>, @owned @async @callee_guaranteed @substituted <τ_0_0> () -> (@out τ_0_0, @error Error) for <T>) -> () {
|
|
bb0(%flags : $Int, %optTaskGroup : $Optional<Builtin.RawPointer>, %taskFunction: @owned $@async @callee_guaranteed @substituted <τ_0_0> () -> (@out τ_0_0, @error Error) for <T>):
|
|
// CHECK: [[OPTIONS:%.*]] = alloca %swift.task_group_task_option
|
|
// CHECK: [[GROUP_IS_NULL:%.*]] = icmp eq [[INT]] %1, 0
|
|
// CHECK: br i1 [[GROUP_IS_NULL]], label %task_group.cont, label %task_group.some
|
|
// CHECK: task_group.some:
|
|
// CHECK: [[GROUP:%.*]] = inttoptr [[INT]] %1 to ptr
|
|
// CHECK: [[BASE_GEP:%.*]] = getelementptr inbounds{{.*}} %swift.task_group_task_option, ptr [[OPTIONS]], i32 0, i32 0
|
|
// CHECK: [[FLAGS_GEP:%.*]] = getelementptr inbounds{{.*}} %swift.task_option, ptr [[BASE_GEP]], i32 0, i32 0
|
|
// CHECK: store [[INT]] 1, ptr [[FLAGS_GEP]], align
|
|
// CHECK: [[PARENT_GEP:%.*]] = getelementptr inbounds{{.*}} %swift.task_option, ptr [[BASE_GEP]], i32 0, i32 1
|
|
// CHECK: store ptr null, ptr [[PARENT_GEP]], align
|
|
// CHECK: [[GROUP_GEP:%.*]] = getelementptr inbounds{{.*}} %swift.task_group_task_option, ptr [[OPTIONS]], i32 0, i32 1
|
|
// CHECK: store ptr [[GROUP]], ptr [[GROUP_GEP]], align
|
|
// CHECK: br label %task_group.cont
|
|
// CHECK: task_group.cont:
|
|
// CHECK: phi ptr [ null, %entry ], [ [[OPTIONS]], %task_group.some ]
|
|
// CHECK: [[NEW_TASK_AND_CONTEXT:%.*]] = call swift{{(tail)?}}cc %swift.async_task_and_context @swift_task_create(
|
|
|
|
%optSerialExecutor = enum $Optional<Builtin.Executor>, #Optional.none
|
|
%optTaskExecutor = enum $Optional<Builtin.Executor>, #Optional.none
|
|
%optTaskExecutorOwned = enum $Optional<any TaskExecutor>, #Optional.none
|
|
%taskName = enum $Optional<Builtin.RawPointer>, #Optional.none
|
|
%20 = builtin "createAsyncTask"<T>(%flags : $Int, %optSerialExecutor : $Optional<Builtin.Executor>, %optTaskGroup : $Optional<Builtin.RawPointer>, %optTaskExecutor : $Optional<Builtin.Executor>, %optTaskExecutorOwned : $Optional<any TaskExecutor>, %taskName : $Optional<Builtin.RawPointer>, %taskFunction : $@async @callee_guaranteed @substituted <τ_0_0> () -> (@out τ_0_0, @error Error) for <T>) : $(Builtin.NativeObject, Builtin.RawPointer)
|
|
destroy_value %20 : $(Builtin.NativeObject, Builtin.RawPointer)
|
|
%result = tuple ()
|
|
return %result : $()
|
|
}
|
|
|
|
// CHECK-LABEL: define hidden swift{{(tail)?}}cc void @launch_discarding_future_in_group
|
|
sil hidden @launch_discarding_future_in_group : $@convention(thin) (Builtin.RawPointer, @owned @async @callee_guaranteed () -> @error Error, Int) -> () {
|
|
bb0(%taskGroup : $Builtin.RawPointer, %taskFunction : $@async @callee_guaranteed () -> @error Error, %flags: $Int):
|
|
%optSerialExecutor = enum $Optional<Builtin.Executor>, #Optional.none
|
|
%optTaskGroup = enum $Optional<Builtin.RawPointer>, #Optional.some!enumelt, %taskGroup : $Builtin.RawPointer
|
|
%optTaskExecutor = enum $Optional<Builtin.Executor>, #Optional.none
|
|
%optTaskExecutorOwned = enum $Optional<any TaskExecutor>, #Optional.none
|
|
%taskName = enum $Optional<Builtin.RawPointer>, #Optional.none
|
|
// CHECK-NOT: br i1
|
|
// CHECK: call swift{{(tail)?}}cc %swift.async_task_and_context @swift_task_create(
|
|
%9 = builtin "createAsyncTask"(%flags : $Int, %optSerialExecutor : $Optional<Builtin.Executor>, %optTaskGroup : $Optional<Builtin.RawPointer>, %optTaskExecutor : $Optional<Builtin.Executor>, %optTaskExecutorOwned : $Optional<any TaskExecutor>, %taskName : $Optional<Builtin.RawPointer>, %taskFunction : $@async @callee_guaranteed () -> @error Error) : $(Builtin.NativeObject, Builtin.RawPointer)
|
|
%10 = tuple_extract %9 : $(Builtin.NativeObject, Builtin.RawPointer), 0
|
|
strong_release %10 : $Builtin.NativeObject
|
|
%12 = tuple ()
|
|
return %12 : $()
|
|
}
|
|
|
|
// CHECK-LABEL: define hidden swift{{(tail)?}}cc void @launch_discarding_future_in_group_with_executor
|
|
sil hidden @launch_discarding_future_in_group_with_executor : $@convention(thin) (Builtin.RawPointer, Builtin.Executor, @owned @async @callee_guaranteed () -> @error Error, Int) -> () {
|
|
bb0(%taskGroup : $Builtin.RawPointer, %taskExecutor : $Builtin.Executor, %taskFunction : $@async @callee_guaranteed () -> @error Error, %flags: $Int):
|
|
%optSerialExecutor = enum $Optional<Builtin.Executor>, #Optional.none
|
|
%optTaskGroup = enum $Optional<Builtin.RawPointer>, #Optional.some!enumelt, %taskGroup : $Builtin.RawPointer
|
|
%optTaskExecutor = enum $Optional<Builtin.Executor>, #Optional.some!enumelt, %taskExecutor : $Builtin.Executor
|
|
%optTaskExecutorOwned = enum $Optional<any TaskExecutor>, #Optional.none
|
|
%taskName = enum $Optional<Builtin.RawPointer>, #Optional.none
|
|
// CHECK: [[GROUP_RECORD:%.*]] = alloca %swift.task_group_task_option
|
|
// CHECK: [[EXECUTOR_RECORD:%.*]] = alloca %swift.task_executor_task_option
|
|
// CHECK-NOT: br i1
|
|
|
|
// CHECK: [[BASE_GEP:%.*]] = getelementptr inbounds{{.*}} %swift.task_group_task_option, ptr [[GROUP_RECORD]], i32 0, i32 0
|
|
// CHECK: [[FLAGS_GEP:%.*]] = getelementptr inbounds{{.*}} %swift.task_option, ptr [[BASE_GEP]], i32 0, i32 0
|
|
// CHECK: store [[INT]] 1, ptr [[FLAGS_GEP]], align
|
|
// CHECK: [[PARENT_GEP:%.*]] = getelementptr inbounds{{.*}} %swift.task_option, ptr [[BASE_GEP]], i32 0, i32 1
|
|
// CHECK: store ptr null, ptr [[PARENT_GEP]], align
|
|
// CHECK: [[GROUP_GEP:%.*]] = getelementptr inbounds{{.*}} %swift.task_group_task_option, ptr [[GROUP_RECORD]], i32 0, i32 1
|
|
// CHECK: store ptr %0, ptr [[GROUP_GEP]], align
|
|
|
|
// CHECK: [[BASE_GEP:%.*]] = getelementptr inbounds{{.*}} %swift.task_executor_task_option, ptr [[EXECUTOR_RECORD]], i32 0, i32 0
|
|
// CHECK: [[FLAGS_GEP:%.*]] = getelementptr inbounds{{.*}} %swift.task_option, ptr [[BASE_GEP]], i32 0, i32 0
|
|
// CHECK: store [[INT]] 5, ptr [[FLAGS_GEP]], align
|
|
// CHECK: [[PARENT_GEP:%.*]] = getelementptr inbounds{{.*}} %swift.task_option, ptr [[BASE_GEP]], i32 0, i32 1
|
|
// CHECK: store ptr [[GROUP_RECORD]], ptr [[PARENT_GEP]], align
|
|
// CHECK: [[EXECUTOR_GEP:%.*]] = getelementptr inbounds{{.*}} %swift.task_executor_task_option, ptr [[EXECUTOR_RECORD]], i32 0, i32 1
|
|
// CHECK: [[EXECUTOR_IDENT_GEP:%.*]] = getelementptr inbounds{{.*}} %swift.executor, ptr [[EXECUTOR_GEP]], i32 0, i32 0
|
|
// CHECK: store [[INT]] %1, ptr [[EXECUTOR_IDENT_GEP]], align
|
|
// CHECK: [[EXECUTOR_IMPL_GEP:%.*]] = getelementptr inbounds{{.*}} %swift.executor, ptr [[EXECUTOR_GEP]], i32 0, i32 1
|
|
// CHECK: store [[INT]] %2, ptr [[EXECUTOR_IMPL_GEP]], align
|
|
|
|
// CHECK: call swift{{(tail)?}}cc %swift.async_task_and_context @swift_task_create([[INT]] %5, ptr [[EXECUTOR_RECORD]]
|
|
%9 = builtin "createAsyncTask"(%flags : $Int, %optSerialExecutor : $Optional<Builtin.Executor>, %optTaskGroup : $Optional<Builtin.RawPointer>, %optTaskExecutor: $Optional<Builtin.Executor>, %optTaskExecutorOwned : $Optional<any TaskExecutor>, %taskName : $Optional<Builtin.RawPointer>, %taskFunction : $@async @callee_guaranteed () -> @error Error) : $(Builtin.NativeObject, Builtin.RawPointer)
|
|
%10 = tuple_extract %9 : $(Builtin.NativeObject, Builtin.RawPointer), 0
|
|
strong_release %10 : $Builtin.NativeObject
|
|
%12 = tuple ()
|
|
return %12 : $()
|
|
}
|
|
|
|
// CHECK-LABEL: define hidden swift{{(tail)?}}cc void @launch_void_future
|
|
sil hidden [ossa] @launch_void_future : $@convention(method) (Int, Builtin.RawPointer, @owned @async @callee_guaranteed @substituted <τ_0_0> () -> (@out τ_0_0, @error Error) for <()>) -> () {
|
|
bb0(%flags : $Int, %taskGroup : $Builtin.RawPointer, %taskFunction: @owned $@async @callee_guaranteed @substituted <τ_0_0> () -> (@out τ_0_0, @error Error) for <()>):
|
|
%optSerialExecutor = enum $Optional<Builtin.Executor>, #Optional.none
|
|
%optTaskGroup = enum $Optional<Builtin.RawPointer>, #Optional.some!enumelt, %taskGroup : $Builtin.RawPointer
|
|
%optTaskExecutor = enum $Optional<Builtin.Executor>, #Optional.none
|
|
%optTaskExecutorOwned = enum $Optional<any TaskExecutor>, #Optional.none
|
|
%taskName = enum $Optional<Builtin.RawPointer>, #Optional.none
|
|
// CHECK: [[NEW_TASK_AND_CONTEXT:%.*]] = call swift{{(tail)?}}cc %swift.async_task_and_context @swift_task_create(
|
|
%20 = builtin "createAsyncTask"<()>(%flags : $Int, %optSerialExecutor : $Optional<Builtin.Executor>, %optTaskGroup : $Optional<Builtin.RawPointer>, %optTaskExecutor : $Optional<Builtin.Executor>, %optTaskExecutorOwned : $Optional<any TaskExecutor>, %taskName : $Optional<Builtin.RawPointer>, %taskFunction : $@async @callee_guaranteed @substituted <τ_0_0> () -> (@out τ_0_0, @error Error) for <()>) : $(Builtin.NativeObject, Builtin.RawPointer)
|
|
destroy_value %20 : $(Builtin.NativeObject, Builtin.RawPointer)
|
|
%21 = tuple ()
|
|
return %21 : $()
|
|
}
|
|
|
|
// CHECK-LABEL: define hidden swiftcc void @resume_nonthrowing_continuation
|
|
sil hidden [ossa] @resume_nonthrowing_continuation : $(@in Builtin.NativeObject, Builtin.RawUnsafeContinuation) -> () {
|
|
bb0(%0 : $*Builtin.NativeObject, %1 : $Builtin.RawUnsafeContinuation):
|
|
// CHECK: [[CONTEXT_SLOT:%.*]] = getelementptr inbounds{{.*}} %swift.task, ptr %1, i32 0, i32 8
|
|
// CHECK-NEXT: [[CONTEXT_OPAQUE:%.*]] = load ptr, ptr [[CONTEXT_SLOT]], align
|
|
// CHECK-NEXT: [[RESULT_ADDR_SLOT:%.*]] = getelementptr inbounds{{.*}} %swift.continuation_context, ptr [[CONTEXT_OPAQUE]], i32 0, i32 4
|
|
// CHECK-NEXT: [[RESULT_ADDR_OPAQUE:%.*]] = load ptr, ptr [[RESULT_ADDR_SLOT]], align
|
|
// CHECK-NEXT: [[VALUE:%.*]] = load ptr, ptr %0, align
|
|
// CHECK-NEXT: store ptr [[VALUE]], ptr [[RESULT_ADDR_OPAQUE]], align
|
|
// CHECK-NEXT: call swiftcc void @swift_continuation_resume(ptr %1)
|
|
// CHECK-NEXT: ret void
|
|
builtin "resumeNonThrowingContinuationReturning"<Builtin.NativeObject>(%1 : $Builtin.RawUnsafeContinuation, %0 : $*Builtin.NativeObject) : $()
|
|
%21 = tuple ()
|
|
return %21 : $()
|
|
}
|
|
|
|
// CHECK-LABEL: define hidden swiftcc void @resume_throwing_continuation
|
|
sil hidden [ossa] @resume_throwing_continuation : $(@in Builtin.NativeObject, Builtin.RawUnsafeContinuation) -> () {
|
|
bb0(%0 : $*Builtin.NativeObject, %1 : $Builtin.RawUnsafeContinuation):
|
|
// CHECK: [[CONTEXT_SLOT:%.*]] = getelementptr inbounds{{.*}} %swift.task, ptr %1, i32 0, i32 8
|
|
// CHECK-NEXT: [[CONTEXT_OPAQUE:%.*]] = load ptr, ptr [[CONTEXT_SLOT]], align
|
|
// CHECK-NEXT: [[RESULT_ADDR_SLOT:%.*]] = getelementptr inbounds{{.*}} %swift.continuation_context, ptr [[CONTEXT_OPAQUE]], i32 0, i32 4
|
|
// CHECK-NEXT: [[RESULT_ADDR_OPAQUE:%.*]] = load ptr, ptr [[RESULT_ADDR_SLOT]], align
|
|
// CHECK-NEXT: [[VALUE:%.*]] = load ptr, ptr %0, align
|
|
// CHECK-NEXT: store ptr [[VALUE]], ptr [[RESULT_ADDR_OPAQUE]], align
|
|
// CHECK-NEXT: call swiftcc void @swift_continuation_throwingResume(ptr %1)
|
|
// CHECK-NEXT: ret void
|
|
builtin "resumeThrowingContinuationReturning"<Builtin.NativeObject>(%1 : $Builtin.RawUnsafeContinuation, %0 : $*Builtin.NativeObject) : $()
|
|
%21 = tuple ()
|
|
return %21 : $()
|
|
}
|
|
|
|
// CHECK-LABEL: define hidden swiftcc void @resume_throwing_continuation_throwing
|
|
sil hidden [ossa] @resume_throwing_continuation_throwing : $(@owned Error, Builtin.RawUnsafeContinuation) -> () {
|
|
bb0(%0 : @owned $Error, %1 : $Builtin.RawUnsafeContinuation):
|
|
// CHECK: call swiftcc void @swift_continuation_throwingResumeWithError(ptr %1, ptr %0)
|
|
// CHECK-NEXT: ret void
|
|
builtin "resumeThrowingContinuationThrowing"(%1 : $Builtin.RawUnsafeContinuation, %0 : $Error) : $()
|
|
%21 = tuple ()
|
|
return %21 : $()
|
|
}
|
|
|
|
// CHECK-LABEL: define hidden swift{{(tail)?}}cc void @task_group_create_destroy
|
|
sil hidden [ossa] @task_group_create_destroy : $@async () -> () {
|
|
bb0:
|
|
// CHECK: [[TASKGROUP:%.*]] = alloca [32 x ptr], align 16
|
|
// CHECK: call void @llvm.lifetime.start.p0(i64 -1, ptr [[TASKGROUP]])
|
|
// CHECK-NEXT: call swiftcc void @swift_taskGroup_initialize(ptr [[TASKGROUP]], ptr {{.*}})
|
|
%0 = metatype $@thin Builtin.Int32.Type
|
|
%1 = builtin "createTaskGroup"<Builtin.Int32>(%0: $@thin Builtin.Int32.Type) : $Builtin.RawPointer
|
|
|
|
// CHECK-NEXT: call swiftcc void @swift_taskGroup_destroy(ptr [[TASKGROUP]])
|
|
// CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 -1, ptr [[TASKGROUP]])
|
|
builtin "destroyTaskGroup"(%1 : $Builtin.RawPointer) : $()
|
|
|
|
%21 = tuple ()
|
|
return %21 : $()
|
|
}
|
|
|
|
|
|
// CHECK-LABEL: define{{.*}} swiftcc void @testRunInline(
|
|
// CHECK-SAME: ptr noalias sret(%swift.opaque) [[RESULT:%[^,]+]],
|
|
// CHECK-SAME: ptr [[CLOSURE:%[^,]+]],
|
|
// CHECK-SAME: ptr [[CLOSURE_CONTEXT:%[^,]+]],
|
|
// CHECK-SAME: ptr [[FUTURE_RESULT_TYPE:%[^,]+]])
|
|
// CHECK-SAME: {
|
|
// CHECK: call swiftcc void @swift_task_run_inline(
|
|
// CHECK-SAME: ptr [[RESULT]],
|
|
// CHECK-SAME: ptr [[CLOSURE]],
|
|
// CHECK-SAME: ptr [[CLOSURE_CONTEXT]],
|
|
// CHECK-SAME: ptr [[FUTURE_RESULT_TYPE]])
|
|
// CHECK: }
|
|
sil hidden @testRunInline : $@convention(thin) <T> (@noescape @async @callee_guaranteed @substituted <τ_0_0> () -> @out τ_0_0 for <T>) -> @out T {
|
|
entry(%result : $*T, %closure : $@noescape @async @callee_guaranteed @substituted <τ_0_0> () -> @out τ_0_0 for <T>):
|
|
%void = builtin "taskRunInline"<T>(%result : $*T, %closure : $@noescape @async @callee_guaranteed @substituted <τ_0_0> () -> @out τ_0_0 for <T>) : $()
|
|
return %void : $()
|
|
}
|