aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/CodeGen/MachineTraceMetrics.cpp
diff options
context:
space:
mode:
authorChristudasan Devadasan <christudasan.devadasan@amd.com>2024-10-16 13:19:55 +0530
committerGitHub <noreply@github.com>2024-10-16 13:19:55 +0530
commit732b804e5f0fd3d5e267c7f39fedc6525ebda3ba (patch)
tree58f292af4fe7b9817d39f41ea10044dcbc81a131 /llvm/lib/CodeGen/MachineTraceMetrics.cpp
parenteccf4d44d346eee498b0ff709e625e3104448751 (diff)
downloadllvm-732b804e5f0fd3d5e267c7f39fedc6525ebda3ba.zip
llvm-732b804e5f0fd3d5e267c7f39fedc6525ebda3ba.tar.gz
llvm-732b804e5f0fd3d5e267c7f39fedc6525ebda3ba.tar.bz2
[CodeGen][NewPM] Port machine trace metrics analysis to new pass manager. (#108507)
Diffstat (limited to 'llvm/lib/CodeGen/MachineTraceMetrics.cpp')
-rw-r--r--llvm/lib/CodeGen/MachineTraceMetrics.cpp78
1 files changed, 56 insertions, 22 deletions
diff --git a/llvm/lib/CodeGen/MachineTraceMetrics.cpp b/llvm/lib/CodeGen/MachineTraceMetrics.cpp
index 5a16709..92df6b9 100644
--- a/llvm/lib/CodeGen/MachineTraceMetrics.cpp
+++ b/llvm/lib/CodeGen/MachineTraceMetrics.cpp
@@ -39,47 +39,66 @@ using namespace llvm;
#define DEBUG_TYPE "machine-trace-metrics"
-char MachineTraceMetrics::ID = 0;
+AnalysisKey MachineTraceMetricsAnalysis::Key;
-char &llvm::MachineTraceMetricsID = MachineTraceMetrics::ID;
+MachineTraceMetricsAnalysis::Result
+MachineTraceMetricsAnalysis::run(MachineFunction &MF,
+ MachineFunctionAnalysisManager &MFAM) {
+ return Result(MF, MFAM.getResult<MachineLoopAnalysis>(MF));
+}
+
+PreservedAnalyses
+MachineTraceMetricsVerifierPass::run(MachineFunction &MF,
+ MachineFunctionAnalysisManager &MFAM) {
+ MFAM.getResult<MachineTraceMetricsAnalysis>(MF).verifyAnalysis();
+ return PreservedAnalyses::all();
+}
-INITIALIZE_PASS_BEGIN(MachineTraceMetrics, DEBUG_TYPE, "Machine Trace Metrics",
- false, true)
+char MachineTraceMetricsWrapperPass::ID = 0;
+
+char &llvm::MachineTraceMetricsID = MachineTraceMetricsWrapperPass::ID;
+
+INITIALIZE_PASS_BEGIN(MachineTraceMetricsWrapperPass, DEBUG_TYPE,
+ "Machine Trace Metrics", false, true)
INITIALIZE_PASS_DEPENDENCY(MachineLoopInfoWrapperPass)
-INITIALIZE_PASS_END(MachineTraceMetrics, DEBUG_TYPE,
+INITIALIZE_PASS_END(MachineTraceMetricsWrapperPass, DEBUG_TYPE,
"Machine Trace Metrics", false, true)
-MachineTraceMetrics::MachineTraceMetrics() : MachineFunctionPass(ID) {
- std::fill(std::begin(Ensembles), std::end(Ensembles), nullptr);
-}
+MachineTraceMetricsWrapperPass::MachineTraceMetricsWrapperPass()
+ : MachineFunctionPass(ID) {}
-void MachineTraceMetrics::getAnalysisUsage(AnalysisUsage &AU) const {
+void MachineTraceMetricsWrapperPass::getAnalysisUsage(AnalysisUsage &AU) const {
AU.setPreservesAll();
AU.addRequired<MachineLoopInfoWrapperPass>();
MachineFunctionPass::getAnalysisUsage(AU);
}
-bool MachineTraceMetrics::runOnMachineFunction(MachineFunction &Func) {
+void MachineTraceMetrics::init(MachineFunction &Func,
+ const MachineLoopInfo &LI) {
MF = &Func;
const TargetSubtargetInfo &ST = MF->getSubtarget();
TII = ST.getInstrInfo();
TRI = ST.getRegisterInfo();
MRI = &MF->getRegInfo();
- Loops = &getAnalysis<MachineLoopInfoWrapperPass>().getLI();
+ Loops = &LI;
SchedModel.init(&ST);
BlockInfo.resize(MF->getNumBlockIDs());
ProcReleaseAtCycles.resize(MF->getNumBlockIDs() *
SchedModel.getNumProcResourceKinds());
+}
+
+bool MachineTraceMetricsWrapperPass::runOnMachineFunction(MachineFunction &MF) {
+ MTM.init(MF, getAnalysis<MachineLoopInfoWrapperPass>().getLI());
return false;
}
-void MachineTraceMetrics::releaseMemory() {
+MachineTraceMetrics::~MachineTraceMetrics() { clear(); }
+
+void MachineTraceMetrics::clear() {
MF = nullptr;
BlockInfo.clear();
- for (Ensemble *&E : Ensembles) {
- delete E;
- E = nullptr;
- }
+ for (auto &E : Ensembles)
+ E.reset();
}
//===----------------------------------------------------------------------===//
@@ -395,35 +414,50 @@ MachineTraceMetrics::Ensemble *
MachineTraceMetrics::getEnsemble(MachineTraceStrategy strategy) {
assert(strategy < MachineTraceStrategy::TS_NumStrategies &&
"Invalid trace strategy enum");
- Ensemble *&E = Ensembles[static_cast<size_t>(strategy)];
+ std::unique_ptr<MachineTraceMetrics::Ensemble> &E =
+ Ensembles[static_cast<size_t>(strategy)];
if (E)
- return E;
+ return E.get();
// Allocate new Ensemble on demand.
switch (strategy) {
case MachineTraceStrategy::TS_MinInstrCount:
- return (E = new MinInstrCountEnsemble(this));
+ E = std::make_unique<MinInstrCountEnsemble>(MinInstrCountEnsemble(this));
+ break;
case MachineTraceStrategy::TS_Local:
- return (E = new LocalEnsemble(this));
+ E = std::make_unique<LocalEnsemble>(LocalEnsemble(this));
+ break;
default: llvm_unreachable("Invalid trace strategy enum");
}
+ return E.get();
}
void MachineTraceMetrics::invalidate(const MachineBasicBlock *MBB) {
LLVM_DEBUG(dbgs() << "Invalidate traces through " << printMBBReference(*MBB)
<< '\n');
BlockInfo[MBB->getNumber()].invalidate();
- for (Ensemble *E : Ensembles)
+ for (auto &E : Ensembles)
if (E)
E->invalidate(MBB);
}
+bool MachineTraceMetrics::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<MachineTraceMetricsAnalysis>();
+ return !PAC.preserved() &&
+ !PAC.preservedSet<AllAnalysesOn<MachineFunction>>() &&
+ !PAC.preservedSet<CFGAnalyses>();
+}
+
void MachineTraceMetrics::verifyAnalysis() const {
if (!MF)
return;
#ifndef NDEBUG
assert(BlockInfo.size() == MF->getNumBlockIDs() && "Outdated BlockInfo size");
- for (Ensemble *E : Ensembles)
+ for (auto &E : Ensembles)
if (E)
E->verify();
#endif