Skip to content

Commit f51edac

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 9925215 commit f51edac

File tree

2 files changed

+39
-1
lines changed

2 files changed

+39
-1
lines changed

lib/SILOptimizer/Mandatory/MoveOnlyAddressCheckerUtils.cpp

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

test/SILOptimizer/moveonly_addresschecker.sil

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -871,3 +871,35 @@ 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+
destroy_addr %addr : $*NonTrivialStructPair
900+
dealloc_stack %stack : $*NonTrivialStructPair
901+
end_borrow %reborrow : $Optional<@callee_guaranteed () -> ()>
902+
destroy_value %maybe : $Optional<@callee_guaranteed () -> ()>
903+
%retval = tuple ()
904+
return %retval : $()
905+
}

0 commit comments

Comments
 (0)