Skip to content

Commit 06af948

Browse files
committed
[LifetimeCompletion] Handle owned project_box.
Akin to 57eb1db but for owned values.
1 parent 60a62db commit 06af948

File tree

2 files changed

+46
-0
lines changed

2 files changed

+46
-0
lines changed

include/swift/SIL/OwnershipUseVisitor.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,11 @@ bool OwnershipUseVisitor<Impl>::visitOwnedUse(Operand *use) {
361361
return handleUsePoint(use, UseLifetimeConstraint::LifetimeEnding);
362362

363363
case OperandOwnership::PointerEscape:
364+
// TODO: Change ProjectBox ownership to InteriorPointer and allow them to
365+
// take owned values.
366+
if (isa<ProjectBoxInst>(use->getUser())) {
367+
return visitInteriorPointerUses(use);
368+
}
364369
if (!asImpl().handlePointerEscape(use))
365370
return false;
366371

test/SILOptimizer/ossa_lifetime_completion.sil

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -414,3 +414,44 @@ bb0(%0 : @owned $C):
414414
store %0 to [init] %4 : $*C
415415
unreachable
416416
}
417+
418+
indirect enum IndirectEnumNontrivialPayload {
419+
case c(C)
420+
}
421+
422+
// CHECK-LABEL: sil [ossa] @project_box_owned : {{.*}} {
423+
// CHECK: bb0([[IE:%[^,]+]] :
424+
// CHECK: switch_enum [[IE]]
425+
// CHECK-SAME: case #IndirectEnumNontrivialPayload.c!enumelt: [[ONE_CASE:bb[0-9]+]]
426+
// CHECK: [[ONE_CASE]]([[BOX:%[^,]+]] :
427+
// CHECK: [[C_ADDR:%[^,]+]] = project_box [[BOX]]
428+
// CHECK: [[C:%[^,]+]] = load_borrow [[C_ADDR]]
429+
// CHECK: cond_br undef, {{bb[0-9]+}}, [[BASIC_BLOCK4:bb[0-9]+]]
430+
// CHECK: [[BASIC_BLOCK4]]:
431+
// CHECK: end_borrow [[C]]
432+
// CHECK: destroy_value [[BOX]]
433+
// CHECK: unreachable
434+
// CHECK-LABEL: } // end sil function 'project_box_owned'
435+
sil [ossa] @project_box_owned : $@convention(thin) (@owned IndirectEnumNontrivialPayload) -> () {
436+
entry(%ie : @owned $IndirectEnumNontrivialPayload):
437+
switch_enum %ie : $IndirectEnumNontrivialPayload, case #IndirectEnumNontrivialPayload.c!enumelt: one_case
438+
439+
one_case(%box : @owned ${ var C }):
440+
specify_test "ossa-lifetime-completion %box"
441+
%c_addr = project_box %box : ${ var C }, 0
442+
%c = load_borrow %c_addr : $*C
443+
cond_br undef, left, right
444+
445+
left:
446+
end_borrow %c : $C
447+
destroy_value %box : ${ var C }
448+
br exit
449+
450+
exit:
451+
%retval = tuple ()
452+
return %retval : $()
453+
454+
right:
455+
end_borrow %c : $C
456+
unreachable
457+
}

0 commit comments

Comments
 (0)