Skip to content

Commit 18e379b

Browse files
committed
Reapply "[CodeGen] Remove applySplitCriticalEdges in MachineDominatorTree (llvm#97055)"
This reverts commit 6a90769.
1 parent 00fd188 commit 18e379b

22 files changed

+65
-287
lines changed

llvm/include/llvm/CodeGen/MachineBasicBlock.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ namespace llvm {
3333

3434
class BasicBlock;
3535
class MachineFunction;
36+
class MachineDomTreeUpdater;
3637
class MCSymbol;
3738
class ModuleSlotTracker;
3839
class Pass;
@@ -968,7 +969,8 @@ class MachineBasicBlock
968969
/// MachineLoopInfo, as applicable.
969970
MachineBasicBlock *
970971
SplitCriticalEdge(MachineBasicBlock *Succ, Pass &P,
971-
std::vector<SparseBitVector<>> *LiveInSets = nullptr);
972+
std::vector<SparseBitVector<>> *LiveInSets = nullptr,
973+
MachineDomTreeUpdater *MDTU = nullptr);
972974

973975
/// Check if the edge between this block and the given successor \p
974976
/// Succ, can be split. If this returns true a subsequent call to

llvm/include/llvm/CodeGen/MachineDominators.h

Lines changed: 2 additions & 167 deletions
Original file line numberDiff line numberDiff line change
@@ -73,86 +73,22 @@ extern template bool Verify<MBBDomTree>(const MBBDomTree &DT,
7373
/// compute a normal dominator tree.
7474
///
7575
class MachineDominatorTree : public DomTreeBase<MachineBasicBlock> {
76-
/// Helper structure used to hold all the basic blocks
77-
/// involved in the split of a critical edge.
78-
struct CriticalEdge {
79-
MachineBasicBlock *FromBB;
80-
MachineBasicBlock *ToBB;
81-
MachineBasicBlock *NewBB;
82-
};
83-
84-
/// Pile up all the critical edges to be split.
85-
/// The splitting of a critical edge is local and thus, it is possible
86-
/// to apply several of those changes at the same time.
87-
mutable SmallVector<CriticalEdge, 32> CriticalEdgesToSplit;
88-
89-
/// Remember all the basic blocks that are inserted during
90-
/// edge splitting.
91-
/// Invariant: NewBBs == all the basic blocks contained in the NewBB
92-
/// field of all the elements of CriticalEdgesToSplit.
93-
/// I.e., forall elt in CriticalEdgesToSplit, it exists BB in NewBBs
94-
/// such as BB == elt.NewBB.
95-
mutable SmallSet<MachineBasicBlock *, 32> NewBBs;
96-
97-
/// Apply all the recorded critical edges to the DT.
98-
/// This updates the underlying DT information in a way that uses
99-
/// the fast query path of DT as much as possible.
100-
/// FIXME: This method should not be a const member!
101-
///
102-
/// \post CriticalEdgesToSplit.empty().
103-
void applySplitCriticalEdges() const;
10476

10577
public:
10678
using Base = DomTreeBase<MachineBasicBlock>;
10779

10880
MachineDominatorTree() = default;
109-
explicit MachineDominatorTree(MachineFunction &MF) { calculate(MF); }
81+
explicit MachineDominatorTree(MachineFunction &MF) { recalculate(MF); }
11082

11183
/// Handle invalidation explicitly.
11284
bool invalidate(MachineFunction &, const PreservedAnalyses &PA,
11385
MachineFunctionAnalysisManager::Invalidator &);
11486

115-
// FIXME: If there is an updater for MachineDominatorTree,
116-
// migrate to this updater and remove these wrappers.
117-
118-
MachineDominatorTree &getBase() {
119-
applySplitCriticalEdges();
120-
return *this;
121-
}
122-
123-
MachineBasicBlock *getRoot() const {
124-
applySplitCriticalEdges();
125-
return Base::getRoot();
126-
}
127-
128-
MachineDomTreeNode *getRootNode() const {
129-
applySplitCriticalEdges();
130-
return const_cast<MachineDomTreeNode *>(Base::getRootNode());
131-
}
132-
133-
void calculate(MachineFunction &F);
134-
135-
bool dominates(const MachineDomTreeNode *A,
136-
const MachineDomTreeNode *B) const {
137-
applySplitCriticalEdges();
138-
return Base::dominates(A, B);
139-
}
140-
141-
void getDescendants(MachineBasicBlock *A,
142-
SmallVectorImpl<MachineBasicBlock *> &Result) {
143-
applySplitCriticalEdges();
144-
Base::getDescendants(A, Result);
145-
}
146-
147-
bool dominates(const MachineBasicBlock *A, const MachineBasicBlock *B) const {
148-
applySplitCriticalEdges();
149-
return Base::dominates(A, B);
150-
}
87+
using Base::dominates;
15188

15289
// dominates - Return true if A dominates B. This performs the
15390
// special checks necessary if A and B are in the same basic block.
15491
bool dominates(const MachineInstr *A, const MachineInstr *B) const {
155-
applySplitCriticalEdges();
15692
const MachineBasicBlock *BBA = A->getParent(), *BBB = B->getParent();
15793
if (BBA != BBB)
15894
return Base::dominates(BBA, BBB);
@@ -164,107 +100,6 @@ class MachineDominatorTree : public DomTreeBase<MachineBasicBlock> {
164100

165101
return &*I == A;
166102
}
167-
168-
bool properlyDominates(const MachineDomTreeNode *A,
169-
const MachineDomTreeNode *B) const {
170-
applySplitCriticalEdges();
171-
return Base::properlyDominates(A, B);
172-
}
173-
174-
bool properlyDominates(const MachineBasicBlock *A,
175-
const MachineBasicBlock *B) const {
176-
applySplitCriticalEdges();
177-
return Base::properlyDominates(A, B);
178-
}
179-
180-
/// findNearestCommonDominator - Find nearest common dominator basic block
181-
/// for basic block A and B. If there is no such block then return NULL.
182-
MachineBasicBlock *findNearestCommonDominator(MachineBasicBlock *A,
183-
MachineBasicBlock *B) {
184-
applySplitCriticalEdges();
185-
return Base::findNearestCommonDominator(A, B);
186-
}
187-
188-
MachineDomTreeNode *operator[](MachineBasicBlock *BB) const {
189-
applySplitCriticalEdges();
190-
return Base::getNode(BB);
191-
}
192-
193-
/// getNode - return the (Post)DominatorTree node for the specified basic
194-
/// block. This is the same as using operator[] on this class.
195-
///
196-
MachineDomTreeNode *getNode(MachineBasicBlock *BB) const {
197-
applySplitCriticalEdges();
198-
return Base::getNode(BB);
199-
}
200-
201-
/// addNewBlock - Add a new node to the dominator tree information. This
202-
/// creates a new node as a child of DomBB dominator node,linking it into
203-
/// the children list of the immediate dominator.
204-
MachineDomTreeNode *addNewBlock(MachineBasicBlock *BB,
205-
MachineBasicBlock *DomBB) {
206-
applySplitCriticalEdges();
207-
return Base::addNewBlock(BB, DomBB);
208-
}
209-
210-
/// changeImmediateDominator - This method is used to update the dominator
211-
/// tree information when a node's immediate dominator changes.
212-
///
213-
void changeImmediateDominator(MachineBasicBlock *N,
214-
MachineBasicBlock *NewIDom) {
215-
applySplitCriticalEdges();
216-
Base::changeImmediateDominator(N, NewIDom);
217-
}
218-
219-
void changeImmediateDominator(MachineDomTreeNode *N,
220-
MachineDomTreeNode *NewIDom) {
221-
applySplitCriticalEdges();
222-
Base::changeImmediateDominator(N, NewIDom);
223-
}
224-
225-
/// eraseNode - Removes a node from the dominator tree. Block must not
226-
/// dominate any other blocks. Removes node from its immediate dominator's
227-
/// children list. Deletes dominator node associated with basic block BB.
228-
void eraseNode(MachineBasicBlock *BB) {
229-
applySplitCriticalEdges();
230-
Base::eraseNode(BB);
231-
}
232-
233-
/// splitBlock - BB is split and now it has one successor. Update dominator
234-
/// tree to reflect this change.
235-
void splitBlock(MachineBasicBlock* NewBB) {
236-
applySplitCriticalEdges();
237-
Base::splitBlock(NewBB);
238-
}
239-
240-
/// isReachableFromEntry - Return true if A is dominated by the entry
241-
/// block of the function containing it.
242-
bool isReachableFromEntry(const MachineBasicBlock *A) {
243-
applySplitCriticalEdges();
244-
return Base::isReachableFromEntry(A);
245-
}
246-
247-
/// Record that the critical edge (FromBB, ToBB) has been
248-
/// split with NewBB.
249-
/// This is best to use this method instead of directly update the
250-
/// underlying information, because this helps mitigating the
251-
/// number of time the DT information is invalidated.
252-
///
253-
/// \note Do not use this method with regular edges.
254-
///
255-
/// \note To benefit from the compile time improvement incurred by this
256-
/// method, the users of this method have to limit the queries to the DT
257-
/// interface between two edges splitting. In other words, they have to
258-
/// pack the splitting of critical edges as much as possible.
259-
void recordSplitCriticalEdge(MachineBasicBlock *FromBB,
260-
MachineBasicBlock *ToBB,
261-
MachineBasicBlock *NewBB) {
262-
bool Inserted = NewBBs.insert(NewBB).second;
263-
(void)Inserted;
264-
assert(Inserted &&
265-
"A basic block inserted via edge splitting cannot appear twice");
266-
CriticalEdgesToSplit.push_back({FromBB, ToBB, NewBB});
267-
}
268103
};
269104

270105
/// \brief Analysis pass which computes a \c MachineDominatorTree.

llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1698,7 +1698,7 @@ void AsmPrinter::emitFunctionBody() {
16981698
MDT = MDTWrapper ? &MDTWrapper->getDomTree() : nullptr;
16991699
if (!MDT) {
17001700
OwnedMDT = std::make_unique<MachineDominatorTree>();
1701-
OwnedMDT->getBase().recalculate(*MF);
1701+
OwnedMDT->recalculate(*MF);
17021702
MDT = OwnedMDT.get();
17031703
}
17041704

@@ -1707,7 +1707,7 @@ void AsmPrinter::emitFunctionBody() {
17071707
MLI = MLIWrapper ? &MLIWrapper->getLI() : nullptr;
17081708
if (!MLI) {
17091709
OwnedMLI = std::make_unique<MachineLoopInfo>();
1710-
OwnedMLI->analyze(MDT->getBase());
1710+
OwnedMLI->analyze(*MDT);
17111711
MLI = OwnedMLI.get();
17121712
}
17131713
}

llvm/lib/CodeGen/LazyMachineBlockFrequencyInfo.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,13 +78,13 @@ LazyMachineBlockFrequencyInfoPass::calculateIfNotAvailable() const {
7878
if (!MDT) {
7979
LLVM_DEBUG(dbgs() << "Building DominatorTree on the fly\n");
8080
OwnedMDT = std::make_unique<MachineDominatorTree>();
81-
OwnedMDT->getBase().recalculate(*MF);
81+
OwnedMDT->recalculate(*MF);
8282
MDT = OwnedMDT.get();
8383
}
8484

8585
// Generate LoopInfo from it.
8686
OwnedMLI = std::make_unique<MachineLoopInfo>();
87-
OwnedMLI->analyze(MDT->getBase());
87+
OwnedMLI->analyze(*MDT);
8888
MLI = OwnedMLI.get();
8989
}
9090

llvm/lib/CodeGen/LiveDebugValues/InstrRefBasedImpl.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2754,7 +2754,7 @@ void InstrRefBasedLDV::BlockPHIPlacement(
27542754
// Apply IDF calculator to the designated set of location defs, storing
27552755
// required PHIs into PHIBlocks. Uses the dominator tree stored in the
27562756
// InstrRefBasedLDV object.
2757-
IDFCalculatorBase<MachineBasicBlock, false> IDF(DomTree->getBase());
2757+
IDFCalculatorBase<MachineBasicBlock, false> IDF(*DomTree);
27582758

27592759
IDF.setLiveInBlocks(AllBlocks);
27602760
IDF.setDefiningBlocks(DefBlocks);

llvm/lib/CodeGen/LiveDebugValues/LiveDebugValues.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ bool LiveDebugValues::runOnMachineFunction(MachineFunction &MF) {
120120
MachineDominatorTree *DomTree = nullptr;
121121
if (InstrRefBased) {
122122
DomTree = &MDT;
123-
MDT.calculate(MF);
123+
MDT.recalculate(MF);
124124
TheImpl = &*InstrRefImpl;
125125
}
126126

llvm/lib/CodeGen/MachineBasicBlock.cpp

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,13 @@
1616
#include "llvm/CodeGen/LiveIntervals.h"
1717
#include "llvm/CodeGen/LivePhysRegs.h"
1818
#include "llvm/CodeGen/LiveVariables.h"
19+
#include "llvm/CodeGen/MachineDomTreeUpdater.h"
1920
#include "llvm/CodeGen/MachineDominators.h"
2021
#include "llvm/CodeGen/MachineFunction.h"
2122
#include "llvm/CodeGen/MachineInstrBuilder.h"
2223
#include "llvm/CodeGen/MachineJumpTableInfo.h"
2324
#include "llvm/CodeGen/MachineLoopInfo.h"
25+
#include "llvm/CodeGen/MachinePostDominators.h"
2426
#include "llvm/CodeGen/MachineRegisterInfo.h"
2527
#include "llvm/CodeGen/SlotIndexes.h"
2628
#include "llvm/CodeGen/TargetInstrInfo.h"
@@ -1135,9 +1137,10 @@ class SlotIndexUpdateDelegate : public MachineFunction::Delegate {
11351137
}
11361138
};
11371139

1138-
MachineBasicBlock *MachineBasicBlock::SplitCriticalEdge(
1139-
MachineBasicBlock *Succ, Pass &P,
1140-
std::vector<SparseBitVector<>> *LiveInSets) {
1140+
MachineBasicBlock *
1141+
MachineBasicBlock::SplitCriticalEdge(MachineBasicBlock *Succ, Pass &P,
1142+
std::vector<SparseBitVector<>> *LiveInSets,
1143+
MachineDomTreeUpdater *MDTU) {
11411144
if (!canSplitCriticalEdge(Succ))
11421145
return nullptr;
11431146

@@ -1339,9 +1342,10 @@ MachineBasicBlock *MachineBasicBlock::SplitCriticalEdge(
13391342
LIS->repairIntervalsInRange(this, getFirstTerminator(), end(), UsedRegs);
13401343
}
13411344

1342-
if (auto *MDTWrapper =
1343-
P.getAnalysisIfAvailable<MachineDominatorTreeWrapperPass>())
1344-
MDTWrapper->getDomTree().recordSplitCriticalEdge(this, Succ, NMBB);
1345+
if (MDTU)
1346+
MDTU->applyUpdates({{MachineDominatorTree::Insert, this, NMBB},
1347+
{MachineDominatorTree::Insert, NMBB, Succ},
1348+
{MachineDominatorTree::Delete, this, Succ}});
13451349

13461350
auto *MLIWrapper = P.getAnalysisIfAvailable<MachineLoopInfoWrapperPass>();
13471351
if (MachineLoopInfo *MLI = MLIWrapper ? &MLIWrapper->getLI() : nullptr)

llvm/lib/CodeGen/MachineDominanceFrontier.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,7 @@ char &llvm::MachineDominanceFrontierID = MachineDominanceFrontier::ID;
3838

3939
bool MachineDominanceFrontier::runOnMachineFunction(MachineFunction &) {
4040
releaseMemory();
41-
Base.analyze(
42-
getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree().getBase());
41+
Base.analyze(getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree());
4342
return false;
4443
}
4544

0 commit comments

Comments
 (0)