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