mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Specifically, when TBI is available we use the bottom two bits of the top nibble (bits 60,61). On platforms without TBI, we use the bottom two tagged pointer bits (bits 0, 1). rdar://156525771
66 lines
3.3 KiB
Swift
66 lines
3.3 KiB
Swift
// RUN: %target-swift-frontend -parse-as-library -emit-ir -disable-llvm-merge-functions-pass %s | %FileCheck --check-prefix=NO-TBI %s
|
|
// RUN: %target-swift-frontend -parse-as-library -Xllvm -aarch64-use-tbi -emit-ir -disable-llvm-merge-functions-pass %s | %FileCheck --check-prefix=TBI %s
|
|
|
|
// This test makes sure that we can properly fold the mask for the witness table
|
|
// when we have a #isolation.
|
|
|
|
// REQUIRES: concurrency
|
|
// REQUIRES: CODEGENERATOR=AArch64
|
|
// REQUIRES: PTRSIZE=64
|
|
// REQUIRES: OS=macosx || OS=ios
|
|
// REQUIRES: CPU=arm64
|
|
|
|
@inline(never)
|
|
func useActor(iso: (any Actor)?) {
|
|
print(iso!.unownedExecutor)
|
|
}
|
|
|
|
@inline(never)
|
|
func implicitParam(_ x: (any Actor)? = #isolation) {
|
|
print(x!.unownedExecutor)
|
|
}
|
|
|
|
// #isolation via direct usage
|
|
//
|
|
// TBI: define swifttailcc void @"$s18isolation_macro_ir46nonisolatedNonsendingUsePoundIsolationDirectlyyyYaF"(ptr swiftasync %0, i64 %1, i64 [[SECOND_WORD:%.*]])
|
|
// TBI: [[MASKED_SECOND_WORD:%.*]] = and i64 [[SECOND_WORD]], -3458764513820540929
|
|
// TBI: call swiftcc void @"$s18isolation_macro_ir8useActor3isoyScA_pSg_tF"(i64 %1, i64 [[MASKED_SECOND_WORD]])
|
|
|
|
// NO-TBI: define swifttailcc void @"$s18isolation_macro_ir46nonisolatedNonsendingUsePoundIsolationDirectlyyyYaF"(ptr swiftasync %0, i64 [[FIRST_WORD:%.*]], i64 [[SECOND_WORD:%.*]])
|
|
// NO-TBI: [[MASKED_SECOND_WORD:%.*]] = and i64 [[SECOND_WORD]], -4
|
|
// NO-TBI: call swiftcc void @"$s18isolation_macro_ir8useActor3isoyScA_pSg_tF"(i64 [[FIRST_WORD]], i64 [[MASKED_SECOND_WORD]])
|
|
|
|
public nonisolated(nonsending) func nonisolatedNonsendingUsePoundIsolationDirectly() async {
|
|
let iso = #isolation
|
|
useActor(iso: iso)
|
|
}
|
|
|
|
// #isolation via default arg
|
|
//
|
|
// TBI: define swifttailcc void @"$s18isolation_macro_ir45nonisolatedNonsendingPoundIsolationDefaultArgyyYaF"(ptr swiftasync {{%.*}}, i64 {{%.*}}, i64 [[WORD_2:%.*]])
|
|
// TBI: [[MASKED_WORD_2:%.*]] = and i64 [[WORD_2]], -3458764513820540929
|
|
// TBI: call swiftcc void @"$s18isolation_macro_ir13implicitParamyyScA_pSgF"(i64 {{%.*}}, i64 [[MASKED_WORD_2]])
|
|
|
|
// NO-TBI: define swifttailcc void @"$s18isolation_macro_ir45nonisolatedNonsendingPoundIsolationDefaultArgyyYaF"(ptr swiftasync %0, i64 [[WORD_1:%.*]], i64 [[WORD_2:%.*]])
|
|
// NO-TBI: [[MASKED_WORD_2:%.*]] = and i64 [[WORD_2]], -4
|
|
// NO-TBI: call swiftcc void @"$s18isolation_macro_ir13implicitParamyyScA_pSgF"(i64 {{%.*}}, i64 [[MASKED_WORD_2]])
|
|
public nonisolated(nonsending) func nonisolatedNonsendingPoundIsolationDefaultArg() async {
|
|
implicitParam()
|
|
}
|
|
|
|
@inline(never)
|
|
public nonisolated(nonsending) func calleeFunction() async {
|
|
}
|
|
|
|
// TBI: define swifttailcc void @"$s18isolation_macro_ir14callerFunctionyyYaF"(ptr swiftasync %0, i64 %1, i64 [[WORD_2:%.*]])
|
|
// TBI: [[MASKED_WORD_2:%.*]] = and i64 [[WORD_2]], -3458764513820540929
|
|
// TBI: musttail call swifttailcc void @"$s18isolation_macro_ir14calleeFunctionyyYaF"(ptr swiftasync {{%.*}}, i64 {{%.*}}, i64 [[MASKED_WORD_2]])
|
|
|
|
// NO-TBI: define swifttailcc void @"$s18isolation_macro_ir14callerFunctionyyYaF"(ptr swiftasync %0, i64 %1, i64 [[WORD:%.*]])
|
|
// NO-TBI: [[MASKED_WORD:%.*]] = and i64 [[WORD]], -4
|
|
// NO-TBI: musttail call swifttailcc void @"$s18isolation_macro_ir14calleeFunctionyyYaF"(ptr swiftasync {{%.*}}, i64 {{%.*}}, i64 [[MASKED_WORD]])
|
|
@inline(never)
|
|
public nonisolated(nonsending) func callerFunction() async {
|
|
await calleeFunction()
|
|
}
|