Skip to content

Commit 7009a18

Browse files
committed
[MoveOnlyAddressChecker] Don't complete phis.
After 874971c, before running address checking, all lifetimes in the function are completed. That doesn't quite work because lifetime completion expects not to encounter reborrows or their adjacent phis.
1 parent bbd7863 commit 7009a18

File tree

2 files changed

+40
-1
lines changed

2 files changed

+40
-1
lines changed

lib/SILOptimizer/Mandatory/MoveOnlyAddressCheckerUtils.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3998,14 +3998,20 @@ bool MoveOnlyAddressChecker::completeLifetimes() {
39983998
for (auto *block : postOrder->getPostOrder()) {
39993999
for (SILInstruction &inst : reverse(*block)) {
40004000
for (auto result : inst.getResults()) {
4001+
if (llvm::any_of(result->getUsers(),
4002+
[](auto *user) { return isa<BranchInst>(user); })) {
4003+
continue;
4004+
}
40014005
if (completion.completeOSSALifetime(result) ==
40024006
LifetimeCompletion::WasCompleted) {
40034007
changed = true;
40044008
}
40054009
}
40064010
}
40074011
for (SILArgument *arg : block->getArguments()) {
4008-
assert(!arg->isReborrow() && "reborrows not legal at this SIL stage");
4012+
if (arg->isReborrow()) {
4013+
continue;
4014+
}
40094015
if (completion.completeOSSALifetime(arg) ==
40104016
LifetimeCompletion::WasCompleted) {
40114017
changed = true;

test/SILOptimizer/moveonly_addresschecker.sil

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -871,3 +871,36 @@ exit:
871871
%retval = tuple ()
872872
return %retval : $()
873873
}
874+
875+
// Test that we don't crash while attempting to complete reborrow lifetimes.
876+
sil [ossa] @closure_lifetime_fixup_output : $@convention(thin) (@owned NonTrivialStructPair) -> () {
877+
bb0(%pair : @owned $NonTrivialStructPair):
878+
%none = enum $Optional<@callee_guaranteed () -> ()>, #Optional.none!enumelt
879+
%none_borrow = begin_borrow %none : $Optional<@callee_guaranteed () -> ()>
880+
%stack = alloc_stack $NonTrivialStructPair, let, name "job", argno 1
881+
%addr = mark_unresolved_non_copyable_value [consumable_and_assignable] %stack : $*NonTrivialStructPair
882+
store %pair to [init] %addr : $*NonTrivialStructPair
883+
cond_br undef, bb1, bb3
884+
885+
bb1:
886+
end_borrow %none_borrow : $Optional<@callee_guaranteed () -> ()>
887+
%closure = partial_apply [callee_guaranteed] undef() : $@convention(thin) () -> ()
888+
%some = enum $Optional<@callee_guaranteed () -> ()>, #Optional.some!enumelt, %closure : $@callee_guaranteed () -> ()
889+
%some_borrow = begin_borrow %some : $Optional<@callee_guaranteed () -> ()>
890+
br bb2
891+
892+
bb2:
893+
br bb4(%some_borrow : $Optional<@callee_guaranteed () -> ()>, %some : $Optional<@callee_guaranteed () -> ()>)
894+
895+
bb3:
896+
br bb4(%none_borrow : $Optional<@callee_guaranteed () -> ()>, %none : $Optional<@callee_guaranteed () -> ()>)
897+
898+
bb4(%reborrow : @reborrow @guaranteed $Optional<@callee_guaranteed () -> ()>, %maybe : @owned $Optional<@callee_guaranteed () -> ()>):
899+
%borrow = borrowed %reborrow : $Optional<@callee_guaranteed () -> ()> from (%maybe : $Optional<@callee_guaranteed () -> ()>)
900+
destroy_addr %addr : $*NonTrivialStructPair
901+
dealloc_stack %stack : $*NonTrivialStructPair
902+
end_borrow %borrow : $Optional<@callee_guaranteed () -> ()>
903+
destroy_value %maybe : $Optional<@callee_guaranteed () -> ()>
904+
%retval = tuple ()
905+
return %retval : $()
906+
}

0 commit comments

Comments
 (0)