diff --git a/llvm/include/llvm/Analysis/DominanceFrontier.h b/llvm/include/llvm/Analysis/DominanceFrontier.h --- a/llvm/include/llvm/Analysis/DominanceFrontier.h +++ b/llvm/include/llvm/Analysis/DominanceFrontier.h @@ -130,7 +130,7 @@ using DomSetType = typename DominanceFrontierBase::DomSetType; void analyze(DomTreeT &DT) { - assert(DT.getRoots().size() == 1 && + assert(DT.root_size() == 1 && "Only one entry block for forward domfronts!"); this->Roots = {DT.getRoot()}; calculate(DT, DT[this->Roots[0]]); diff --git a/llvm/include/llvm/CodeGen/MachineDominators.h b/llvm/include/llvm/CodeGen/MachineDominators.h --- a/llvm/include/llvm/CodeGen/MachineDominators.h +++ b/llvm/include/llvm/CodeGen/MachineDominators.h @@ -93,15 +93,6 @@ void getAnalysisUsage(AnalysisUsage &AU) const override; - /// getRoots - Return the root blocks of the current CFG. This may include - /// multiple blocks if we are computing post dominators. For forward - /// dominators, this will always be a single block (the entry node). - /// - const SmallVectorImpl &getRoots() const { - applySplitCriticalEdges(); - return DT->getRoots(); - } - MachineBasicBlock *getRoot() const { applySplitCriticalEdges(); return DT->getRoot(); diff --git a/llvm/include/llvm/CodeGen/MachinePostDominators.h b/llvm/include/llvm/CodeGen/MachinePostDominators.h --- a/llvm/include/llvm/CodeGen/MachinePostDominators.h +++ b/llvm/include/llvm/CodeGen/MachinePostDominators.h @@ -41,10 +41,6 @@ FunctionPass *createMachinePostDominatorTreePass(); - const SmallVectorImpl &getRoots() const { - return PDT->getRoots(); - } - MachineDomTreeNode *getRootNode() const { return PDT->getRootNode(); } MachineDomTreeNode *operator[](MachineBasicBlock *BB) const { diff --git a/llvm/include/llvm/Support/GenericDomTree.h b/llvm/include/llvm/Support/GenericDomTree.h --- a/llvm/include/llvm/Support/GenericDomTree.h +++ b/llvm/include/llvm/Support/GenericDomTree.h @@ -283,11 +283,27 @@ DominatorTreeBase(const DominatorTreeBase &) = delete; DominatorTreeBase &operator=(const DominatorTreeBase &) = delete; - /// getRoots - Return the root blocks of the current CFG. This may include - /// multiple blocks if we are computing post dominators. For forward - /// dominators, this will always be a single block (the entry node). + /// Iteration over roots. /// - const SmallVectorImpl &getRoots() const { return Roots; } + /// This may include multiple blocks if we are computing post dominators. + /// For forward dominators, this will always be a single block (the entry + /// block). + using root_iterator = typename SmallVectorImpl::iterator; + using const_root_iterator = typename SmallVectorImpl::const_iterator; + + root_iterator root_begin() { return Roots.begin(); } + const_root_iterator root_begin() const { return Roots.begin(); } + root_iterator root_end() { return Roots.end(); } + const_root_iterator root_end() const { return Roots.end(); } + + size_t root_size() const { return Roots.size(); } + + iterator_range roots() { + return make_range(root_begin(), root_end()); + } + iterator_range roots() const { + return make_range(root_begin(), root_end()); + } /// isPostDominator - Returns true if analysis based of postdoms /// diff --git a/llvm/include/llvm/Support/GenericDomTreeConstruction.h b/llvm/include/llvm/Support/GenericDomTreeConstruction.h --- a/llvm/include/llvm/Support/GenericDomTreeConstruction.h +++ b/llvm/include/llvm/Support/GenericDomTreeConstruction.h @@ -1372,7 +1372,7 @@ if (!DT.DFSInfoValid || !DT.Parent) return true; - const NodePtr RootBB = IsPostDom ? nullptr : DT.getRoots()[0]; + const NodePtr RootBB = IsPostDom ? nullptr : *DT.root_begin(); const TreeNodePtr Root = DT.getNode(RootBB); auto PrintNodeAndDFSNums = [](const TreeNodePtr TN) { diff --git a/llvm/lib/Target/AMDGPU/AMDGPUUnifyDivergentExitNodes.cpp b/llvm/lib/Target/AMDGPU/AMDGPUUnifyDivergentExitNodes.cpp --- a/llvm/lib/Target/AMDGPU/AMDGPUUnifyDivergentExitNodes.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUUnifyDivergentExitNodes.cpp @@ -199,8 +199,7 @@ // If there's only one exit, we don't need to do anything, unless this is a // pixel shader and that exit is an infinite loop, since we still have to // insert an export in that case. - if (PDT.getRoots().size() <= 1 && - F.getCallingConv() != CallingConv::AMDGPU_PS) + if (PDT.root_size() <= 1 && F.getCallingConv() != CallingConv::AMDGPU_PS) return false; LegacyDivergenceAnalysis &DA = getAnalysis(); @@ -217,7 +216,7 @@ bool InsertExport = false; bool Changed = false; - for (BasicBlock *BB : PDT.getRoots()) { + for (BasicBlock *BB : PDT.roots()) { if (isa(BB->getTerminator())) { if (!isUniformlyReached(DA, *BB)) ReturningBlocks.push_back(BB); diff --git a/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp b/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp --- a/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp +++ b/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp @@ -1853,7 +1853,7 @@ if (CommonPred) WorkList.insert(CommonPred); else - for (BasicBlock *R : PDT.getRoots()) + for (BasicBlock *R : PDT.roots()) WorkList.insert(R); NumCFGTries++; diff --git a/llvm/unittests/IR/DominatorTreeTest.cpp b/llvm/unittests/IR/DominatorTreeTest.cpp --- a/llvm/unittests/IR/DominatorTreeTest.cpp +++ b/llvm/unittests/IR/DominatorTreeTest.cpp @@ -805,7 +805,7 @@ BasicBlock *To = B.getOrAddBlock(LastUpdate->Edge.To); PDT.insertEdge(From, To); EXPECT_TRUE(PDT.verify()); - EXPECT_TRUE(PDT.getRoots().size() == 2); + EXPECT_EQ(PDT.root_size(), 2); // Make sure we can use a const pointer with getNode. const BasicBlock *BB5 = B.getOrAddBlock("5"); EXPECT_NE(PDT.getNode(BB5), nullptr);