Skip to content

Commit f01f2a2

Browse files
committed
[CodeGen][NewPM] Split MachinePostDominators into a concrete analysis result
`MachinePostDominators` of #94571
1 parent a7d28f5 commit f01f2a2

17 files changed

+122
-120
lines changed

llvm/include/llvm/CodeGen/MachinePostDominators.h

Lines changed: 39 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -15,78 +15,63 @@
1515
#define LLVM_CODEGEN_MACHINEPOSTDOMINATORS_H
1616

1717
#include "llvm/CodeGen/MachineDominators.h"
18-
#include "llvm/CodeGen/MachineFunctionPass.h"
19-
#include <memory>
2018

2119
namespace llvm {
2220

21+
extern template class DominatorTreeBase<MachineBasicBlock, true>; // PostDomTree
22+
23+
namespace DomTreeBuilder {
24+
using MBBPostDomTree = PostDomTreeBase<MachineBasicBlock>;
25+
using MBBPostDomTreeGraphDiff = GraphDiff<MachineBasicBlock *, true>;
26+
27+
extern template void Calculate<MBBPostDomTree>(MBBPostDomTree &DT);
28+
extern template void InsertEdge<MBBPostDomTree>(MBBPostDomTree &DT,
29+
MachineBasicBlock *From,
30+
MachineBasicBlock *To);
31+
extern template void DeleteEdge<MBBPostDomTree>(MBBPostDomTree &DT,
32+
MachineBasicBlock *From,
33+
MachineBasicBlock *To);
34+
extern template void ApplyUpdates<MBBPostDomTree>(MBBPostDomTree &DT,
35+
MBBPostDomTreeGraphDiff &,
36+
MBBPostDomTreeGraphDiff *);
37+
extern template bool
38+
Verify<MBBPostDomTree>(const MBBPostDomTree &DT,
39+
MBBPostDomTree::VerificationLevel VL);
40+
} // namespace DomTreeBuilder
41+
2342
///
2443
/// MachinePostDominatorTree - an analysis pass wrapper for DominatorTree
2544
/// used to compute the post-dominator tree for MachineFunctions.
2645
///
27-
class MachinePostDominatorTree : public MachineFunctionPass {
28-
using PostDomTreeT = PostDomTreeBase<MachineBasicBlock>;
29-
std::unique_ptr<PostDomTreeT> PDT;
46+
class MachinePostDominatorTree : public PostDomTreeBase<MachineBasicBlock> {
47+
using Base = PostDomTreeBase<MachineBasicBlock>;
3048

3149
public:
32-
static char ID;
33-
34-
MachinePostDominatorTree();
35-
36-
PostDomTreeT &getBase() {
37-
if (!PDT)
38-
PDT.reset(new PostDomTreeT());
39-
return *PDT;
40-
}
41-
42-
FunctionPass *createMachinePostDominatorTreePass();
43-
44-
MachineDomTreeNode *getRootNode() const { return PDT->getRootNode(); }
45-
46-
MachineDomTreeNode *operator[](MachineBasicBlock *BB) const {
47-
return PDT->getNode(BB);
48-
}
49-
50-
MachineDomTreeNode *getNode(MachineBasicBlock *BB) const {
51-
return PDT->getNode(BB);
52-
}
53-
54-
bool dominates(const MachineDomTreeNode *A,
55-
const MachineDomTreeNode *B) const {
56-
return PDT->dominates(A, B);
57-
}
58-
59-
bool dominates(const MachineBasicBlock *A, const MachineBasicBlock *B) const {
60-
return PDT->dominates(A, B);
61-
}
50+
MachinePostDominatorTree() = default;
6251

63-
bool properlyDominates(const MachineDomTreeNode *A,
64-
const MachineDomTreeNode *B) const {
65-
return PDT->properlyDominates(A, B);
66-
}
67-
68-
bool properlyDominates(const MachineBasicBlock *A,
69-
const MachineBasicBlock *B) const {
70-
return PDT->properlyDominates(A, B);
71-
}
72-
73-
bool isVirtualRoot(const MachineDomTreeNode *Node) const {
74-
return PDT->isVirtualRoot(Node);
75-
}
76-
77-
MachineBasicBlock *findNearestCommonDominator(MachineBasicBlock *A,
78-
MachineBasicBlock *B) const {
79-
return PDT->findNearestCommonDominator(A, B);
80-
}
52+
/// Make findNearestCommonDominator(const NodeT *A, const NodeT *B) available.
53+
using Base::findNearestCommonDominator;
8154

8255
/// Returns the nearest common dominator of the given blocks.
8356
/// If that tree node is a virtual root, a nullptr will be returned.
8457
MachineBasicBlock *
8558
findNearestCommonDominator(ArrayRef<MachineBasicBlock *> Blocks) const;
59+
};
60+
61+
class MachinePostDominatorTreeWrapperPass : public MachineFunctionPass {
62+
std::optional<MachinePostDominatorTree> PDT;
63+
64+
public:
65+
static char ID;
66+
67+
MachinePostDominatorTreeWrapperPass();
68+
69+
MachinePostDominatorTree &getPostDomTree() { return *PDT; }
70+
const MachinePostDominatorTree &getPostDomTree() const { return *PDT; }
8671

8772
bool runOnMachineFunction(MachineFunction &MF) override;
8873
void getAnalysisUsage(AnalysisUsage &AU) const override;
89-
void releaseMemory() override { PDT.reset(nullptr); }
74+
void releaseMemory() override { PDT.reset(); }
9075
void verifyAnalysis() const override;
9176
void print(llvm::raw_ostream &OS, const Module *M = nullptr) const override;
9277
};

llvm/include/llvm/InitializePasses.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ void initializeMachineModuleInfoWrapperPassPass(PassRegistry &);
200200
void initializeMachineOptimizationRemarkEmitterPassPass(PassRegistry&);
201201
void initializeMachineOutlinerPass(PassRegistry&);
202202
void initializeMachinePipelinerPass(PassRegistry&);
203-
void initializeMachinePostDominatorTreePass(PassRegistry&);
203+
void initializeMachinePostDominatorTreeWrapperPassPass(PassRegistry &);
204204
void initializeMachineRegionInfoPassPass(PassRegistry&);
205205
void initializeMachineSanitizerBinaryMetadataPass(PassRegistry &);
206206
void initializeMachineSchedulerPass(PassRegistry&);

llvm/lib/CodeGen/CodeGen.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ void llvm::initializeCodeGen(PassRegistry &Registry) {
9191
initializeMachinePipelinerPass(Registry);
9292
initializeMachineSanitizerBinaryMetadataPass(Registry);
9393
initializeModuloScheduleTestPass(Registry);
94-
initializeMachinePostDominatorTreePass(Registry);
94+
initializeMachinePostDominatorTreeWrapperPassPass(Registry);
9595
initializeMachineRegionInfoPassPass(Registry);
9696
initializeMachineSchedulerPass(Registry);
9797
initializeMachineSinkingPass(Registry);

llvm/lib/CodeGen/MIRSampleProfile.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ INITIALIZE_PASS_BEGIN(MIRProfileLoaderPass, DEBUG_TYPE,
7171
/* cfg = */ false, /* is_analysis = */ false)
7272
INITIALIZE_PASS_DEPENDENCY(MachineBlockFrequencyInfo)
7373
INITIALIZE_PASS_DEPENDENCY(MachineDominatorTreeWrapperPass)
74-
INITIALIZE_PASS_DEPENDENCY(MachinePostDominatorTree)
74+
INITIALIZE_PASS_DEPENDENCY(MachinePostDominatorTreeWrapperPass)
7575
INITIALIZE_PASS_DEPENDENCY(MachineLoopInfo)
7676
INITIALIZE_PASS_DEPENDENCY(MachineOptimizationRemarkEmitterPass)
7777
INITIALIZE_PASS_END(MIRProfileLoaderPass, DEBUG_TYPE, "Load MIR Sample Profile",
@@ -366,8 +366,9 @@ bool MIRProfileLoaderPass::runOnMachineFunction(MachineFunction &MF) {
366366
MBFI = &getAnalysis<MachineBlockFrequencyInfo>();
367367
MIRSampleLoader->setInitVals(
368368
&getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree(),
369-
&getAnalysis<MachinePostDominatorTree>(), &getAnalysis<MachineLoopInfo>(),
370-
MBFI, &getAnalysis<MachineOptimizationRemarkEmitterPass>().getORE());
369+
&getAnalysis<MachinePostDominatorTreeWrapperPass>().getPostDomTree(),
370+
&getAnalysis<MachineLoopInfo>(), MBFI,
371+
&getAnalysis<MachineOptimizationRemarkEmitterPass>().getORE());
371372

372373
MF.RenumberBlocks();
373374
if (ViewBFIBefore && ViewBlockLayoutWithBFI != GVDT_None &&
@@ -401,7 +402,7 @@ void MIRProfileLoaderPass::getAnalysisUsage(AnalysisUsage &AU) const {
401402
AU.setPreservesAll();
402403
AU.addRequired<MachineBlockFrequencyInfo>();
403404
AU.addRequired<MachineDominatorTreeWrapperPass>();
404-
AU.addRequired<MachinePostDominatorTree>();
405+
AU.addRequired<MachinePostDominatorTreeWrapperPass>();
405406
AU.addRequiredTransitive<MachineLoopInfo>();
406407
AU.addRequired<MachineOptimizationRemarkEmitterPass>();
407408
MachineFunctionPass::getAnalysisUsage(AU);

llvm/lib/CodeGen/MachineBlockPlacement.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -606,7 +606,7 @@ class MachineBlockPlacement : public MachineFunctionPass {
606606
AU.addRequired<MachineBranchProbabilityInfo>();
607607
AU.addRequired<MachineBlockFrequencyInfo>();
608608
if (TailDupPlacement)
609-
AU.addRequired<MachinePostDominatorTree>();
609+
AU.addRequired<MachinePostDominatorTreeWrapperPass>();
610610
AU.addRequired<MachineLoopInfo>();
611611
AU.addRequired<ProfileSummaryInfoWrapperPass>();
612612
AU.addRequired<TargetPassConfig>();
@@ -624,7 +624,7 @@ INITIALIZE_PASS_BEGIN(MachineBlockPlacement, DEBUG_TYPE,
624624
"Branch Probability Basic Block Placement", false, false)
625625
INITIALIZE_PASS_DEPENDENCY(MachineBranchProbabilityInfo)
626626
INITIALIZE_PASS_DEPENDENCY(MachineBlockFrequencyInfo)
627-
INITIALIZE_PASS_DEPENDENCY(MachinePostDominatorTree)
627+
INITIALIZE_PASS_DEPENDENCY(MachinePostDominatorTreeWrapperPass)
628628
INITIALIZE_PASS_DEPENDENCY(MachineLoopInfo)
629629
INITIALIZE_PASS_DEPENDENCY(ProfileSummaryInfoWrapperPass)
630630
INITIALIZE_PASS_END(MachineBlockPlacement, DEBUG_TYPE,
@@ -3417,7 +3417,7 @@ bool MachineBlockPlacement::runOnMachineFunction(MachineFunction &MF) {
34173417
TailDupSize = TII->getTailDuplicateSize(PassConfig->getOptLevel());
34183418

34193419
if (allowTailDupPlacement()) {
3420-
MPDT = &getAnalysis<MachinePostDominatorTree>();
3420+
MPDT = &getAnalysis<MachinePostDominatorTreeWrapperPass>().getPostDomTree();
34213421
bool OptForSize = MF.getFunction().hasOptSize() ||
34223422
llvm::shouldOptimizeForSize(&MF, PSI, &MBFI->getMBFI());
34233423
if (OptForSize)
@@ -3449,7 +3449,7 @@ bool MachineBlockPlacement::runOnMachineFunction(MachineFunction &MF) {
34493449
ComputedEdges.clear();
34503450
// Must redo the post-dominator tree if blocks were changed.
34513451
if (MPDT)
3452-
MPDT->runOnMachineFunction(MF);
3452+
MPDT->recalculate(MF);
34533453
ChainAllocator.DestroyAll();
34543454
buildCFGChains();
34553455
}

llvm/lib/CodeGen/MachinePostDominators.cpp

Lines changed: 35 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -19,31 +19,46 @@ using namespace llvm;
1919
namespace llvm {
2020
template class DominatorTreeBase<MachineBasicBlock, true>; // PostDomTreeBase
2121

22+
namespace DomTreeBuilder {
23+
24+
template void Calculate<MBBPostDomTree>(MBBPostDomTree &DT);
25+
template void InsertEdge<MBBPostDomTree>(MBBPostDomTree &DT,
26+
MachineBasicBlock *From,
27+
MachineBasicBlock *To);
28+
template void DeleteEdge<MBBPostDomTree>(MBBPostDomTree &DT,
29+
MachineBasicBlock *From,
30+
MachineBasicBlock *To);
31+
template void ApplyUpdates<MBBPostDomTree>(MBBPostDomTree &DT,
32+
MBBPostDomTreeGraphDiff &,
33+
MBBPostDomTreeGraphDiff *);
34+
template bool Verify<MBBPostDomTree>(const MBBPostDomTree &DT,
35+
MBBPostDomTree::VerificationLevel VL);
36+
37+
} // namespace DomTreeBuilder
2238
extern bool VerifyMachineDomInfo;
2339
} // namespace llvm
2440

25-
char MachinePostDominatorTree::ID = 0;
41+
char MachinePostDominatorTreeWrapperPass::ID = 0;
2642

2743
//declare initializeMachinePostDominatorTreePass
28-
INITIALIZE_PASS(MachinePostDominatorTree, "machinepostdomtree",
44+
INITIALIZE_PASS(MachinePostDominatorTreeWrapperPass, "machinepostdomtree",
2945
"MachinePostDominator Tree Construction", true, true)
3046

31-
MachinePostDominatorTree::MachinePostDominatorTree()
32-
: MachineFunctionPass(ID), PDT(nullptr) {
33-
initializeMachinePostDominatorTreePass(*PassRegistry::getPassRegistry());
47+
MachinePostDominatorTreeWrapperPass::MachinePostDominatorTreeWrapperPass()
48+
: MachineFunctionPass(ID), PDT() {
49+
initializeMachinePostDominatorTreeWrapperPassPass(
50+
*PassRegistry::getPassRegistry());
3451
}
3552

36-
FunctionPass *MachinePostDominatorTree::createMachinePostDominatorTreePass() {
37-
return new MachinePostDominatorTree();
38-
}
39-
40-
bool MachinePostDominatorTree::runOnMachineFunction(MachineFunction &F) {
41-
PDT = std::make_unique<PostDomTreeT>();
53+
bool MachinePostDominatorTreeWrapperPass::runOnMachineFunction(
54+
MachineFunction &F) {
55+
PDT = MachinePostDominatorTree();
4256
PDT->recalculate(F);
4357
return false;
4458
}
4559

46-
void MachinePostDominatorTree::getAnalysisUsage(AnalysisUsage &AU) const {
60+
void MachinePostDominatorTreeWrapperPass::getAnalysisUsage(
61+
AnalysisUsage &AU) const {
4762
AU.setPreservesAll();
4863
MachineFunctionPass::getAnalysisUsage(AU);
4964
}
@@ -54,26 +69,23 @@ MachineBasicBlock *MachinePostDominatorTree::findNearestCommonDominator(
5469

5570
MachineBasicBlock *NCD = Blocks.front();
5671
for (MachineBasicBlock *BB : Blocks.drop_front()) {
57-
NCD = PDT->findNearestCommonDominator(NCD, BB);
72+
NCD = Base::findNearestCommonDominator(NCD, BB);
5873

5974
// Stop when the root is reached.
60-
if (PDT->isVirtualRoot(PDT->getNode(NCD)))
75+
if (isVirtualRoot(getNode(NCD)))
6176
return nullptr;
6277
}
6378

6479
return NCD;
6580
}
6681

67-
void MachinePostDominatorTree::verifyAnalysis() const {
68-
if (PDT && VerifyMachineDomInfo)
69-
if (!PDT->verify(PostDomTreeT::VerificationLevel::Basic)) {
70-
errs() << "MachinePostDominatorTree verification failed\n";
71-
72-
abort();
73-
}
82+
void MachinePostDominatorTreeWrapperPass::verifyAnalysis() const {
83+
if (VerifyMachineDomInfo && PDT &&
84+
!PDT->verify(MachinePostDominatorTree::VerificationLevel::Basic))
85+
report_fatal_error("MachinePostDominatorTree verification failed!");
7486
}
7587

76-
void MachinePostDominatorTree::print(llvm::raw_ostream &OS,
77-
const Module *M) const {
88+
void MachinePostDominatorTreeWrapperPass::print(llvm::raw_ostream &OS,
89+
const Module *M) const {
7890
PDT->print(OS);
7991
}

llvm/lib/CodeGen/MachineRegionInfo.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,8 @@ bool MachineRegionInfoPass::runOnMachineFunction(MachineFunction &F) {
8585
releaseMemory();
8686

8787
auto DT = &getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
88-
auto PDT = &getAnalysis<MachinePostDominatorTree>();
88+
auto PDT =
89+
&getAnalysis<MachinePostDominatorTreeWrapperPass>().getPostDomTree();
8990
auto DF = &getAnalysis<MachineDominanceFrontier>();
9091

9192
RI.recalculate(F, DT, PDT, DF);
@@ -110,7 +111,7 @@ void MachineRegionInfoPass::verifyAnalysis() const {
110111
void MachineRegionInfoPass::getAnalysisUsage(AnalysisUsage &AU) const {
111112
AU.setPreservesAll();
112113
AU.addRequired<MachineDominatorTreeWrapperPass>();
113-
AU.addRequired<MachinePostDominatorTree>();
114+
AU.addRequired<MachinePostDominatorTreeWrapperPass>();
114115
AU.addRequired<MachineDominanceFrontier>();
115116
MachineFunctionPass::getAnalysisUsage(AU);
116117
}
@@ -131,7 +132,7 @@ char &MachineRegionInfoPassID = MachineRegionInfoPass::ID;
131132
INITIALIZE_PASS_BEGIN(MachineRegionInfoPass, DEBUG_TYPE,
132133
"Detect single entry single exit regions", true, true)
133134
INITIALIZE_PASS_DEPENDENCY(MachineDominatorTreeWrapperPass)
134-
INITIALIZE_PASS_DEPENDENCY(MachinePostDominatorTree)
135+
INITIALIZE_PASS_DEPENDENCY(MachinePostDominatorTreeWrapperPass)
135136
INITIALIZE_PASS_DEPENDENCY(MachineDominanceFrontier)
136137
INITIALIZE_PASS_END(MachineRegionInfoPass, DEBUG_TYPE,
137138
"Detect single entry single exit regions", true, true)

llvm/lib/CodeGen/MachineSink.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ namespace {
185185
MachineFunctionPass::getAnalysisUsage(AU);
186186
AU.addRequired<AAResultsWrapperPass>();
187187
AU.addRequired<MachineDominatorTreeWrapperPass>();
188-
AU.addRequired<MachinePostDominatorTree>();
188+
AU.addRequired<MachinePostDominatorTreeWrapperPass>();
189189
AU.addRequired<MachineCycleInfoWrapperPass>();
190190
AU.addRequired<MachineBranchProbabilityInfo>();
191191
AU.addPreserved<MachineCycleInfoWrapperPass>();
@@ -709,7 +709,7 @@ bool MachineSinking::runOnMachineFunction(MachineFunction &MF) {
709709
TRI = STI->getRegisterInfo();
710710
MRI = &MF.getRegInfo();
711711
DT = &getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
712-
PDT = &getAnalysis<MachinePostDominatorTree>();
712+
PDT = &getAnalysis<MachinePostDominatorTreeWrapperPass>().getPostDomTree();
713713
CI = &getAnalysis<MachineCycleInfoWrapperPass>().getCycleInfo();
714714
MBFI = UseBlockFreqInfo ? &getAnalysis<MachineBlockFrequencyInfo>() : nullptr;
715715
MBPI = &getAnalysis<MachineBranchProbabilityInfo>();

llvm/lib/CodeGen/ShrinkWrap.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@ class ShrinkWrap : public MachineFunctionPass {
226226
void init(MachineFunction &MF) {
227227
RCI.runOnMachineFunction(MF);
228228
MDT = &getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
229-
MPDT = &getAnalysis<MachinePostDominatorTree>();
229+
MPDT = &getAnalysis<MachinePostDominatorTreeWrapperPass>().getPostDomTree();
230230
Save = nullptr;
231231
Restore = nullptr;
232232
MBFI = &getAnalysis<MachineBlockFrequencyInfo>();
@@ -263,7 +263,7 @@ class ShrinkWrap : public MachineFunctionPass {
263263
AU.setPreservesAll();
264264
AU.addRequired<MachineBlockFrequencyInfo>();
265265
AU.addRequired<MachineDominatorTreeWrapperPass>();
266-
AU.addRequired<MachinePostDominatorTree>();
266+
AU.addRequired<MachinePostDominatorTreeWrapperPass>();
267267
AU.addRequired<MachineLoopInfo>();
268268
AU.addRequired<MachineOptimizationRemarkEmitterPass>();
269269
MachineFunctionPass::getAnalysisUsage(AU);
@@ -290,7 +290,7 @@ char &llvm::ShrinkWrapID = ShrinkWrap::ID;
290290
INITIALIZE_PASS_BEGIN(ShrinkWrap, DEBUG_TYPE, "Shrink Wrap Pass", false, false)
291291
INITIALIZE_PASS_DEPENDENCY(MachineBlockFrequencyInfo)
292292
INITIALIZE_PASS_DEPENDENCY(MachineDominatorTreeWrapperPass)
293-
INITIALIZE_PASS_DEPENDENCY(MachinePostDominatorTree)
293+
INITIALIZE_PASS_DEPENDENCY(MachinePostDominatorTreeWrapperPass)
294294
INITIALIZE_PASS_DEPENDENCY(MachineLoopInfo)
295295
INITIALIZE_PASS_DEPENDENCY(MachineOptimizationRemarkEmitterPass)
296296
INITIALIZE_PASS_END(ShrinkWrap, DEBUG_TYPE, "Shrink Wrap Pass", false, false)
@@ -671,7 +671,7 @@ bool ShrinkWrap::postShrinkWrapping(bool HasCandidate, MachineFunction &MF,
671671
Restore = NewRestore;
672672

673673
MDT->recalculate(MF);
674-
MPDT->runOnMachineFunction(MF);
674+
MPDT->recalculate(MF);
675675

676676
assert((MDT->dominates(Save, Restore) && MPDT->dominates(Restore, Save)) &&
677677
"Incorrect save or restore point due to dominance relations");

0 commit comments

Comments
 (0)