Skip to content

Commit bd5af6b

Browse files
authored
Merge pull request #59393 from meg-gupta/fixloadborrowimmutablean
Fix LoadBorrowImmutabilityChecker to handle reborrows
2 parents fecba2e + b6231d2 commit bd5af6b

26 files changed

+50
-3
lines changed

lib/SIL/Verifier/LoadBorrowImmutabilityChecker.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -363,9 +363,9 @@ bool LoadBorrowImmutabilityAnalysis::isImmutable(LoadBorrowInst *lbi) {
363363
// cases to try and exhaustively identify if those writes overlap with our
364364
// load_borrow.
365365
SmallVector<Operand *, 8> endBorrowUses;
366-
transform(lbi->getUsersOfType<EndBorrowInst>(),
367-
std::back_inserter(endBorrowUses),
368-
[](EndBorrowInst *ebi) { return &ebi->getAllOperands()[0]; });
366+
visitTransitiveEndBorrows(lbi, [&](EndBorrowInst *endBorrow) {
367+
endBorrowUses.push_back(&endBorrow->getOperandRef());
368+
});
369369

370370
switch (accessPath.getStorage().getKind()) {
371371
case AccessStorage::Nested: {

test/SILOptimizer/load_borrow_verify.sil renamed to test/SIL/OwnershipVerifier/load_borrow_verify.sil

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,3 +153,23 @@ bb0(%0 : @owned $K):
153153
return %r : $()
154154
}
155155

156+
sil @use_guaranteed : $@convention(thin) (@guaranteed K) -> ()
157+
158+
sil [ossa] @test_write_reborrow : $@convention(thin) (@owned K, @owned K) -> () {
159+
bb0(%0 : @owned $K, %1 : @owned $K):
160+
%stk = alloc_stack [lexical] $K
161+
store %0 to [init] %stk : $*K
162+
%ld1 = load_borrow %stk : $*K
163+
br bb2(%ld1 : $K)
164+
165+
bb2(%ld : @guaranteed $K):
166+
%3 = function_ref @use_guaranteed : $@convention(thin) (@guaranteed K) -> ()
167+
%4 = apply %3(%ld) : $@convention(thin) (@guaranteed K) -> ()
168+
end_borrow %ld : $K
169+
store %1 to [assign] %stk : $*K
170+
destroy_addr %stk : $*K
171+
dealloc_stack %stk : $*K
172+
%6 = tuple ()
173+
return %6 : $()
174+
}
175+
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// RUN: %target-sil-opt %s -verify-continue-on-failure=true -o /dev/null 2>&1 | %FileCheck %s
2+
3+
class Klass {}
4+
5+
sil @use_guaranteed : $@convention(thin) (@guaranteed Klass) -> ()
6+
7+
// Write: store {{.*}} [assign] {{.*}}
8+
// CHECK: Begin Error in function test_write_reborrow
9+
// CHECK: SIL verification failed: Found load borrow that is invalidated by a local write?!: loadBorrowImmutabilityAnalysis.isImmutable(LBI)
10+
// CHECK: End Error in function test_write_reborrow
11+
sil [ossa] @test_write_reborrow : $@convention(thin) (@owned Klass, @owned Klass) -> () {
12+
bb0(%0 : @owned $Klass, %1 : @owned $Klass):
13+
%stk = alloc_stack [lexical] $Klass
14+
store %0 to [init] %stk : $*Klass
15+
%ld1 = load_borrow %stk : $*Klass
16+
br bb2(%ld1 : $Klass)
17+
18+
bb2(%ld : @guaranteed $Klass):
19+
store %1 to [assign] %stk : $*Klass
20+
%3 = function_ref @use_guaranteed : $@convention(thin) (@guaranteed Klass) -> ()
21+
%4 = apply %3(%ld) : $@convention(thin) (@guaranteed Klass) -> ()
22+
end_borrow %ld : $Klass
23+
destroy_addr %stk : $*Klass
24+
dealloc_stack %stk : $*Klass
25+
%6 = tuple ()
26+
return %6 : $()
27+
}

0 commit comments

Comments
 (0)