1*1d0244aeSSameer Sahasrabuddhe //===- MachineCycleAnalysis.cpp - Compute CycleInfo for Machine IR --------===//
2*1d0244aeSSameer Sahasrabuddhe //
3*1d0244aeSSameer Sahasrabuddhe // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*1d0244aeSSameer Sahasrabuddhe // See https://llvm.org/LICENSE.txt for license information.
5*1d0244aeSSameer Sahasrabuddhe // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*1d0244aeSSameer Sahasrabuddhe //
7*1d0244aeSSameer Sahasrabuddhe //===----------------------------------------------------------------------===//
8*1d0244aeSSameer Sahasrabuddhe 
9*1d0244aeSSameer Sahasrabuddhe #include "llvm/CodeGen/MachineCycleAnalysis.h"
10*1d0244aeSSameer Sahasrabuddhe #include "llvm/ADT/GenericCycleImpl.h"
11*1d0244aeSSameer Sahasrabuddhe #include "llvm/CodeGen/MachineFunctionPass.h"
12*1d0244aeSSameer Sahasrabuddhe #include "llvm/CodeGen/MachineSSAContext.h"
13*1d0244aeSSameer Sahasrabuddhe #include "llvm/InitializePasses.h"
14*1d0244aeSSameer Sahasrabuddhe 
15*1d0244aeSSameer Sahasrabuddhe using namespace llvm;
16*1d0244aeSSameer Sahasrabuddhe 
17*1d0244aeSSameer Sahasrabuddhe template class llvm::GenericCycleInfo<llvm::MachineSSAContext>;
18*1d0244aeSSameer Sahasrabuddhe template class llvm::GenericCycle<llvm::MachineSSAContext>;
19*1d0244aeSSameer Sahasrabuddhe 
20*1d0244aeSSameer Sahasrabuddhe namespace {
21*1d0244aeSSameer Sahasrabuddhe 
22*1d0244aeSSameer Sahasrabuddhe /// Legacy analysis pass which computes a \ref MachineCycleInfo.
23*1d0244aeSSameer Sahasrabuddhe class MachineCycleInfoWrapperPass : public MachineFunctionPass {
24*1d0244aeSSameer Sahasrabuddhe   MachineFunction *F = nullptr;
25*1d0244aeSSameer Sahasrabuddhe   MachineCycleInfo CI;
26*1d0244aeSSameer Sahasrabuddhe 
27*1d0244aeSSameer Sahasrabuddhe public:
28*1d0244aeSSameer Sahasrabuddhe   static char ID;
29*1d0244aeSSameer Sahasrabuddhe 
30*1d0244aeSSameer Sahasrabuddhe   MachineCycleInfoWrapperPass();
31*1d0244aeSSameer Sahasrabuddhe 
32*1d0244aeSSameer Sahasrabuddhe   MachineCycleInfo &getCycleInfo() { return CI; }
33*1d0244aeSSameer Sahasrabuddhe   const MachineCycleInfo &getCycleInfo() const { return CI; }
34*1d0244aeSSameer Sahasrabuddhe 
35*1d0244aeSSameer Sahasrabuddhe   bool runOnMachineFunction(MachineFunction &F) override;
36*1d0244aeSSameer Sahasrabuddhe   void getAnalysisUsage(AnalysisUsage &AU) const override;
37*1d0244aeSSameer Sahasrabuddhe   void releaseMemory() override;
38*1d0244aeSSameer Sahasrabuddhe   void print(raw_ostream &OS, const Module *M = nullptr) const override;
39*1d0244aeSSameer Sahasrabuddhe 
40*1d0244aeSSameer Sahasrabuddhe   // TODO: verify analysis
41*1d0244aeSSameer Sahasrabuddhe };
42*1d0244aeSSameer Sahasrabuddhe 
43*1d0244aeSSameer Sahasrabuddhe class MachineCycleInfoPrinterPass : public MachineFunctionPass {
44*1d0244aeSSameer Sahasrabuddhe public:
45*1d0244aeSSameer Sahasrabuddhe   static char ID;
46*1d0244aeSSameer Sahasrabuddhe 
47*1d0244aeSSameer Sahasrabuddhe   MachineCycleInfoPrinterPass();
48*1d0244aeSSameer Sahasrabuddhe 
49*1d0244aeSSameer Sahasrabuddhe   bool runOnMachineFunction(MachineFunction &F) override;
50*1d0244aeSSameer Sahasrabuddhe   void getAnalysisUsage(AnalysisUsage &AU) const override;
51*1d0244aeSSameer Sahasrabuddhe };
52*1d0244aeSSameer Sahasrabuddhe 
53*1d0244aeSSameer Sahasrabuddhe } // namespace
54*1d0244aeSSameer Sahasrabuddhe 
55*1d0244aeSSameer Sahasrabuddhe char MachineCycleInfoWrapperPass::ID = 0;
56*1d0244aeSSameer Sahasrabuddhe 
57*1d0244aeSSameer Sahasrabuddhe MachineCycleInfoWrapperPass::MachineCycleInfoWrapperPass()
58*1d0244aeSSameer Sahasrabuddhe     : MachineFunctionPass(ID) {
59*1d0244aeSSameer Sahasrabuddhe   initializeMachineCycleInfoWrapperPassPass(*PassRegistry::getPassRegistry());
60*1d0244aeSSameer Sahasrabuddhe }
61*1d0244aeSSameer Sahasrabuddhe 
62*1d0244aeSSameer Sahasrabuddhe INITIALIZE_PASS_BEGIN(MachineCycleInfoWrapperPass, "machine-cycles",
63*1d0244aeSSameer Sahasrabuddhe                       "Machine Cycle Info Analysis", true, true)
64*1d0244aeSSameer Sahasrabuddhe INITIALIZE_PASS_END(MachineCycleInfoWrapperPass, "machine-cycles",
65*1d0244aeSSameer Sahasrabuddhe                     "Machine Cycle Info Analysis", true, true)
66*1d0244aeSSameer Sahasrabuddhe 
67*1d0244aeSSameer Sahasrabuddhe void MachineCycleInfoWrapperPass::getAnalysisUsage(AnalysisUsage &AU) const {
68*1d0244aeSSameer Sahasrabuddhe   AU.setPreservesAll();
69*1d0244aeSSameer Sahasrabuddhe   MachineFunctionPass::getAnalysisUsage(AU);
70*1d0244aeSSameer Sahasrabuddhe }
71*1d0244aeSSameer Sahasrabuddhe 
72*1d0244aeSSameer Sahasrabuddhe bool MachineCycleInfoWrapperPass::runOnMachineFunction(MachineFunction &Func) {
73*1d0244aeSSameer Sahasrabuddhe   CI.clear();
74*1d0244aeSSameer Sahasrabuddhe 
75*1d0244aeSSameer Sahasrabuddhe   F = &Func;
76*1d0244aeSSameer Sahasrabuddhe   CI.compute(Func);
77*1d0244aeSSameer Sahasrabuddhe   return false;
78*1d0244aeSSameer Sahasrabuddhe }
79*1d0244aeSSameer Sahasrabuddhe 
80*1d0244aeSSameer Sahasrabuddhe void MachineCycleInfoWrapperPass::print(raw_ostream &OS, const Module *) const {
81*1d0244aeSSameer Sahasrabuddhe   OS << "MachineCycleInfo for function: " << F->getName() << "\n";
82*1d0244aeSSameer Sahasrabuddhe   CI.print(OS);
83*1d0244aeSSameer Sahasrabuddhe }
84*1d0244aeSSameer Sahasrabuddhe 
85*1d0244aeSSameer Sahasrabuddhe void MachineCycleInfoWrapperPass::releaseMemory() {
86*1d0244aeSSameer Sahasrabuddhe   CI.clear();
87*1d0244aeSSameer Sahasrabuddhe   F = nullptr;
88*1d0244aeSSameer Sahasrabuddhe }
89*1d0244aeSSameer Sahasrabuddhe 
90*1d0244aeSSameer Sahasrabuddhe char MachineCycleInfoPrinterPass::ID = 0;
91*1d0244aeSSameer Sahasrabuddhe 
92*1d0244aeSSameer Sahasrabuddhe MachineCycleInfoPrinterPass::MachineCycleInfoPrinterPass()
93*1d0244aeSSameer Sahasrabuddhe     : MachineFunctionPass(ID) {
94*1d0244aeSSameer Sahasrabuddhe   initializeMachineCycleInfoPrinterPassPass(*PassRegistry::getPassRegistry());
95*1d0244aeSSameer Sahasrabuddhe }
96*1d0244aeSSameer Sahasrabuddhe 
97*1d0244aeSSameer Sahasrabuddhe INITIALIZE_PASS_BEGIN(MachineCycleInfoPrinterPass, "print-machine-cycles",
98*1d0244aeSSameer Sahasrabuddhe                       "Print Machine Cycle Info Analysis", true, true)
99*1d0244aeSSameer Sahasrabuddhe INITIALIZE_PASS_DEPENDENCY(MachineCycleInfoWrapperPass)
100*1d0244aeSSameer Sahasrabuddhe INITIALIZE_PASS_END(MachineCycleInfoPrinterPass, "print-machine-cycles",
101*1d0244aeSSameer Sahasrabuddhe                     "Print Machine Cycle Info Analysis", true, true)
102*1d0244aeSSameer Sahasrabuddhe 
103*1d0244aeSSameer Sahasrabuddhe void MachineCycleInfoPrinterPass::getAnalysisUsage(AnalysisUsage &AU) const {
104*1d0244aeSSameer Sahasrabuddhe   AU.setPreservesAll();
105*1d0244aeSSameer Sahasrabuddhe   AU.addRequired<MachineCycleInfoWrapperPass>();
106*1d0244aeSSameer Sahasrabuddhe   MachineFunctionPass::getAnalysisUsage(AU);
107*1d0244aeSSameer Sahasrabuddhe }
108*1d0244aeSSameer Sahasrabuddhe 
109*1d0244aeSSameer Sahasrabuddhe bool MachineCycleInfoPrinterPass::runOnMachineFunction(MachineFunction &F) {
110*1d0244aeSSameer Sahasrabuddhe   auto &CI = getAnalysis<MachineCycleInfoWrapperPass>();
111*1d0244aeSSameer Sahasrabuddhe   CI.print(errs());
112*1d0244aeSSameer Sahasrabuddhe   return false;
113*1d0244aeSSameer Sahasrabuddhe }
114