1 //===- CycleAnalysis.h - Cycle Info for LLVM IR -----------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 /// \file 9 /// 10 /// This file declares an analysis pass that computes CycleInfo for 11 /// LLVM IR, specialized from GenericCycleInfo. 12 /// 13 //===----------------------------------------------------------------------===// 14 15 #ifndef LLVM_ANALYSIS_CYCLEANALYSIS_H 16 #define LLVM_ANALYSIS_CYCLEANALYSIS_H 17 18 #include "llvm/IR/CycleInfo.h" 19 #include "llvm/IR/PassManager.h" 20 #include "llvm/IR/SSAContext.h" 21 #include "llvm/Pass.h" 22 23 namespace llvm { 24 extern template class GenericCycleInfo<SSAContext>; 25 extern template class GenericCycle<SSAContext>; 26 27 using CycleInfo = GenericCycleInfo<SSAContext>; 28 using Cycle = CycleInfo::CycleT; 29 30 /// Legacy analysis pass which computes a \ref CycleInfo. 31 class CycleInfoWrapperPass : public FunctionPass { 32 Function *F = nullptr; 33 CycleInfo CI; 34 35 public: 36 static char ID; 37 38 CycleInfoWrapperPass(); 39 40 CycleInfo &getResult() { return CI; } 41 const CycleInfo &getResult() const { return CI; } 42 43 bool runOnFunction(Function &F) override; 44 void getAnalysisUsage(AnalysisUsage &AU) const override; 45 void releaseMemory() override; 46 void print(raw_ostream &OS, const Module *M = nullptr) const override; 47 48 // TODO: verify analysis? 49 }; 50 51 /// Analysis pass which computes a \ref CycleInfo. 52 class CycleAnalysis : public AnalysisInfoMixin<CycleAnalysis> { 53 friend AnalysisInfoMixin<CycleAnalysis>; 54 static AnalysisKey Key; 55 56 public: 57 /// Provide the result typedef for this analysis pass. 58 using Result = CycleInfo; 59 60 using LegacyWrapper = CycleInfoWrapperPass; 61 62 /// Run the analysis pass over a function and produce a dominator tree. 63 CycleInfo run(Function &F, FunctionAnalysisManager &); 64 65 // TODO: verify analysis? 66 }; 67 68 /// Printer pass for the \c DominatorTree. 69 class CycleInfoPrinterPass : public PassInfoMixin<CycleInfoPrinterPass> { 70 raw_ostream &OS; 71 72 public: 73 explicit CycleInfoPrinterPass(raw_ostream &OS); 74 75 PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); 76 }; 77 78 } // end namespace llvm 79 80 #endif // LLVM_ANALYSIS_CYCLEANALYSIS_H 81