@@ -1890,25 +1890,16 @@ bool PullbackCloner::Implementation::run() {
1890
1890
// ignored.
1891
1891
// The original blocks in traversal order for pullback generation.
1892
1892
SmallVector<SILBasicBlock *, 8 > originalBlocks;
1893
- // The set of visited original blocks .
1894
- SmallDenseSet<SILBasicBlock *, 8 > visitedBlocks ;
1893
+ // The workqueue used for bookkeeping during the breadth-first traversal .
1894
+ BasicBlockWorkqueue workqueue = {originalExitBlock} ;
1895
1895
1896
1896
// Perform BFS from the original exit block.
1897
1897
{
1898
- std::deque<SILBasicBlock *> worklist = {};
1899
- worklist.push_back (originalExitBlock);
1900
- visitedBlocks.insert (originalExitBlock);
1901
- while (!worklist.empty ()) {
1902
- auto *BB = worklist.front ();
1903
- worklist.pop_front ();
1904
-
1898
+ while (auto *BB = workqueue.pop ()) {
1905
1899
originalBlocks.push_back (BB);
1906
1900
1907
1901
for (auto *nextBB : BB->getPredecessorBlocks ()) {
1908
- if (!visitedBlocks.count (nextBB)) {
1909
- worklist.push_back (nextBB);
1910
- visitedBlocks.insert (nextBB);
1911
- }
1902
+ workqueue.pushIfNotVisited (nextBB);
1912
1903
}
1913
1904
}
1914
1905
}
@@ -2004,7 +1995,7 @@ bool PullbackCloner::Implementation::run() {
2004
1995
// pullback original block, passing adjoint values of active values.
2005
1996
for (auto *succBB : origBB->getSuccessorBlocks ()) {
2006
1997
// Skip generating pullback block for original unreachable blocks.
2007
- if (!visitedBlocks. count (succBB))
1998
+ if (!workqueue. isVisited (succBB))
2008
1999
continue ;
2009
2000
auto *pullbackTrampolineBB = pullback.createBasicBlockBefore (pullbackBB);
2010
2001
pullbackTrampolineBBMap.insert ({{origBB, succBB}, pullbackTrampolineBB});
0 commit comments