Skip to content

Commit 34e42d7

Browse files
committed
Actor-isolated top-level global variables test
Adding a test to verify that actor-isolated variables in top-level code jump to the correct actor. Also ensure that raw globals are not hopping to actors.
1 parent 834816a commit 34e42d7

File tree

1 file changed

+76
-0
lines changed

1 file changed

+76
-0
lines changed
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
// RUN: %target-swift-emit-silgen -disable-availability-checking -Xllvm -sil-full-demangle -enable-experimental-async-top-level %s | %FileCheck %s
2+
3+
// a
4+
// CHECK-LABEL: sil_global hidden @$s24toplevel_globalactorvars1aSivp : $Int
5+
// b
6+
// CHECK-LABEL: sil_global hidden @$s24toplevel_globalactorvars1bSivp : $Int
7+
8+
// CHECK-LABEL: sil hidden [ossa] @async_Main
9+
// CHECK: bb0:
10+
// CHECK-NEXT: alloc_global @$s24toplevel_globalactorvars1aSivp
11+
// CHECK-NEXT: [[AREF:%[0-9]+]] = global_addr @$s24toplevel_globalactorvars1aSivp : $*Int
12+
13+
actor MyActorImpl {}
14+
15+
@globalActor
16+
struct MyActor {
17+
static let shared = MyActorImpl()
18+
}
19+
20+
@MyActor
21+
var a = 10
22+
23+
@MyActor
24+
func incrementA() {
25+
a += 1
26+
}
27+
28+
await print(a)
29+
30+
// CHECK: [[ACTORREF:%[0-9]+]] = begin_borrow {{%[0-9]+}} : $MyActorImpl
31+
// CHECK: [[OLDACTOR:%[0-9]+]] = builtin "getCurrentExecutor"() : $Optional<Builtin.Executor>
32+
// CHECK: hop_to_executor [[ACTORREF]] : $MyActorImpl
33+
// CHECK: [[AACCESS:%[0-9]+]] = begin_access [read] [dynamic] [[AREF]] : $*Int
34+
// CHECK: [[AGLOBAL:%[0-9]+]] = load [trivial] [[AACCESS]] : $*Int
35+
// CHECK: end_access [[AACCESS]]
36+
// CHECK: hop_to_executor [[OLDACTOR]]
37+
// CHECK: end_borrow [[ACTORREF]]
38+
39+
await incrementA()
40+
41+
// CHECK: [[INCREMENTA:%[0-9]+]] = function_ref @$s24toplevel_globalactorvars10incrementAyyF
42+
// CHECK: [[ACTORREF:%[0-9]+]] = begin_borrow {{%[0-9]+}} : $MyActorImpl
43+
// CHECK: [[OLDACTOR:%[0-9]+]] = builtin "getCurrentExecutor"() : $Optional<Builtin.Executor>
44+
// CHECK: hop_to_executor [[ACTORREF]] : $MyActorImpl
45+
// CHECK: {{%[0-9]+}} = apply [[INCREMENTA]]()
46+
// CHECK: hop_to_executor [[OLDACTOR]]
47+
// CHECK: end_borrow [[ACTORREF]]
48+
49+
await print(a)
50+
51+
// CHECK: [[ACTORREF:%[0-9]+]] = begin_borrow {{%[0-9]+}} : $MyActorImpl
52+
// CHECK: [[OLDACTOR:%[0-9]+]] = builtin "getCurrentExecutor"() : $Optional<Builtin.Executor>
53+
// CHECK: hop_to_executor [[ACTORREF]] : $MyActorImpl
54+
// CHECK: [[AACCESS:%[0-9]+]] = begin_access [read] [dynamic] [[AREF]] : $*Int
55+
// CHECK: [[AGLOBAL:%[0-9]+]] = load [trivial] [[AACCESS]] : $*Int
56+
// CHECK: end_access [[AACCESS]]
57+
// CHECK: hop_to_executor [[OLDACTOR]]
58+
// CHECK: end_borrow [[ACTORREF]]
59+
60+
var b = 11
61+
62+
// CHECK: alloc_global @$s24toplevel_globalactorvars1bSivp
63+
// CHECK: [[BGLOBAL_ADDR:%[0-9]+]] = global_addr @$s24toplevel_globalactorvars1bSivp
64+
// Int.init(_builtinIntegerLiteral:)
65+
// CHECK: [[INT_INIT_FUNC:%[0-9]+]] = function_ref @$sSi22_builtinIntegerLiteralSiBI_tcfC
66+
// CHECK: [[INITD_INT:%[0-9]+]] = apply [[INT_INIT_FUNC]]({{%[0-9]+}}, {{%[0-9]+}})
67+
// CHECK: store [[INITD_INT]] to [trivial] [[BGLOBAL_ADDR]]
68+
69+
b += 1
70+
71+
// CHECK-NOT: hop_to_executor
72+
// CHECK: [[BACCESS:%[0-9]+]] = begin_access [modify] [dynamic] [[BGLOBAL_ADDR]]
73+
// static Int.+= infix(_:_:)
74+
// CHECK: [[PE_INT_FUNC:%[0-9]+]] = function_ref @$sSi2peoiyySiz_SitFZ
75+
// CHECK: [[INCREMENTED:%[0-9]+]] = apply [[PE_INT_FUNC]]([[BACCESS]], {{%[0-9]+}}, {{%[0-9]+}})
76+
// CHECK: end_access [[BACCESS]]

0 commit comments

Comments
 (0)