Skip to content

Commit bb502c5

Browse files
Merge pull request #73358 from nate-chandler/rdar127190151
[MoveOnlyAddressChecker] Don't complete reborrows or their adjacent phis.
2 parents 981233a + 7009a18 commit bb502c5

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)