Skip to content

Commit 518c3ac

Browse files
committed
Updates to MemAccessUtils to handle borrowed address returns
1 parent 9e4fa8f commit 518c3ac

File tree

2 files changed

+20
-1
lines changed

2 files changed

+20
-1
lines changed

include/swift/SIL/MemAccessUtils.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,14 @@ inline SILValue stripAccessMarkers(SILValue v) {
164164
return v;
165165
}
166166

167+
inline bool isGuaranteedAddressReturn(SILValue value) {
168+
auto *defInst = dyn_cast_or_null<ApplyInst>(value->getDefiningInstruction());
169+
if (!defInst) {
170+
return false;
171+
}
172+
return defInst->getSubstCalleeConv().hasGuaranteedAddressResults();
173+
}
174+
167175
/// Return the source address after stripping as many access projections as
168176
/// possible without losing the address type.
169177
///
@@ -1802,6 +1810,12 @@ Result AccessUseDefChainVisitor<Impl, Result>::visit(SILValue sourceAddr) {
18021810
if (isExternalGlobalAddressor(cast<ApplyInst>(sourceAddr)))
18031811
return asImpl().visitUnidentified(sourceAddr);
18041812

1813+
if (isGuaranteedAddressReturn(sourceAddr)) {
1814+
return asImpl().visitAccessProjection(
1815+
cast<ApplyInst>(sourceAddr),
1816+
&cast<ApplyInst>(sourceAddr)->getSelfArgumentOperand());
1817+
}
1818+
18051819
// Don't currently allow any other calls to return an accessed address.
18061820
return asImpl().visitNonAccess(sourceAddr);
18071821
}

lib/SIL/Utils/MemAccessUtils.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1416,7 +1416,8 @@ class AccessPathVisitor : public FindAccessVisitorImpl<AccessPathVisitor> {
14161416
// copyable_to_moveonlywrapper_addr, we just look through it when
14171417
// we see it
14181418
|| isa<MoveOnlyWrapperToCopyableAddrInst>(projectedAddr) ||
1419-
isa<CopyableToMoveOnlyWrapperAddrInst>(projectedAddr));
1419+
isa<CopyableToMoveOnlyWrapperAddrInst>(projectedAddr) ||
1420+
isGuaranteedAddressReturn(projectedAddr));
14201421
}
14211422
return sourceAddr->get();
14221423
}
@@ -2029,6 +2030,9 @@ bool AccessPathDefUseTraversal::visitUser(DFSEntry dfs) {
20292030
&& visitSingleValueUser(svi, dfs) == IgnoredUse) {
20302031
return true;
20312032
}
2033+
if (isGuaranteedAddressReturn(svi)) {
2034+
pushUsers(svi, dfs);
2035+
}
20322036
}
20332037
if (auto *sbi = dyn_cast<StoreBorrowInst>(use->getUser())) {
20342038
if (use->get() == sbi->getDest()) {
@@ -2038,6 +2042,7 @@ bool AccessPathDefUseTraversal::visitUser(DFSEntry dfs) {
20382042
if (isa<EndBorrowInst>(use->getUser())) {
20392043
return true;
20402044
}
2045+
20412046
// We weren't able to "see through" any more address conversions; so
20422047
// record this as a use.
20432048

0 commit comments

Comments
 (0)