Skip to content

Commit 9b686f5

Browse files
committed
[region-isolation] Add support for strong_copy_unmanaged_value.
I also made ref_to_unmanaged and unmanaged_to_ref look through. They should have always been look through, but I believe early on they were marked assign and I never touched fixed it. To get the test for strong_copy_unmanaged_value to work, I needed them to obey these semantics so I fixed them at the same time.
1 parent 40c1120 commit 9b686f5

File tree

2 files changed

+28
-3
lines changed

2 files changed

+28
-3
lines changed

lib/SILOptimizer/Analysis/RegionAnalysis.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,9 @@ static bool isStaticallyLookThroughInst(SILInstruction *inst) {
225225
case SILInstructionKind::ValueToBridgeObjectInst:
226226
case SILInstructionKind::WeakCopyValueInst:
227227
case SILInstructionKind::StrongCopyWeakValueInst:
228+
case SILInstructionKind::StrongCopyUnmanagedValueInst:
229+
case SILInstructionKind::RefToUnmanagedInst:
230+
case SILInstructionKind::UnmanagedToRefInst:
228231
return true;
229232
case SILInstructionKind::UnconditionalCheckedCastInst: {
230233
auto cast = SILDynamicCastInst::getAs(inst);
@@ -2285,14 +2288,12 @@ CONSTANT_TRANSLATION(InitExistentialAddrInst, Assign)
22852288
CONSTANT_TRANSLATION(InitExistentialRefInst, Assign)
22862289
CONSTANT_TRANSLATION(OpenExistentialBoxInst, Assign)
22872290
CONSTANT_TRANSLATION(OpenExistentialRefInst, Assign)
2288-
CONSTANT_TRANSLATION(RefToUnmanagedInst, Assign)
22892291
CONSTANT_TRANSLATION(TailAddrInst, Assign)
22902292
CONSTANT_TRANSLATION(ThickToObjCMetatypeInst, Assign)
22912293
CONSTANT_TRANSLATION(ThinToThickFunctionInst, Assign)
22922294
CONSTANT_TRANSLATION(UncheckedAddrCastInst, Assign)
22932295
CONSTANT_TRANSLATION(UncheckedEnumDataInst, Assign)
22942296
CONSTANT_TRANSLATION(UncheckedOwnershipConversionInst, Assign)
2295-
CONSTANT_TRANSLATION(UnmanagedToRefInst, Assign)
22962297
CONSTANT_TRANSLATION(IndexRawPointerInst, Assign)
22972298

22982299
// These are used by SIL to aggregate values together in a gep like way. We
@@ -2346,6 +2347,9 @@ CONSTANT_TRANSLATION(BeginCOWMutationInst, LookThrough)
23462347
CONSTANT_TRANSLATION(OpenExistentialValueInst, LookThrough)
23472348
CONSTANT_TRANSLATION(WeakCopyValueInst, LookThrough)
23482349
CONSTANT_TRANSLATION(StrongCopyWeakValueInst, LookThrough)
2350+
CONSTANT_TRANSLATION(StrongCopyUnmanagedValueInst, LookThrough)
2351+
CONSTANT_TRANSLATION(RefToUnmanagedInst, LookThrough)
2352+
CONSTANT_TRANSLATION(UnmanagedToRefInst, LookThrough)
23492353

23502354
//===---
23512355
// Store
@@ -2477,7 +2481,6 @@ CONSTANT_TRANSLATION(DeallocExistentialBoxInst, Ignored)
24772481
// Unhandled Instructions
24782482
//
24792483

2480-
CONSTANT_TRANSLATION(StrongCopyUnmanagedValueInst, Unhandled)
24812484
CONSTANT_TRANSLATION(InitExistentialValueInst, Unhandled)
24822485

24832486
//===---

test/Concurrency/transfernonsendable_instruction_matching.sil

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ class NonSendableKlass {}
2222
sil @transferNonSendableKlass : $@convention(thin) @async (@guaranteed NonSendableKlass) -> ()
2323
sil @useNonSendableKlass : $@convention(thin) (@guaranteed NonSendableKlass) -> ()
2424
sil @constructNonSendableKlass : $@convention(thin) () -> @owned NonSendableKlass
25+
sil @useUnmanagedNonSendableKlass : $@convention(thin) (@guaranteed @sil_unmanaged NonSendableKlass) -> ()
2526

2627
final class SendableKlass : Sendable {}
2728

@@ -1602,6 +1603,27 @@ bb0:
16021603
destroy_value %b : $NonSendableKlass
16031604
destroy_value %value : $NonSendableKlass
16041605
dealloc_stack %a : $*@sil_unowned NonSendableKlass
1606+
%9999 = tuple ()
1607+
return %9999 : $()
1608+
}
1609+
1610+
sil [ossa] @strong_copy_unmanaged_value_test : $@async @convention(thin) () -> () {
1611+
bb0:
1612+
%constructFn = function_ref @constructNonSendableKlass : $@convention(thin) () -> @owned NonSendableKlass
1613+
%value = apply %constructFn() : $@convention(thin) () -> @owned NonSendableKlass
1614+
1615+
%transferNonSendableKlass = function_ref @transferNonSendableKlass : $@convention(thin) @async (@guaranteed NonSendableKlass) -> ()
1616+
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}}
1617+
1618+
%borrowedValue = begin_borrow %value : $NonSendableKlass
1619+
%v = ref_to_unmanaged %borrowedValue : $NonSendableKlass to $@sil_unmanaged NonSendableKlass
1620+
%v2 = unmanaged_to_ref %v : $@sil_unmanaged NonSendableKlass to $ NonSendableKlass
1621+
%v3 = ref_to_unmanaged %v2 : $NonSendableKlass to $@sil_unmanaged NonSendableKlass
1622+
%useFunc = function_ref @useUnmanagedNonSendableKlass : $@convention(thin) (@guaranteed @sil_unmanaged NonSendableKlass) -> ()
1623+
apply %useFunc(%v3) : $@convention(thin) (@guaranteed @sil_unmanaged NonSendableKlass) -> () // expected-note {{access here could race}}
1624+
end_borrow %borrowedValue : $NonSendableKlass
1625+
destroy_value %value : $NonSendableKlass
1626+
16051627
%9999 = tuple ()
16061628
return %9999 : $()
16071629
}

0 commit comments

Comments
 (0)