From d501d90795bd443d47accaba491780ad86f301be Mon Sep 17 00:00:00 2001 From: PaperChalice Date: Thu, 11 Jul 2024 17:31:08 +0800 Subject: [PATCH] [CodeGen][NewPM] Add `MachineOptimizationRemarkEmitterAnalysis` --- .../MachineOptimizationRemarkEmitter.h | 19 ++++++++++++++++++ .../llvm/Passes/MachinePassRegistry.def | 4 ++-- .../MachineOptimizationRemarkEmitter.cpp | 20 +++++++++++++++++++ llvm/lib/Passes/PassBuilder.cpp | 1 + 4 files changed, 42 insertions(+), 2 deletions(-) diff --git a/llvm/include/llvm/CodeGen/MachineOptimizationRemarkEmitter.h b/llvm/include/llvm/CodeGen/MachineOptimizationRemarkEmitter.h index 2b177e6763d39..d4edacedb88e6 100644 --- a/llvm/include/llvm/CodeGen/MachineOptimizationRemarkEmitter.h +++ b/llvm/include/llvm/CodeGen/MachineOptimizationRemarkEmitter.h @@ -16,6 +16,7 @@ #define LLVM_CODEGEN_MACHINEOPTIMIZATIONREMARKEMITTER_H #include "llvm/CodeGen/MachineFunctionPass.h" +#include "llvm/CodeGen/MachinePassManager.h" #include "llvm/IR/DiagnosticInfo.h" #include "llvm/IR/Function.h" #include @@ -155,6 +156,13 @@ class MachineOptimizationRemarkEmitter { MachineBlockFrequencyInfo *MBFI) : MF(MF), MBFI(MBFI) {} + MachineOptimizationRemarkEmitter(MachineOptimizationRemarkEmitter &&) = + default; + + /// Handle invalidation events in the new pass manager. + bool invalidate(MachineFunction &MF, const PreservedAnalyses &PA, + MachineFunctionAnalysisManager::Invalidator &Inv); + /// Emit an optimization remark. void emit(DiagnosticInfoOptimizationBase &OptDiag); @@ -212,6 +220,17 @@ class MachineOptimizationRemarkEmitter { bool shouldEmitVerbose() { return MBFI != nullptr; } }; +/// The analysis pass +class MachineOptimizationRemarkEmitterAnalysis + : public AnalysisInfoMixin { + friend AnalysisInfoMixin; + static AnalysisKey Key; + +public: + using Result = MachineOptimizationRemarkEmitter; + Result run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM); +}; + /// The analysis pass /// /// Note that this pass shouldn't generally be marked as preserved by other diff --git a/llvm/include/llvm/Passes/MachinePassRegistry.def b/llvm/include/llvm/Passes/MachinePassRegistry.def index d5cd8d4a132fc..70c4f3484af1a 100644 --- a/llvm/include/llvm/Passes/MachinePassRegistry.def +++ b/llvm/include/llvm/Passes/MachinePassRegistry.def @@ -101,6 +101,8 @@ MACHINE_FUNCTION_ANALYSIS("machine-branch-prob", MachineBranchProbabilityAnalysis()) MACHINE_FUNCTION_ANALYSIS("machine-dom-tree", MachineDominatorTreeAnalysis()) MACHINE_FUNCTION_ANALYSIS("machine-loops", MachineLoopAnalysis()) +MACHINE_FUNCTION_ANALYSIS("machine-opt-remark-emitter", + MachineOptimizationRemarkEmitterAnalysis()) MACHINE_FUNCTION_ANALYSIS("machine-post-dom-tree", MachinePostDominatorTreeAnalysis()) MACHINE_FUNCTION_ANALYSIS("pass-instrumentation", PassInstrumentationAnalysis(PIC)) @@ -112,8 +114,6 @@ MACHINE_FUNCTION_ANALYSIS("slot-indexes", SlotIndexesAnalysis()) // MACHINE_FUNCTION_ANALYSIS("machine-loops", MachineLoopInfoAnalysis()) // MACHINE_FUNCTION_ANALYSIS("machine-dom-frontier", // MachineDominanceFrontierAnalysis()) -// MACHINE_FUNCTION_ANALYSIS("machine-ore", -// MachineOptimizationRemarkEmitterPassAnalysis()) // MACHINE_FUNCTION_ANALYSIS("machine-post-dom-tree", // MachinePostDominatorTreeAnalysis()) // MACHINE_FUNCTION_ANALYSIS("machine-region-info", diff --git a/llvm/lib/CodeGen/MachineOptimizationRemarkEmitter.cpp b/llvm/lib/CodeGen/MachineOptimizationRemarkEmitter.cpp index 1c31eba909e78..039f07f2e5e3f 100644 --- a/llvm/lib/CodeGen/MachineOptimizationRemarkEmitter.cpp +++ b/llvm/lib/CodeGen/MachineOptimizationRemarkEmitter.cpp @@ -31,6 +31,14 @@ DiagnosticInfoMIROptimization::MachineArgument::MachineArgument( /*SkipDebugLoc=*/true); } +bool MachineOptimizationRemarkEmitter::invalidate( + MachineFunction &MF, const PreservedAnalyses &PA, + MachineFunctionAnalysisManager::Invalidator &Inv) { + // This analysis has no state and so can be trivially preserved but it needs + // a fresh view of BFI if it was constructed with one. + return MBFI && Inv.invalidate(MF, PA); +} + std::optional MachineOptimizationRemarkEmitter::computeHotness(const MachineBasicBlock &MBB) { if (!MBFI) @@ -86,6 +94,18 @@ void MachineOptimizationRemarkEmitterPass::getAnalysisUsage( MachineFunctionPass::getAnalysisUsage(AU); } +AnalysisKey MachineOptimizationRemarkEmitterAnalysis::Key; + +MachineOptimizationRemarkEmitterAnalysis::Result +MachineOptimizationRemarkEmitterAnalysis::run( + MachineFunction &MF, MachineFunctionAnalysisManager &MFAM) { + MachineBlockFrequencyInfo *MBFI = + MF.getFunction().getContext().getDiagnosticsHotnessRequested() + ? &MFAM.getResult(MF) + : nullptr; + return Result(MF, MBFI); +} + char MachineOptimizationRemarkEmitterPass::ID = 0; static const char ore_name[] = "Machine Optimization Remark Emitter"; #define ORE_NAME "machine-opt-remark-emitter" diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp index d4eca4a48e55d..96fd446551975 100644 --- a/llvm/lib/Passes/PassBuilder.cpp +++ b/llvm/lib/Passes/PassBuilder.cpp @@ -100,6 +100,7 @@ #include "llvm/CodeGen/MachineDominators.h" #include "llvm/CodeGen/MachineFunctionAnalysis.h" #include "llvm/CodeGen/MachineLoopInfo.h" +#include "llvm/CodeGen/MachineOptimizationRemarkEmitter.h" #include "llvm/CodeGen/MachinePassManager.h" #include "llvm/CodeGen/MachinePostDominators.h" #include "llvm/CodeGen/MachineRegisterInfo.h"