11d0244aeSSameer Sahasrabuddhe //===- CycleAnalysis.cpp - Compute CycleInfo for LLVM IR ------------------===// 21d0244aeSSameer Sahasrabuddhe // 31d0244aeSSameer Sahasrabuddhe // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 41d0244aeSSameer Sahasrabuddhe // See https://llvm.org/LICENSE.txt for license information. 51d0244aeSSameer Sahasrabuddhe // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 61d0244aeSSameer Sahasrabuddhe // 71d0244aeSSameer Sahasrabuddhe //===----------------------------------------------------------------------===// 81d0244aeSSameer Sahasrabuddhe 91d0244aeSSameer Sahasrabuddhe #include "llvm/Analysis/CycleAnalysis.h" 1071c3a551Sserge-sans-paille #include "llvm/IR/CFG.h" // for successors found by ADL in GenericCycleImpl.h 111d0244aeSSameer Sahasrabuddhe #include "llvm/InitializePasses.h" 121d0244aeSSameer Sahasrabuddhe 131d0244aeSSameer Sahasrabuddhe using namespace llvm; 141d0244aeSSameer Sahasrabuddhe 1571c3a551Sserge-sans-paille namespace llvm { 1671c3a551Sserge-sans-paille class Module; 177b57a1b4SMohammed Keyvanzadeh } // namespace llvm 1871c3a551Sserge-sans-paille 191d0244aeSSameer Sahasrabuddhe CycleInfo CycleAnalysis::run(Function &F, FunctionAnalysisManager &) { 201d0244aeSSameer Sahasrabuddhe CycleInfo CI; 211d0244aeSSameer Sahasrabuddhe CI.compute(F); 221d0244aeSSameer Sahasrabuddhe return CI; 231d0244aeSSameer Sahasrabuddhe } 241d0244aeSSameer Sahasrabuddhe 251d0244aeSSameer Sahasrabuddhe AnalysisKey CycleAnalysis::Key; 261d0244aeSSameer Sahasrabuddhe 271d0244aeSSameer Sahasrabuddhe CycleInfoPrinterPass::CycleInfoPrinterPass(raw_ostream &OS) : OS(OS) {} 281d0244aeSSameer Sahasrabuddhe 291d0244aeSSameer Sahasrabuddhe PreservedAnalyses CycleInfoPrinterPass::run(Function &F, 301d0244aeSSameer Sahasrabuddhe FunctionAnalysisManager &AM) { 311d0244aeSSameer Sahasrabuddhe OS << "CycleInfo for function: " << F.getName() << "\n"; 321d0244aeSSameer Sahasrabuddhe AM.getResult<CycleAnalysis>(F).print(OS); 331d0244aeSSameer Sahasrabuddhe 341d0244aeSSameer Sahasrabuddhe return PreservedAnalyses::all(); 351d0244aeSSameer Sahasrabuddhe } 361d0244aeSSameer Sahasrabuddhe 37*e6da78a3SSameer Sahasrabuddhe PreservedAnalyses CycleInfoVerifierPass::run(Function &F, 38*e6da78a3SSameer Sahasrabuddhe FunctionAnalysisManager &AM) { 39*e6da78a3SSameer Sahasrabuddhe CycleInfo &CI = AM.getResult<CycleAnalysis>(F); 40*e6da78a3SSameer Sahasrabuddhe CI.verify(); 41*e6da78a3SSameer Sahasrabuddhe return PreservedAnalyses::all(); 42*e6da78a3SSameer Sahasrabuddhe } 43*e6da78a3SSameer Sahasrabuddhe 441d0244aeSSameer Sahasrabuddhe //===----------------------------------------------------------------------===// 451d0244aeSSameer Sahasrabuddhe // CycleInfoWrapperPass Implementation 461d0244aeSSameer Sahasrabuddhe //===----------------------------------------------------------------------===// 471d0244aeSSameer Sahasrabuddhe // 481d0244aeSSameer Sahasrabuddhe // The implementation details of the wrapper pass that holds a CycleInfo 491d0244aeSSameer Sahasrabuddhe // suitable for use with the legacy pass manager. 501d0244aeSSameer Sahasrabuddhe // 511d0244aeSSameer Sahasrabuddhe //===----------------------------------------------------------------------===// 521d0244aeSSameer Sahasrabuddhe 531d0244aeSSameer Sahasrabuddhe char CycleInfoWrapperPass::ID = 0; 541d0244aeSSameer Sahasrabuddhe 551d0244aeSSameer Sahasrabuddhe CycleInfoWrapperPass::CycleInfoWrapperPass() : FunctionPass(ID) { 561d0244aeSSameer Sahasrabuddhe initializeCycleInfoWrapperPassPass(*PassRegistry::getPassRegistry()); 571d0244aeSSameer Sahasrabuddhe } 581d0244aeSSameer Sahasrabuddhe 591d0244aeSSameer Sahasrabuddhe INITIALIZE_PASS_BEGIN(CycleInfoWrapperPass, "cycles", "Cycle Info Analysis", 601d0244aeSSameer Sahasrabuddhe true, true) 611d0244aeSSameer Sahasrabuddhe INITIALIZE_PASS_END(CycleInfoWrapperPass, "cycles", "Cycle Info Analysis", true, 621d0244aeSSameer Sahasrabuddhe true) 631d0244aeSSameer Sahasrabuddhe 641d0244aeSSameer Sahasrabuddhe void CycleInfoWrapperPass::getAnalysisUsage(AnalysisUsage &AU) const { 651d0244aeSSameer Sahasrabuddhe AU.setPreservesAll(); 661d0244aeSSameer Sahasrabuddhe } 671d0244aeSSameer Sahasrabuddhe 681d0244aeSSameer Sahasrabuddhe bool CycleInfoWrapperPass::runOnFunction(Function &Func) { 691d0244aeSSameer Sahasrabuddhe CI.clear(); 701d0244aeSSameer Sahasrabuddhe 711d0244aeSSameer Sahasrabuddhe F = &Func; 721d0244aeSSameer Sahasrabuddhe CI.compute(Func); 731d0244aeSSameer Sahasrabuddhe return false; 741d0244aeSSameer Sahasrabuddhe } 751d0244aeSSameer Sahasrabuddhe 761d0244aeSSameer Sahasrabuddhe void CycleInfoWrapperPass::print(raw_ostream &OS, const Module *) const { 771d0244aeSSameer Sahasrabuddhe OS << "CycleInfo for function: " << F->getName() << "\n"; 781d0244aeSSameer Sahasrabuddhe CI.print(OS); 791d0244aeSSameer Sahasrabuddhe } 801d0244aeSSameer Sahasrabuddhe 811d0244aeSSameer Sahasrabuddhe void CycleInfoWrapperPass::releaseMemory() { 821d0244aeSSameer Sahasrabuddhe CI.clear(); 831d0244aeSSameer Sahasrabuddhe F = nullptr; 841d0244aeSSameer Sahasrabuddhe } 85