Skip to content

Commit 2eb3a86

Browse files
committed
[NFC] SIL: Replaced a recursion with a worklist.
1 parent 8c7f148 commit 2eb3a86

File tree

1 file changed

+26
-23
lines changed

1 file changed

+26
-23
lines changed

lib/SIL/IR/SILInstruction.cpp

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1833,32 +1833,35 @@ visitRecursivelyLifetimeEndingUses(
18331833
llvm::function_ref<bool(Operand *)> visitScopeEnd,
18341834
llvm::function_ref<bool(Operand *)> visitUnknownUse) {
18351835

1836-
for (Operand *use : i->getConsumingUses()) {
1837-
noUsers = false;
1838-
if (isa<DestroyValueInst>(use->getUser())) {
1839-
if (!visitScopeEnd(use)) {
1840-
return false;
1836+
StackList<SILValue> values(i->getFunction());
1837+
values.push_back(i);
1838+
1839+
while (!values.empty()) {
1840+
auto value = values.pop_back_val();
1841+
for (Operand *use : value->getConsumingUses()) {
1842+
noUsers = false;
1843+
if (isa<DestroyValueInst>(use->getUser())) {
1844+
if (!visitScopeEnd(use)) {
1845+
return false;
1846+
}
1847+
continue;
18411848
}
1842-
continue;
1843-
}
1844-
if (auto *ret = dyn_cast<ReturnInst>(use->getUser())) {
1845-
auto fnTy = ret->getFunction()->getLoweredFunctionType();
1846-
assert(!fnTy->getLifetimeDependencies().empty());
1847-
if (!visitScopeEnd(use)) {
1848-
return false;
1849+
if (auto *ret = dyn_cast<ReturnInst>(use->getUser())) {
1850+
auto fnTy = ret->getFunction()->getLoweredFunctionType();
1851+
assert(!fnTy->getLifetimeDependencies().empty());
1852+
if (!visitScopeEnd(use)) {
1853+
return false;
1854+
}
1855+
continue;
18491856
}
1850-
continue;
1851-
}
1852-
// FIXME: Handle store to indirect result
1857+
// FIXME: Handle store to indirect result
18531858

1854-
auto *user = use->getUser();
1855-
if (user->getNumResults() == 0) {
1856-
return visitUnknownUse(use);
1857-
}
1858-
for (auto res : use->getUser()->getResults()) {
1859-
if (!visitRecursivelyLifetimeEndingUses(res, noUsers, visitScopeEnd,
1860-
visitUnknownUse)) {
1861-
return false;
1859+
auto *user = use->getUser();
1860+
if (user->getNumResults() == 0) {
1861+
return visitUnknownUse(use);
1862+
}
1863+
for (auto res : use->getUser()->getResults()) {
1864+
values.push_back(res);
18621865
}
18631866
}
18641867
}

0 commit comments

Comments
 (0)