@@ -1948,6 +1948,29 @@ bool UniqueStorageUseVisitor::findUses(UniqueStorageUseVisitor &visitor) {
1948
1948
return visitAccessStorageUses (gather, visitor.storage , visitor.function );
1949
1949
}
1950
1950
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
+
1951
1974
bool GatherUniqueStorageUses::visitUse (Operand *use, AccessUseType useTy) {
1952
1975
unsigned operIdx = use->getOperandNumber ();
1953
1976
auto *user = use->getUser ();
@@ -1960,16 +1983,19 @@ bool GatherUniqueStorageUses::visitUse(Operand *use, AccessUseType useTy) {
1960
1983
case SILArgumentConvention::Indirect_Inout:
1961
1984
case SILArgumentConvention::Indirect_InoutAliasable:
1962
1985
case SILArgumentConvention::Indirect_Out:
1963
- return visitor.visitStore (use);
1986
+ return visitApplyOperand (use, visitor,
1987
+ &UniqueStorageUseVisitor::visitStore);
1964
1988
case SILArgumentConvention::Indirect_In_Guaranteed:
1965
1989
case SILArgumentConvention::Indirect_In:
1966
1990
case SILArgumentConvention::Indirect_In_Constant:
1967
- return visitor.visitLoad (use);
1991
+ return visitApplyOperand (use, visitor,
1992
+ &UniqueStorageUseVisitor::visitLoad);
1968
1993
case SILArgumentConvention::Direct_Unowned:
1969
1994
case SILArgumentConvention::Direct_Owned:
1970
1995
case SILArgumentConvention::Direct_Guaranteed:
1971
1996
// most likely an escape of a box
1972
- return visitor.visitUnknownUse (use);
1997
+ return visitApplyOperand (use, visitor,
1998
+ &UniqueStorageUseVisitor::visitUnknownUse);
1973
1999
}
1974
2000
}
1975
2001
switch (user->getKind ()) {
0 commit comments