@@ -1948,6 +1948,29 @@ bool UniqueStorageUseVisitor::findUses(UniqueStorageUseVisitor &visitor) {
19481948 return visitAccessStorageUses (gather, visitor.storage , visitor.function );
19491949}
19501950
1951+ static bool
1952+ visitApplyOperand (Operand *use, UniqueStorageUseVisitor &visitor,
1953+ bool (UniqueStorageUseVisitor::*visit)(Operand *)) {
1954+ auto *user = use->getUser ();
1955+ if (auto *bai = dyn_cast<BeginApplyInst>(user)) {
1956+ if (!(visitor.*visit)(use))
1957+ return false ;
1958+ SmallVector<Operand *, 2 > endApplyUses;
1959+ SmallVector<Operand *, 2 > abortApplyUses;
1960+ bai->getCoroutineEndPoints (endApplyUses, abortApplyUses);
1961+ for (auto *endApplyUse : endApplyUses) {
1962+ if (!(visitor.*visit)(endApplyUse))
1963+ return false ;
1964+ }
1965+ for (auto *abortApplyUse : abortApplyUses) {
1966+ if (!(visitor.*visit)(abortApplyUse))
1967+ return false ;
1968+ }
1969+ return true ;
1970+ }
1971+ return (visitor.*visit)(use);
1972+ }
1973+
19511974bool GatherUniqueStorageUses::visitUse (Operand *use, AccessUseType useTy) {
19521975 unsigned operIdx = use->getOperandNumber ();
19531976 auto *user = use->getUser ();
@@ -1960,16 +1983,19 @@ bool GatherUniqueStorageUses::visitUse(Operand *use, AccessUseType useTy) {
19601983 case SILArgumentConvention::Indirect_Inout:
19611984 case SILArgumentConvention::Indirect_InoutAliasable:
19621985 case SILArgumentConvention::Indirect_Out:
1963- return visitor.visitStore (use);
1986+ return visitApplyOperand (use, visitor,
1987+ &UniqueStorageUseVisitor::visitStore);
19641988 case SILArgumentConvention::Indirect_In_Guaranteed:
19651989 case SILArgumentConvention::Indirect_In:
19661990 case SILArgumentConvention::Indirect_In_Constant:
1967- return visitor.visitLoad (use);
1991+ return visitApplyOperand (use, visitor,
1992+ &UniqueStorageUseVisitor::visitLoad);
19681993 case SILArgumentConvention::Direct_Unowned:
19691994 case SILArgumentConvention::Direct_Owned:
19701995 case SILArgumentConvention::Direct_Guaranteed:
19711996 // most likely an escape of a box
1972- return visitor.visitUnknownUse (use);
1997+ return visitApplyOperand (use, visitor,
1998+ &UniqueStorageUseVisitor::visitUnknownUse);
19731999 }
19742000 }
19752001 switch (user->getKind ()) {
0 commit comments