diff options
-rw-r--r-- | llvm/include/llvm/IR/Dominators.h | 6 | ||||
-rw-r--r-- | llvm/include/llvm/Support/GenericDomTree.h | 9 | ||||
-rw-r--r-- | llvm/include/llvm/Support/GenericDomTreeConstruction.h | 19 | ||||
-rw-r--r-- | llvm/lib/IR/Dominators.cpp | 5 |
4 files changed, 39 insertions, 0 deletions
diff --git a/llvm/include/llvm/IR/Dominators.h b/llvm/include/llvm/IR/Dominators.h index 47032c00481..f7da47d0766 100644 --- a/llvm/include/llvm/IR/Dominators.h +++ b/llvm/include/llvm/IR/Dominators.h @@ -46,6 +46,9 @@ using BBPostDomTree = PostDomTreeBase<BasicBlock>; using BBUpdates = ArrayRef<llvm::cfg::Update<BasicBlock *>>; extern template void Calculate<BBDomTree>(BBDomTree &DT); +extern template void CalculateWithUpdates<BBDomTree>(BBDomTree &DT, + BBUpdates U); + extern template void Calculate<BBPostDomTree>(BBPostDomTree &DT); extern template void InsertEdge<BBDomTree>(BBDomTree &DT, BasicBlock *From, @@ -145,6 +148,9 @@ class DominatorTree : public DominatorTreeBase<BasicBlock, false> { DominatorTree() = default; explicit DominatorTree(Function &F) { recalculate(F); } + explicit DominatorTree(DominatorTree &DT, DomTreeBuilder::BBUpdates U) { + recalculate(*DT.Parent, U); + } /// Handle invalidation explicitly. bool invalidate(Function &F, const PreservedAnalyses &PA, diff --git a/llvm/include/llvm/Support/GenericDomTree.h b/llvm/include/llvm/Support/GenericDomTree.h index 3c3ec092101..b3018bac310 100644 --- a/llvm/include/llvm/Support/GenericDomTree.h +++ b/llvm/include/llvm/Support/GenericDomTree.h @@ -193,6 +193,10 @@ template <typename DomTreeT> void Calculate(DomTreeT &DT); template <typename DomTreeT> +void CalculateWithUpdates(DomTreeT &DT, + ArrayRef<typename DomTreeT::UpdateType> Updates); + +template <typename DomTreeT> void InsertEdge(DomTreeT &DT, typename DomTreeT::NodePtr From, typename DomTreeT::NodePtr To); @@ -730,6 +734,11 @@ public: DomTreeBuilder::Calculate(*this); } + void recalculate(ParentType &Func, ArrayRef<UpdateType> Updates) { + Parent = &Func; + DomTreeBuilder::CalculateWithUpdates(*this, Updates); + } + /// verify - checks if the tree is correct. There are 3 level of verification: /// - Full -- verifies if the tree is correct by making sure all the /// properties (including the parent and the sibling property) diff --git a/llvm/include/llvm/Support/GenericDomTreeConstruction.h b/llvm/include/llvm/Support/GenericDomTreeConstruction.h index 80d3b276c6d..5eb09430de0 100644 --- a/llvm/include/llvm/Support/GenericDomTreeConstruction.h +++ b/llvm/include/llvm/Support/GenericDomTreeConstruction.h @@ -1576,6 +1576,25 @@ void Calculate(DomTreeT &DT) { SemiNCAInfo<DomTreeT>::CalculateFromScratch(DT, nullptr); } +template <typename DomTreeT> +void CalculateWithUpdates(DomTreeT &DT, + ArrayRef<typename DomTreeT::UpdateType> Updates) { + // TODO: Move BUI creation in common method, reuse in ApplyUpdates. + typename SemiNCAInfo<DomTreeT>::BatchUpdateInfo BUI; + LLVM_DEBUG(dbgs() << "Legalizing " << BUI.Updates.size() << " updates\n"); + cfg::LegalizeUpdates<typename DomTreeT::NodePtr>(Updates, BUI.Updates, + DomTreeT::IsPostDominator); + const size_t NumLegalized = BUI.Updates.size(); + BUI.FutureSuccessors.reserve(NumLegalized); + BUI.FuturePredecessors.reserve(NumLegalized); + for (auto &U : BUI.Updates) { + BUI.FutureSuccessors[U.getFrom()].push_back({U.getTo(), U.getKind()}); + BUI.FuturePredecessors[U.getTo()].push_back({U.getFrom(), U.getKind()}); + } + + SemiNCAInfo<DomTreeT>::CalculateFromScratch(DT, &BUI); +} + template <class DomTreeT> void InsertEdge(DomTreeT &DT, typename DomTreeT::NodePtr From, typename DomTreeT::NodePtr To) { diff --git a/llvm/lib/IR/Dominators.cpp b/llvm/lib/IR/Dominators.cpp index dc4fa9eee66..c78f220439a 100644 --- a/llvm/lib/IR/Dominators.cpp +++ b/llvm/lib/IR/Dominators.cpp @@ -71,8 +71,13 @@ template class llvm::cfg::Update<BasicBlock *>; template void llvm::DomTreeBuilder::Calculate<DomTreeBuilder::BBDomTree>( DomTreeBuilder::BBDomTree &DT); +template void +llvm::DomTreeBuilder::CalculateWithUpdates<DomTreeBuilder::BBDomTree>( + DomTreeBuilder::BBDomTree &DT, BBUpdates U); + template void llvm::DomTreeBuilder::Calculate<DomTreeBuilder::BBPostDomTree>( DomTreeBuilder::BBPostDomTree &DT); +// No CalculateWithUpdates<PostDomTree> instantiation, unless a usecase arises. template void llvm::DomTreeBuilder::InsertEdge<DomTreeBuilder::BBDomTree>( DomTreeBuilder::BBDomTree &DT, BasicBlock *From, BasicBlock *To); |