diff options
author | paperchalice <liujunchang97@outlook.com> | 2024-04-30 09:54:48 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-04-30 09:54:48 +0800 |
commit | 6ea0c0a28343b2676baf480db490b5a27fa11d7c (patch) | |
tree | f00243ace9e105d4acf60987f9a218b0809ac8af /llvm/lib/CodeGen/MachinePassManager.cpp | |
parent | b1867e18c346e9621e14270bea2d1acb7d2a9ce0 (diff) | |
download | llvm-6ea0c0a28343b2676baf480db490b5a27fa11d7c.zip llvm-6ea0c0a28343b2676baf480db490b5a27fa11d7c.tar.gz llvm-6ea0c0a28343b2676baf480db490b5a27fa11d7c.tar.bz2 |
[NewPM][CodeGen] Add `MachineFunctionAnalysis` (#88610)
In new pass system, `MachineFunction` could be an analysis result again,
machine module pass can now fetch them from analysis manager.
`MachineModuleInfo` no longer owns them.
Remove `FreeMachineFunctionPass`, replaced by
`InvalidateAnalysisPass<MachineFunctionAnalysis>`.
Now `FreeMachineFunction` is replaced by
`InvalidateAnalysisPass<MachineFunctionAnalysis>`, the workaround in
`MachineFunctionPassManager` is no longer needed, there is no difference
between `unittests/MIR/PassBuilderCallbacksTest.cpp` and
`unittests/IR/PassBuilderCallbacksTest.cpp`.
Diffstat (limited to 'llvm/lib/CodeGen/MachinePassManager.cpp')
-rw-r--r-- | llvm/lib/CodeGen/MachinePassManager.cpp | 103 |
1 files changed, 65 insertions, 38 deletions
diff --git a/llvm/lib/CodeGen/MachinePassManager.cpp b/llvm/lib/CodeGen/MachinePassManager.cpp index 2763193..6d54080 100644 --- a/llvm/lib/CodeGen/MachinePassManager.cpp +++ b/llvm/lib/CodeGen/MachinePassManager.cpp @@ -12,21 +12,24 @@ #include "llvm/CodeGen/MachinePassManager.h" #include "llvm/CodeGen/MachineFunction.h" +#include "llvm/CodeGen/MachineFunctionAnalysis.h" #include "llvm/CodeGen/MachineModuleInfo.h" #include "llvm/IR/PassManagerImpl.h" using namespace llvm; -namespace llvm { - AnalysisKey FunctionAnalysisManagerMachineFunctionProxy::Key; +namespace llvm { template class AnalysisManager<MachineFunction>; template class PassManager<MachineFunction>; template class InnerAnalysisManagerProxy<MachineFunctionAnalysisManager, Module>; +template class InnerAnalysisManagerProxy<MachineFunctionAnalysisManager, + Function>; template class OuterAnalysisManagerProxy<ModuleAnalysisManager, MachineFunction>; +} // namespace llvm bool FunctionAnalysisManagerMachineFunctionProxy::Result::invalidate( MachineFunction &IR, const PreservedAnalyses &PA, @@ -69,38 +72,65 @@ bool MachineFunctionAnalysisManagerModuleProxy::Result::invalidate( return false; } +template <> +bool MachineFunctionAnalysisManagerFunctionProxy::Result::invalidate( + Function &F, const PreservedAnalyses &PA, + FunctionAnalysisManager::Invalidator &Inv) { + // If literally everything is preserved, we're done. + if (PA.areAllPreserved()) + return false; // This is still a valid proxy. + + // If this proxy isn't marked as preserved, then even if the result remains + // valid, the key itself may no longer be valid, so we clear everything. + // + // Note that in order to preserve this proxy, a module pass must ensure that + // the MFAM has been completely updated to handle the deletion of functions. + // Specifically, any MFAM-cached results for those functions need to have been + // forcibly cleared. When preserved, this proxy will only invalidate results + // cached on functions *still in the module* at the end of the module pass. + auto PAC = PA.getChecker<MachineFunctionAnalysisManagerFunctionProxy>(); + if (!PAC.preserved() && !PAC.preservedSet<AllAnalysesOn<Function>>()) { + InnerAM->clear(); + return true; + } + + // FIXME: be more precise, see + // FunctionAnalysisManagerModuleProxy::Result::invalidate. + if (!PA.allAnalysesInSetPreserved<AllAnalysesOn<MachineFunction>>()) { + InnerAM->clear(); + return true; + } + + // Return false to indicate that this result is still a valid proxy. + return false; +} + PreservedAnalyses -ModuleToMachineFunctionPassAdaptor::run(Module &M, ModuleAnalysisManager &AM) { - auto &MMI = AM.getResult<MachineModuleAnalysis>(M).getMMI(); +FunctionToMachineFunctionPassAdaptor::run(Function &F, + FunctionAnalysisManager &FAM) { MachineFunctionAnalysisManager &MFAM = - AM.getResult<MachineFunctionAnalysisManagerModuleProxy>(M).getManager(); - PassInstrumentation PI = AM.getResult<PassInstrumentationAnalysis>(M); + FAM.getResult<MachineFunctionAnalysisManagerFunctionProxy>(F) + .getManager(); + PassInstrumentation PI = FAM.getResult<PassInstrumentationAnalysis>(F); PreservedAnalyses PA = PreservedAnalyses::all(); - for (Function &F : M) { - // Do not codegen any 'available_externally' functions at all, they have - // definitions outside the translation unit. - if (F.isDeclaration() || F.hasAvailableExternallyLinkage()) - continue; + // Do not codegen any 'available_externally' functions at all, they have + // definitions outside the translation unit. + if (F.isDeclaration() || F.hasAvailableExternallyLinkage()) + return PreservedAnalyses::all(); - MachineFunction &MF = MMI.getOrCreateMachineFunction(F); + MachineFunction &MF = FAM.getResult<MachineFunctionAnalysis>(F).getMF(); - if (!PI.runBeforePass<MachineFunction>(*Pass, MF)) - continue; - PreservedAnalyses PassPA = Pass->run(MF, MFAM); - if (MMI.getMachineFunction(F)) { - MFAM.invalidate(MF, PassPA); - PI.runAfterPass(*Pass, MF, PassPA); - } else { - MFAM.clear(MF, F.getName()); - PI.runAfterPassInvalidated<MachineFunction>(*Pass, PassPA); - } - PA.intersect(std::move(PassPA)); - } + if (!PI.runBeforePass<MachineFunction>(*Pass, MF)) + return PreservedAnalyses::all(); + PreservedAnalyses PassPA = Pass->run(MF, MFAM); + MFAM.invalidate(MF, PassPA); + PI.runAfterPass(*Pass, MF, PassPA); + PA.intersect(std::move(PassPA)); return PA; } -void ModuleToMachineFunctionPassAdaptor::printPipeline( +void FunctionToMachineFunctionPassAdaptor::printPipeline( raw_ostream &OS, function_ref<StringRef(StringRef)> MapClassName2PassName) { OS << "machine-function("; Pass->printPipeline(OS, MapClassName2PassName); @@ -112,27 +142,24 @@ PreservedAnalyses PassManager<MachineFunction>::run(MachineFunction &MF, AnalysisManager<MachineFunction> &MFAM) { PassInstrumentation PI = MFAM.getResult<PassInstrumentationAnalysis>(MF); - Function &F = MF.getFunction(); - MachineModuleInfo &MMI = - MFAM.getResult<ModuleAnalysisManagerMachineFunctionProxy>(MF) - .getCachedResult<MachineModuleAnalysis>(*F.getParent()) - ->getMMI(); PreservedAnalyses PA = PreservedAnalyses::all(); for (auto &Pass : Passes) { if (!PI.runBeforePass<MachineFunction>(*Pass, MF)) continue; PreservedAnalyses PassPA = Pass->run(MF, MFAM); - if (MMI.getMachineFunction(F)) { - MFAM.invalidate(MF, PassPA); - PI.runAfterPass(*Pass, MF, PassPA); - } else { - MFAM.clear(MF, F.getName()); - PI.runAfterPassInvalidated<MachineFunction>(*Pass, PassPA); - } + MFAM.invalidate(MF, PassPA); + PI.runAfterPass(*Pass, MF, PassPA); PA.intersect(std::move(PassPA)); } return PA; } -} // namespace llvm +PreservedAnalyses llvm::getMachineFunctionPassPreservedAnalyses() { + PreservedAnalyses PA; + // Machine function passes are not allowed to modify the LLVM + // representation, therefore we should preserve all IR analyses. + PA.template preserveSet<AllAnalysesOn<Module>>(); + PA.template preserveSet<AllAnalysesOn<Function>>(); + return PA; +} |