Skip to content

Commit d4b3f19

Browse files
committed
[DomTree] Add constructor to create a new DT based on current DT/CFG and a set of Updates.
Summary: Add the posibility of creating a new DT using a set of Updates. This will essentially create a DT based on a CFG snapshot/view. Additional refactoring for either this patch or follow-ups: - create an utility for building BUI. - replace BUI with a GraphDiff. Reviewers: kuhar Subscribers: sanjoy, jlebar, llvm-commits Differential Revision: https://reviews.llvm.org/D50671 llvm-svn: 339947
1 parent 883ff69 commit d4b3f19

File tree

4 files changed

+39
-0
lines changed

4 files changed

+39
-0
lines changed

llvm/include/llvm/IR/Dominators.h

+6
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@ using BBPostDomTree = PostDomTreeBase<BasicBlock>;
4646
using BBUpdates = ArrayRef<llvm::cfg::Update<BasicBlock *>>;
4747

4848
extern template void Calculate<BBDomTree>(BBDomTree &DT);
49+
extern template void CalculateWithUpdates<BBDomTree>(BBDomTree &DT,
50+
BBUpdates U);
51+
4952
extern template void Calculate<BBPostDomTree>(BBPostDomTree &DT);
5053

5154
extern template void InsertEdge<BBDomTree>(BBDomTree &DT, BasicBlock *From,
@@ -145,6 +148,9 @@ class DominatorTree : public DominatorTreeBase<BasicBlock, false> {
145148

146149
DominatorTree() = default;
147150
explicit DominatorTree(Function &F) { recalculate(F); }
151+
explicit DominatorTree(DominatorTree &DT, DomTreeBuilder::BBUpdates U) {
152+
recalculate(*DT.Parent, U);
153+
}
148154

149155
/// Handle invalidation explicitly.
150156
bool invalidate(Function &F, const PreservedAnalyses &PA,

llvm/include/llvm/Support/GenericDomTree.h

+9
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,10 @@ namespace DomTreeBuilder {
192192
template <typename DomTreeT>
193193
void Calculate(DomTreeT &DT);
194194

195+
template <typename DomTreeT>
196+
void CalculateWithUpdates(DomTreeT &DT,
197+
ArrayRef<typename DomTreeT::UpdateType> Updates);
198+
195199
template <typename DomTreeT>
196200
void InsertEdge(DomTreeT &DT, typename DomTreeT::NodePtr From,
197201
typename DomTreeT::NodePtr To);
@@ -730,6 +734,11 @@ class DominatorTreeBase {
730734
DomTreeBuilder::Calculate(*this);
731735
}
732736

737+
void recalculate(ParentType &Func, ArrayRef<UpdateType> Updates) {
738+
Parent = &Func;
739+
DomTreeBuilder::CalculateWithUpdates(*this, Updates);
740+
}
741+
733742
/// verify - checks if the tree is correct. There are 3 level of verification:
734743
/// - Full -- verifies if the tree is correct by making sure all the
735744
/// properties (including the parent and the sibling property)

llvm/include/llvm/Support/GenericDomTreeConstruction.h

+19
Original file line numberDiff line numberDiff line change
@@ -1576,6 +1576,25 @@ void Calculate(DomTreeT &DT) {
15761576
SemiNCAInfo<DomTreeT>::CalculateFromScratch(DT, nullptr);
15771577
}
15781578

1579+
template <typename DomTreeT>
1580+
void CalculateWithUpdates(DomTreeT &DT,
1581+
ArrayRef<typename DomTreeT::UpdateType> Updates) {
1582+
// TODO: Move BUI creation in common method, reuse in ApplyUpdates.
1583+
typename SemiNCAInfo<DomTreeT>::BatchUpdateInfo BUI;
1584+
LLVM_DEBUG(dbgs() << "Legalizing " << BUI.Updates.size() << " updates\n");
1585+
cfg::LegalizeUpdates<typename DomTreeT::NodePtr>(Updates, BUI.Updates,
1586+
DomTreeT::IsPostDominator);
1587+
const size_t NumLegalized = BUI.Updates.size();
1588+
BUI.FutureSuccessors.reserve(NumLegalized);
1589+
BUI.FuturePredecessors.reserve(NumLegalized);
1590+
for (auto &U : BUI.Updates) {
1591+
BUI.FutureSuccessors[U.getFrom()].push_back({U.getTo(), U.getKind()});
1592+
BUI.FuturePredecessors[U.getTo()].push_back({U.getFrom(), U.getKind()});
1593+
}
1594+
1595+
SemiNCAInfo<DomTreeT>::CalculateFromScratch(DT, &BUI);
1596+
}
1597+
15791598
template <class DomTreeT>
15801599
void InsertEdge(DomTreeT &DT, typename DomTreeT::NodePtr From,
15811600
typename DomTreeT::NodePtr To) {

llvm/lib/IR/Dominators.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,13 @@ template class llvm::cfg::Update<BasicBlock *>;
7171

7272
template void llvm::DomTreeBuilder::Calculate<DomTreeBuilder::BBDomTree>(
7373
DomTreeBuilder::BBDomTree &DT);
74+
template void
75+
llvm::DomTreeBuilder::CalculateWithUpdates<DomTreeBuilder::BBDomTree>(
76+
DomTreeBuilder::BBDomTree &DT, BBUpdates U);
77+
7478
template void llvm::DomTreeBuilder::Calculate<DomTreeBuilder::BBPostDomTree>(
7579
DomTreeBuilder::BBPostDomTree &DT);
80+
// No CalculateWithUpdates<PostDomTree> instantiation, unless a usecase arises.
7681

7782
template void llvm::DomTreeBuilder::InsertEdge<DomTreeBuilder::BBDomTree>(
7883
DomTreeBuilder::BBDomTree &DT, BasicBlock *From, BasicBlock *To);

0 commit comments

Comments
 (0)