Skip to content

Commit e42b112

Browse files
committed
[region-isolation] Add support for {begin,end}_unpaired_access.
1 parent d61d359 commit e42b112

File tree

2 files changed

+48
-2
lines changed

2 files changed

+48
-2
lines changed

lib/SILOptimizer/Analysis/RegionAnalysis.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2375,6 +2375,7 @@ CONSTANT_TRANSLATION(DestroyValueInst, Ignored)
23752375
CONSTANT_TRANSLATION(EndAccessInst, Ignored)
23762376
CONSTANT_TRANSLATION(EndBorrowInst, Ignored)
23772377
CONSTANT_TRANSLATION(EndLifetimeInst, Ignored)
2378+
CONSTANT_TRANSLATION(EndUnpairedAccessInst, Ignored)
23782379
CONSTANT_TRANSLATION(HopToExecutorInst, Ignored)
23792380
CONSTANT_TRANSLATION(InjectEnumAddrInst, Ignored)
23802381
CONSTANT_TRANSLATION(IsEscapingClosureInst, Ignored)
@@ -2400,6 +2401,7 @@ CONSTANT_TRANSLATION(UnmanagedReleaseValueInst, Require)
24002401
CONSTANT_TRANSLATION(UnmanagedAutoreleaseValueInst, Require)
24012402
CONSTANT_TRANSLATION(RebindMemoryInst, Require)
24022403
CONSTANT_TRANSLATION(BindMemoryInst, Require)
2404+
CONSTANT_TRANSLATION(BeginUnpairedAccessInst, Require)
24032405

24042406
//===---
24052407
// Terminators
@@ -2469,8 +2471,6 @@ CONSTANT_TRANSLATION(LinearFunctionInst, Unhandled)
24692471
CONSTANT_TRANSLATION(DifferentiableFunctionExtractInst, Unhandled)
24702472
CONSTANT_TRANSLATION(LinearFunctionExtractInst, Unhandled)
24712473
CONSTANT_TRANSLATION(DifferentiabilityWitnessFunctionInst, Unhandled)
2472-
CONSTANT_TRANSLATION(BeginUnpairedAccessInst, Unhandled)
2473-
CONSTANT_TRANSLATION(EndUnpairedAccessInst, Unhandled)
24742474

24752475
//===---
24762476
// Packs

test/Concurrency/transfernonsendable_instruction_matching.sil

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1538,6 +1538,52 @@ bb0(%index : $Builtin.Word):
15381538
apply [caller_isolation=nonisolated] [callee_isolation=global_actor] %f<@pack_element("31FF306C-BF88-11ED-A03F-ACDE48001122") U_1>(%elt2) : $@convention(thin) @async <τ_0_0> (@in_guaranteed τ_0_0) -> ()
15391539

15401540
dealloc_stack %tuple : $*(NonSendableKlass, T, T, Int)
1541+
%9999 = tuple ()
1542+
return %9999 : $()
1543+
}
1544+
1545+
sil [ossa] @begin_unpaired_access_test : $@async @convention(thin) () -> () {
1546+
bb0:
1547+
%constructFn = function_ref @constructNonSendableKlass : $@convention(thin) () -> @owned NonSendableKlass
1548+
%value = apply %constructFn() : $@convention(thin) () -> @owned NonSendableKlass
1549+
%a = alloc_stack $NonSendableKlass
1550+
%valueCopy = copy_value %value : $NonSendableKlass
1551+
store %valueCopy to [init] %a : $*NonSendableKlass
1552+
1553+
%transferNonSendableKlass = function_ref @transferNonSendableKlass : $@convention(thin) @async (@guaranteed NonSendableKlass) -> ()
1554+
apply [caller_isolation=nonisolated] [callee_isolation=global_actor] %transferNonSendableKlass(%value) : $@convention(thin) @async (@guaranteed NonSendableKlass) -> () // expected-warning {{transferring value of non-Sendable type 'NonSendableKlass' from nonisolated context to global actor '<null>'-isolated context; later accesses could race}}
1555+
1556+
%9 = alloc_stack $Builtin.UnsafeValueBuffer
1557+
begin_unpaired_access [read] [dynamic] [no_nested_conflict] %a : $*NonSendableKlass, %9 : $*Builtin.UnsafeValueBuffer // expected-note {{access here could race}}
1558+
destroy_value %value : $NonSendableKlass
1559+
dealloc_stack %9 : $*Builtin.UnsafeValueBuffer
1560+
destroy_addr %a : $*NonSendableKlass
1561+
dealloc_stack %a : $*NonSendableKlass
1562+
1563+
%9999 = tuple ()
1564+
return %9999 : $()
1565+
}
1566+
1567+
sil [ossa] @end_unpaired_access_test : $@async @convention(thin) () -> () {
1568+
bb0:
1569+
%constructFn = function_ref @constructNonSendableKlass : $@convention(thin) () -> @owned NonSendableKlass
1570+
%value = apply %constructFn() : $@convention(thin) () -> @owned NonSendableKlass
1571+
%a = alloc_stack $NonSendableKlass
1572+
%valueCopy = copy_value %value : $NonSendableKlass
1573+
store %valueCopy to [init] %a : $*NonSendableKlass
1574+
1575+
%9 = alloc_stack $Builtin.UnsafeValueBuffer
1576+
begin_unpaired_access [read] [dynamic] [no_nested_conflict] %a : $*NonSendableKlass, %9 : $*Builtin.UnsafeValueBuffer
1577+
1578+
%transferNonSendableKlass = function_ref @transferNonSendableKlass : $@convention(thin) @async (@guaranteed NonSendableKlass) -> ()
1579+
apply [caller_isolation=nonisolated] [callee_isolation=global_actor] %transferNonSendableKlass(%value) : $@convention(thin) @async (@guaranteed NonSendableKlass) -> ()
1580+
1581+
end_unpaired_access [dynamic] %9 : $*Builtin.UnsafeValueBuffer
1582+
destroy_value %value : $NonSendableKlass
1583+
dealloc_stack %9 : $*Builtin.UnsafeValueBuffer
1584+
destroy_addr %a : $*NonSendableKlass
1585+
dealloc_stack %a : $*NonSendableKlass
1586+
15411587
%9999 = tuple ()
15421588
return %9999 : $()
15431589
}

0 commit comments

Comments
 (0)