diff options
author | paperchalice <liujunchang97@outlook.com> | 2024-06-25 14:23:01 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-06-25 14:23:01 +0800 |
commit | 8599629d390270b21c97f8b7ad2d97a344211d05 (patch) | |
tree | 9f58e5ddbaa2a41dc533a2e95614f365adce63a4 | |
parent | bd488c1247715f8d698b9b26611ff7f869c824cc (diff) | |
download | llvm-8599629d390270b21c97f8b7ad2d97a344211d05.zip llvm-8599629d390270b21c97f8b7ad2d97a344211d05.tar.gz llvm-8599629d390270b21c97f8b7ad2d97a344211d05.tar.bz2 |
[CodeGen][NewPM] Port machine post dominator tree analysis to new pass manager (#96378)
Follows #95879.
-rw-r--r-- | llvm/include/llvm/CodeGen/MachinePostDominators.h | 28 | ||||
-rw-r--r-- | llvm/include/llvm/Passes/MachinePassRegistry.def | 4 | ||||
-rw-r--r-- | llvm/lib/CodeGen/MachinePostDominators.cpp | 28 | ||||
-rw-r--r-- | llvm/lib/Passes/PassBuilder.cpp | 1 |
4 files changed, 61 insertions, 0 deletions
diff --git a/llvm/include/llvm/CodeGen/MachinePostDominators.h b/llvm/include/llvm/CodeGen/MachinePostDominators.h index c047e08..904c5fc 100644 --- a/llvm/include/llvm/CodeGen/MachinePostDominators.h +++ b/llvm/include/llvm/CodeGen/MachinePostDominators.h @@ -49,6 +49,12 @@ class MachinePostDominatorTree : public PostDomTreeBase<MachineBasicBlock> { public: MachinePostDominatorTree() = default; + MachinePostDominatorTree(MachineFunction &MF) { recalculate(MF); } + + /// Handle invalidation explicitly. + bool invalidate(MachineFunction &, const PreservedAnalyses &PA, + MachineFunctionAnalysisManager::Invalidator &); + /// Make findNearestCommonDominator(const NodeT *A, const NodeT *B) available. using Base::findNearestCommonDominator; @@ -58,6 +64,28 @@ public: findNearestCommonDominator(ArrayRef<MachineBasicBlock *> Blocks) const; }; +class MachinePostDominatorTreeAnalysis + : public AnalysisInfoMixin<MachinePostDominatorTreeAnalysis> { + friend AnalysisInfoMixin<MachinePostDominatorTreeAnalysis>; + + static AnalysisKey Key; + +public: + using Result = MachinePostDominatorTree; + + Result run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM); +}; + +class MachinePostDominatorTreePrinterPass + : public PassInfoMixin<MachinePostDominatorTreePrinterPass> { + raw_ostream &OS; + +public: + MachinePostDominatorTreePrinterPass(raw_ostream &OS) : OS(OS) {} + PreservedAnalyses run(MachineFunction &MF, + MachineFunctionAnalysisManager &MFAM); +}; + class MachinePostDominatorTreeWrapperPass : public MachineFunctionPass { std::optional<MachinePostDominatorTree> PDT; diff --git a/llvm/include/llvm/Passes/MachinePassRegistry.def b/llvm/include/llvm/Passes/MachinePassRegistry.def index b989a1e..b43f41b 100644 --- a/llvm/include/llvm/Passes/MachinePassRegistry.def +++ b/llvm/include/llvm/Passes/MachinePassRegistry.def @@ -90,6 +90,8 @@ LOOP_PASS("loop-reduce", LoopStrengthReducePass()) #define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) #endif MACHINE_FUNCTION_ANALYSIS("machine-dom-tree", MachineDominatorTreeAnalysis()) +MACHINE_FUNCTION_ANALYSIS("machine-post-dom-tree", + MachinePostDominatorTreeAnalysis()) MACHINE_FUNCTION_ANALYSIS("pass-instrumentation", PassInstrumentationAnalysis(PIC)) // LiveVariables currently requires pure SSA form. // FIXME: Once TwoAddressInstruction pass no longer uses kill flags, @@ -130,6 +132,8 @@ MACHINE_FUNCTION_PASS("no-op-machine-function", NoOpMachineFunctionPass()) MACHINE_FUNCTION_PASS("print", PrintMIRPass()) MACHINE_FUNCTION_PASS("print<machine-dom-tree>", MachineDominatorTreePrinterPass(dbgs())) +MACHINE_FUNCTION_PASS("print<machine-post-dom-tree>", + MachinePostDominatorTreePrinterPass(dbgs())) MACHINE_FUNCTION_PASS("require-all-machine-function-properties", RequireAllMachineFunctionPropertiesPass()) MACHINE_FUNCTION_PASS("trigger-verifier-error", TriggerVerifierErrorPass()) diff --git a/llvm/lib/CodeGen/MachinePostDominators.cpp b/llvm/lib/CodeGen/MachinePostDominators.cpp index 8ba7c31..5163713 100644 --- a/llvm/lib/CodeGen/MachinePostDominators.cpp +++ b/llvm/lib/CodeGen/MachinePostDominators.cpp @@ -39,6 +39,23 @@ template bool Verify<MBBPostDomTree>(const MBBPostDomTree &DT, extern bool VerifyMachineDomInfo; } // namespace llvm +AnalysisKey MachinePostDominatorTreeAnalysis::Key; + +MachinePostDominatorTreeAnalysis::Result +MachinePostDominatorTreeAnalysis::run(MachineFunction &MF, + MachineFunctionAnalysisManager &) { + return MachinePostDominatorTree(MF); +} + +PreservedAnalyses +MachinePostDominatorTreePrinterPass::run(MachineFunction &MF, + MachineFunctionAnalysisManager &MFAM) { + OS << "MachinePostDominatorTree for machine function: " << MF.getName() + << '\n'; + MFAM.getResult<MachinePostDominatorTreeAnalysis>(MF).print(OS); + return PreservedAnalyses::all(); +} + char MachinePostDominatorTreeWrapperPass::ID = 0; //declare initializeMachinePostDominatorTreePass @@ -64,6 +81,17 @@ void MachinePostDominatorTreeWrapperPass::getAnalysisUsage( MachineFunctionPass::getAnalysisUsage(AU); } +bool MachinePostDominatorTree::invalidate( + MachineFunction &, const PreservedAnalyses &PA, + MachineFunctionAnalysisManager::Invalidator &) { + // Check whether the analysis, all analyses on machine functions, or the + // machine function's CFG have been preserved. + auto PAC = PA.getChecker<MachinePostDominatorTreeAnalysis>(); + return !PAC.preserved() && + !PAC.preservedSet<AllAnalysesOn<MachineFunction>>() && + !PAC.preservedSet<CFGAnalyses>(); +} + MachineBasicBlock *MachinePostDominatorTree::findNearestCommonDominator( ArrayRef<MachineBasicBlock *> Blocks) const { assert(!Blocks.empty()); diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp index c19d5a7..e2f0515 100644 --- a/llvm/lib/Passes/PassBuilder.cpp +++ b/llvm/lib/Passes/PassBuilder.cpp @@ -96,6 +96,7 @@ #include "llvm/CodeGen/MachineDominators.h" #include "llvm/CodeGen/MachineFunctionAnalysis.h" #include "llvm/CodeGen/MachinePassManager.h" +#include "llvm/CodeGen/MachinePostDominators.h" #include "llvm/CodeGen/MachineRegisterInfo.h" #include "llvm/CodeGen/PreISelIntrinsicLowering.h" #include "llvm/CodeGen/RegAllocFast.h" |