Skip to content

Commit 5217cd0

Browse files
paperchalicenikic
authored andcommitted
Reapply "[CodeGen] Remove applySplitCriticalEdges in MachineDominatorTree (llvm#97055)"
This reverts commit 6a90769.
1 parent 7d0a584 commit 5217cd0

23 files changed

+76
-298
lines changed

llvm/include/llvm/CodeGen/MachineBasicBlock.h

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
namespace llvm {
3333

3434
class BasicBlock;
35+
class MachineDomTreeUpdater;
3536
class MachineFunction;
3637
class MCSymbol;
3738
class ModuleSlotTracker;
@@ -970,15 +971,17 @@ class MachineBasicBlock
970971
/// MachineLoopInfo, as applicable.
971972
MachineBasicBlock *
972973
SplitCriticalEdge(MachineBasicBlock *Succ, Pass &P,
973-
std::vector<SparseBitVector<>> *LiveInSets = nullptr) {
974-
return SplitCriticalEdge(Succ, &P, nullptr, LiveInSets);
974+
std::vector<SparseBitVector<>> *LiveInSets = nullptr,
975+
MachineDomTreeUpdater *MDTU = nullptr) {
976+
return SplitCriticalEdge(Succ, &P, nullptr, LiveInSets, MDTU);
975977
}
976978

977979
MachineBasicBlock *
978980
SplitCriticalEdge(MachineBasicBlock *Succ,
979981
MachineFunctionAnalysisManager &MFAM,
980-
std::vector<SparseBitVector<>> *LiveInSets = nullptr) {
981-
return SplitCriticalEdge(Succ, nullptr, &MFAM, LiveInSets);
982+
std::vector<SparseBitVector<>> *LiveInSets = nullptr,
983+
MachineDomTreeUpdater *MDTU = nullptr) {
984+
return SplitCriticalEdge(Succ, nullptr, &MFAM, LiveInSets, MDTU);
982985
}
983986

984987
/// Check if the edge between this block and the given successor \p
@@ -1256,10 +1259,9 @@ class MachineBasicBlock
12561259
void removePredecessor(MachineBasicBlock *Pred);
12571260

12581261
// Helper method for new pass manager migration.
1259-
MachineBasicBlock *
1260-
SplitCriticalEdge(MachineBasicBlock *Succ, Pass *P,
1261-
MachineFunctionAnalysisManager *MFAM,
1262-
std::vector<SparseBitVector<>> *LiveInSets);
1262+
MachineBasicBlock *SplitCriticalEdge(
1263+
MachineBasicBlock *Succ, Pass *P, MachineFunctionAnalysisManager *MFAM,
1264+
std::vector<SparseBitVector<>> *LiveInSets, MachineDomTreeUpdater *MDTU);
12631265
};
12641266

12651267
raw_ostream& operator<<(raw_ostream &OS, const MachineBasicBlock &MBB);

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
@@ -74,13 +74,13 @@ LazyMachineBlockFrequencyInfoPass::calculateIfNotAvailable() const {
7474
if (!MDT) {
7575
LLVM_DEBUG(dbgs() << "Building DominatorTree on the fly\n");
7676
OwnedMDT = std::make_unique<MachineDominatorTree>();
77-
OwnedMDT->getBase().recalculate(*MF);
77+
OwnedMDT->recalculate(*MF);
7878
MDT = OwnedMDT.get();
7979
}
8080

8181
// Generate LoopInfo from it.
8282
OwnedMLI = std::make_unique<MachineLoopInfo>();
83-
OwnedMLI->analyze(MDT->getBase());
83+
OwnedMLI->analyze(*MDT);
8484
MLI = OwnedMLI.get();
8585
}
8686

llvm/lib/CodeGen/LiveDebugValues/InstrRefBasedImpl.cpp

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

27922792
IDF.setLiveInBlocks(AllBlocks);
27932793
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: 7 additions & 3 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"
@@ -1146,7 +1148,7 @@ class SlotIndexUpdateDelegate : public MachineFunction::Delegate {
11461148

11471149
MachineBasicBlock *MachineBasicBlock::SplitCriticalEdge(
11481150
MachineBasicBlock *Succ, Pass *P, MachineFunctionAnalysisManager *MFAM,
1149-
std::vector<SparseBitVector<>> *LiveInSets) {
1151+
std::vector<SparseBitVector<>> *LiveInSets, MachineDomTreeUpdater *MDTU) {
11501152
assert((P || MFAM) && "Need a way to get analysis results!");
11511153
if (!canSplitCriticalEdge(Succ))
11521154
return nullptr;
@@ -1346,8 +1348,10 @@ MachineBasicBlock *MachineBasicBlock::SplitCriticalEdge(
13461348
LIS->repairIntervalsInRange(this, getFirstTerminator(), end(), UsedRegs);
13471349
}
13481350

1349-
if (auto *MDT = GET_RESULT(MachineDominatorTree, getDomTree, ))
1350-
MDT->recordSplitCriticalEdge(this, Succ, NMBB);
1351+
if (MDTU)
1352+
MDTU->applyUpdates({{MachineDominatorTree::Insert, this, NMBB},
1353+
{MachineDominatorTree::Insert, NMBB, Succ},
1354+
{MachineDominatorTree::Delete, this, Succ}});
13511355

13521356
if (MachineLoopInfo *MLI = GET_RESULT(MachineLoop, getLI, Info))
13531357
if (MachineLoop *TIL = MLI->getLoopFor(this)) {

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)