Skip to content

Commit 65aad82

Browse files
committed
Fix reborrow verifier to look through borrowed from
1 parent 8353a8c commit 65aad82

File tree

2 files changed

+34
-2
lines changed

2 files changed

+34
-2
lines changed

lib/SIL/Utils/OwnershipUtils.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1605,10 +1605,15 @@ void swift::visitExtendedReborrowPhiBaseValuePairs(
16051605
// the reborrow, its phi value will be the new base value.
16061606
for (auto &op : phiOp.getBranch()->getAllOperands()) {
16071607
PhiOperand otherPhiOp(&op);
1608-
if (otherPhiOp.getSource() != currentBaseValue) {
1608+
auto *borrowedFromUser = getBorrowedFromUser(currentBaseValue);
1609+
if (borrowedFromUser && borrowedFromUser == otherPhiOp.getSource()) {
1610+
newBaseValue = otherPhiOp.getValue();
1611+
continue;
1612+
}
1613+
if (otherPhiOp.getSource() == currentBaseValue) {
1614+
newBaseValue = otherPhiOp.getValue();
16091615
continue;
16101616
}
1611-
newBaseValue = otherPhiOp.getValue();
16121617
}
16131618

16141619
// Call the visitor function

test/SIL/OwnershipVerifier/guaranteed_phis.sil

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,3 +334,30 @@ bb3(%phi1 : @guaranteed $Wrapper2, %phi2 : @guaranteed $Wrapper1):
334334
%9999 = tuple()
335335
return %9999 : $()
336336
}
337+
338+
339+
sil hidden [ossa] @borrowed_from_reborrow : $@convention(thin) (@inout Klass) -> () {
340+
bb0(%0 : $*Klass):
341+
%1 = load_borrow %0 : $*Klass
342+
%2 = begin_borrow [lexical] %1 : $Klass
343+
br bb1(%1 : $Klass, %2 : $Klass)
344+
345+
bb1(%4 : @reborrow $Klass, %5 : @reborrow $Klass):
346+
%6 = borrowed %5 : $Klass from (%4 : $Klass)
347+
%7 = borrowed %4 : $Klass from ()
348+
br bb2(%7 : $Klass, %6 : $Klass)
349+
350+
bb2(%9 : @reborrow $Klass, %10 : @reborrow $Klass):
351+
%11 = borrowed %10 : $Klass from (%9 : $Klass)
352+
%12 = borrowed %9 : $Klass from ()
353+
br bb3(%12 : $Klass, %11 : $Klass)
354+
355+
bb3(%14 : @reborrow $Klass, %15 : @reborrow $Klass):
356+
%16 = borrowed %15 : $Klass from (%14 : $Klass)
357+
%17 = borrowed %14 : $Klass from ()
358+
end_borrow %16 : $Klass
359+
end_borrow %17 : $Klass
360+
%20 = tuple ()
361+
return %20 : $()
362+
}
363+

0 commit comments

Comments
 (0)