xref: /llvm-project/llvm/lib/Analysis/CycleAnalysis.cpp (revision 236fda550d36d35a00785938c3e38b0f402aeda6)
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