xref: /aosp_15_r20/external/llvm/lib/Analysis/BlockFrequencyInfo.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===- BlockFrequencyInfo.cpp - Block Frequency Analysis ------------------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // Loops should be simplified before this analysis.
11*9880d681SAndroid Build Coastguard Worker //
12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker 
14*9880d681SAndroid Build Coastguard Worker #include "llvm/Analysis/BlockFrequencyInfo.h"
15*9880d681SAndroid Build Coastguard Worker #include "llvm/Analysis/BlockFrequencyInfoImpl.h"
16*9880d681SAndroid Build Coastguard Worker #include "llvm/Analysis/BranchProbabilityInfo.h"
17*9880d681SAndroid Build Coastguard Worker #include "llvm/Analysis/LoopInfo.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm/Analysis/Passes.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/CFG.h"
20*9880d681SAndroid Build Coastguard Worker #include "llvm/InitializePasses.h"
21*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/CommandLine.h"
22*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Debug.h"
23*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/GraphWriter.h"
24*9880d681SAndroid Build Coastguard Worker 
25*9880d681SAndroid Build Coastguard Worker using namespace llvm;
26*9880d681SAndroid Build Coastguard Worker 
27*9880d681SAndroid Build Coastguard Worker #define DEBUG_TYPE "block-freq"
28*9880d681SAndroid Build Coastguard Worker 
29*9880d681SAndroid Build Coastguard Worker #ifndef NDEBUG
30*9880d681SAndroid Build Coastguard Worker static cl::opt<GVDAGType> ViewBlockFreqPropagationDAG(
31*9880d681SAndroid Build Coastguard Worker     "view-block-freq-propagation-dags", cl::Hidden,
32*9880d681SAndroid Build Coastguard Worker     cl::desc("Pop up a window to show a dag displaying how block "
33*9880d681SAndroid Build Coastguard Worker              "frequencies propagation through the CFG."),
34*9880d681SAndroid Build Coastguard Worker     cl::values(clEnumValN(GVDT_None, "none", "do not display graphs."),
35*9880d681SAndroid Build Coastguard Worker                clEnumValN(GVDT_Fraction, "fraction",
36*9880d681SAndroid Build Coastguard Worker                           "display a graph using the "
37*9880d681SAndroid Build Coastguard Worker                           "fractional block frequency representation."),
38*9880d681SAndroid Build Coastguard Worker                clEnumValN(GVDT_Integer, "integer",
39*9880d681SAndroid Build Coastguard Worker                           "display a graph using the raw "
40*9880d681SAndroid Build Coastguard Worker                           "integer fractional block frequency representation."),
41*9880d681SAndroid Build Coastguard Worker                clEnumValN(GVDT_Count, "count", "display a graph using the real "
42*9880d681SAndroid Build Coastguard Worker                                                "profile count if available."),
43*9880d681SAndroid Build Coastguard Worker                clEnumValEnd));
44*9880d681SAndroid Build Coastguard Worker 
45*9880d681SAndroid Build Coastguard Worker cl::opt<std::string>
46*9880d681SAndroid Build Coastguard Worker     ViewBlockFreqFuncName("view-bfi-func-name", cl::Hidden,
47*9880d681SAndroid Build Coastguard Worker                           cl::desc("The option to specify "
48*9880d681SAndroid Build Coastguard Worker                                    "the name of the function "
49*9880d681SAndroid Build Coastguard Worker                                    "whose CFG will be displayed."));
50*9880d681SAndroid Build Coastguard Worker 
51*9880d681SAndroid Build Coastguard Worker cl::opt<unsigned>
52*9880d681SAndroid Build Coastguard Worker     ViewHotFreqPercent("view-hot-freq-percent", cl::init(10), cl::Hidden,
53*9880d681SAndroid Build Coastguard Worker                        cl::desc("An integer in percent used to specify "
54*9880d681SAndroid Build Coastguard Worker                                 "the hot blocks/edges to be displayed "
55*9880d681SAndroid Build Coastguard Worker                                 "in red: a block or edge whose frequency "
56*9880d681SAndroid Build Coastguard Worker                                 "is no less than the max frequency of the "
57*9880d681SAndroid Build Coastguard Worker                                 "function multiplied by this percent."));
58*9880d681SAndroid Build Coastguard Worker 
59*9880d681SAndroid Build Coastguard Worker namespace llvm {
60*9880d681SAndroid Build Coastguard Worker 
61*9880d681SAndroid Build Coastguard Worker template <>
62*9880d681SAndroid Build Coastguard Worker struct GraphTraits<BlockFrequencyInfo *> {
63*9880d681SAndroid Build Coastguard Worker   typedef const BasicBlock NodeType;
64*9880d681SAndroid Build Coastguard Worker   typedef succ_const_iterator ChildIteratorType;
65*9880d681SAndroid Build Coastguard Worker   typedef Function::const_iterator nodes_iterator;
66*9880d681SAndroid Build Coastguard Worker 
getEntryNodellvm::GraphTraits67*9880d681SAndroid Build Coastguard Worker   static inline const NodeType *getEntryNode(const BlockFrequencyInfo *G) {
68*9880d681SAndroid Build Coastguard Worker     return &G->getFunction()->front();
69*9880d681SAndroid Build Coastguard Worker   }
child_beginllvm::GraphTraits70*9880d681SAndroid Build Coastguard Worker   static ChildIteratorType child_begin(const NodeType *N) {
71*9880d681SAndroid Build Coastguard Worker     return succ_begin(N);
72*9880d681SAndroid Build Coastguard Worker   }
child_endllvm::GraphTraits73*9880d681SAndroid Build Coastguard Worker   static ChildIteratorType child_end(const NodeType *N) {
74*9880d681SAndroid Build Coastguard Worker     return succ_end(N);
75*9880d681SAndroid Build Coastguard Worker   }
nodes_beginllvm::GraphTraits76*9880d681SAndroid Build Coastguard Worker   static nodes_iterator nodes_begin(const BlockFrequencyInfo *G) {
77*9880d681SAndroid Build Coastguard Worker     return G->getFunction()->begin();
78*9880d681SAndroid Build Coastguard Worker   }
nodes_endllvm::GraphTraits79*9880d681SAndroid Build Coastguard Worker   static nodes_iterator nodes_end(const BlockFrequencyInfo *G) {
80*9880d681SAndroid Build Coastguard Worker     return G->getFunction()->end();
81*9880d681SAndroid Build Coastguard Worker   }
82*9880d681SAndroid Build Coastguard Worker };
83*9880d681SAndroid Build Coastguard Worker 
84*9880d681SAndroid Build Coastguard Worker typedef BFIDOTGraphTraitsBase<BlockFrequencyInfo, BranchProbabilityInfo>
85*9880d681SAndroid Build Coastguard Worker     BFIDOTGTraitsBase;
86*9880d681SAndroid Build Coastguard Worker 
87*9880d681SAndroid Build Coastguard Worker template <>
88*9880d681SAndroid Build Coastguard Worker struct DOTGraphTraits<BlockFrequencyInfo *> : public BFIDOTGTraitsBase {
DOTGraphTraitsllvm::DOTGraphTraits89*9880d681SAndroid Build Coastguard Worker   explicit DOTGraphTraits(bool isSimple = false)
90*9880d681SAndroid Build Coastguard Worker       : BFIDOTGTraitsBase(isSimple) {}
91*9880d681SAndroid Build Coastguard Worker 
getNodeLabelllvm::DOTGraphTraits92*9880d681SAndroid Build Coastguard Worker   std::string getNodeLabel(const BasicBlock *Node,
93*9880d681SAndroid Build Coastguard Worker                            const BlockFrequencyInfo *Graph) {
94*9880d681SAndroid Build Coastguard Worker 
95*9880d681SAndroid Build Coastguard Worker     return BFIDOTGTraitsBase::getNodeLabel(Node, Graph,
96*9880d681SAndroid Build Coastguard Worker                                            ViewBlockFreqPropagationDAG);
97*9880d681SAndroid Build Coastguard Worker   }
98*9880d681SAndroid Build Coastguard Worker 
getNodeAttributesllvm::DOTGraphTraits99*9880d681SAndroid Build Coastguard Worker   std::string getNodeAttributes(const BasicBlock *Node,
100*9880d681SAndroid Build Coastguard Worker                                 const BlockFrequencyInfo *Graph) {
101*9880d681SAndroid Build Coastguard Worker     return BFIDOTGTraitsBase::getNodeAttributes(Node, Graph,
102*9880d681SAndroid Build Coastguard Worker                                                 ViewHotFreqPercent);
103*9880d681SAndroid Build Coastguard Worker   }
104*9880d681SAndroid Build Coastguard Worker 
getEdgeAttributesllvm::DOTGraphTraits105*9880d681SAndroid Build Coastguard Worker   std::string getEdgeAttributes(const BasicBlock *Node, EdgeIter EI,
106*9880d681SAndroid Build Coastguard Worker                                 const BlockFrequencyInfo *BFI) {
107*9880d681SAndroid Build Coastguard Worker     return BFIDOTGTraitsBase::getEdgeAttributes(Node, EI, BFI, BFI->getBPI(),
108*9880d681SAndroid Build Coastguard Worker                                                 ViewHotFreqPercent);
109*9880d681SAndroid Build Coastguard Worker   }
110*9880d681SAndroid Build Coastguard Worker };
111*9880d681SAndroid Build Coastguard Worker 
112*9880d681SAndroid Build Coastguard Worker } // end namespace llvm
113*9880d681SAndroid Build Coastguard Worker #endif
114*9880d681SAndroid Build Coastguard Worker 
BlockFrequencyInfo()115*9880d681SAndroid Build Coastguard Worker BlockFrequencyInfo::BlockFrequencyInfo() {}
116*9880d681SAndroid Build Coastguard Worker 
BlockFrequencyInfo(const Function & F,const BranchProbabilityInfo & BPI,const LoopInfo & LI)117*9880d681SAndroid Build Coastguard Worker BlockFrequencyInfo::BlockFrequencyInfo(const Function &F,
118*9880d681SAndroid Build Coastguard Worker                                        const BranchProbabilityInfo &BPI,
119*9880d681SAndroid Build Coastguard Worker                                        const LoopInfo &LI) {
120*9880d681SAndroid Build Coastguard Worker   calculate(F, BPI, LI);
121*9880d681SAndroid Build Coastguard Worker }
122*9880d681SAndroid Build Coastguard Worker 
BlockFrequencyInfo(BlockFrequencyInfo && Arg)123*9880d681SAndroid Build Coastguard Worker BlockFrequencyInfo::BlockFrequencyInfo(BlockFrequencyInfo &&Arg)
124*9880d681SAndroid Build Coastguard Worker     : BFI(std::move(Arg.BFI)) {}
125*9880d681SAndroid Build Coastguard Worker 
operator =(BlockFrequencyInfo && RHS)126*9880d681SAndroid Build Coastguard Worker BlockFrequencyInfo &BlockFrequencyInfo::operator=(BlockFrequencyInfo &&RHS) {
127*9880d681SAndroid Build Coastguard Worker   releaseMemory();
128*9880d681SAndroid Build Coastguard Worker   BFI = std::move(RHS.BFI);
129*9880d681SAndroid Build Coastguard Worker   return *this;
130*9880d681SAndroid Build Coastguard Worker }
131*9880d681SAndroid Build Coastguard Worker 
132*9880d681SAndroid Build Coastguard Worker // Explicitly define the default constructor otherwise it would be implicitly
133*9880d681SAndroid Build Coastguard Worker // defined at the first ODR-use which is the BFI member in the
134*9880d681SAndroid Build Coastguard Worker // LazyBlockFrequencyInfo header.  The dtor needs the BlockFrequencyInfoImpl
135*9880d681SAndroid Build Coastguard Worker // template instantiated which is not available in the header.
~BlockFrequencyInfo()136*9880d681SAndroid Build Coastguard Worker BlockFrequencyInfo::~BlockFrequencyInfo() {}
137*9880d681SAndroid Build Coastguard Worker 
calculate(const Function & F,const BranchProbabilityInfo & BPI,const LoopInfo & LI)138*9880d681SAndroid Build Coastguard Worker void BlockFrequencyInfo::calculate(const Function &F,
139*9880d681SAndroid Build Coastguard Worker                                    const BranchProbabilityInfo &BPI,
140*9880d681SAndroid Build Coastguard Worker                                    const LoopInfo &LI) {
141*9880d681SAndroid Build Coastguard Worker   if (!BFI)
142*9880d681SAndroid Build Coastguard Worker     BFI.reset(new ImplType);
143*9880d681SAndroid Build Coastguard Worker   BFI->calculate(F, BPI, LI);
144*9880d681SAndroid Build Coastguard Worker #ifndef NDEBUG
145*9880d681SAndroid Build Coastguard Worker   if (ViewBlockFreqPropagationDAG != GVDT_None &&
146*9880d681SAndroid Build Coastguard Worker       (ViewBlockFreqFuncName.empty() ||
147*9880d681SAndroid Build Coastguard Worker        F.getName().equals(ViewBlockFreqFuncName))) {
148*9880d681SAndroid Build Coastguard Worker     view();
149*9880d681SAndroid Build Coastguard Worker   }
150*9880d681SAndroid Build Coastguard Worker #endif
151*9880d681SAndroid Build Coastguard Worker }
152*9880d681SAndroid Build Coastguard Worker 
getBlockFreq(const BasicBlock * BB) const153*9880d681SAndroid Build Coastguard Worker BlockFrequency BlockFrequencyInfo::getBlockFreq(const BasicBlock *BB) const {
154*9880d681SAndroid Build Coastguard Worker   return BFI ? BFI->getBlockFreq(BB) : 0;
155*9880d681SAndroid Build Coastguard Worker }
156*9880d681SAndroid Build Coastguard Worker 
157*9880d681SAndroid Build Coastguard Worker Optional<uint64_t>
getBlockProfileCount(const BasicBlock * BB) const158*9880d681SAndroid Build Coastguard Worker BlockFrequencyInfo::getBlockProfileCount(const BasicBlock *BB) const {
159*9880d681SAndroid Build Coastguard Worker   if (!BFI)
160*9880d681SAndroid Build Coastguard Worker     return None;
161*9880d681SAndroid Build Coastguard Worker 
162*9880d681SAndroid Build Coastguard Worker   return BFI->getBlockProfileCount(*getFunction(), BB);
163*9880d681SAndroid Build Coastguard Worker }
164*9880d681SAndroid Build Coastguard Worker 
setBlockFreq(const BasicBlock * BB,uint64_t Freq)165*9880d681SAndroid Build Coastguard Worker void BlockFrequencyInfo::setBlockFreq(const BasicBlock *BB, uint64_t Freq) {
166*9880d681SAndroid Build Coastguard Worker   assert(BFI && "Expected analysis to be available");
167*9880d681SAndroid Build Coastguard Worker   BFI->setBlockFreq(BB, Freq);
168*9880d681SAndroid Build Coastguard Worker }
169*9880d681SAndroid Build Coastguard Worker 
170*9880d681SAndroid Build Coastguard Worker /// Pop up a ghostview window with the current block frequency propagation
171*9880d681SAndroid Build Coastguard Worker /// rendered using dot.
view() const172*9880d681SAndroid Build Coastguard Worker void BlockFrequencyInfo::view() const {
173*9880d681SAndroid Build Coastguard Worker // This code is only for debugging.
174*9880d681SAndroid Build Coastguard Worker #ifndef NDEBUG
175*9880d681SAndroid Build Coastguard Worker   ViewGraph(const_cast<BlockFrequencyInfo *>(this), "BlockFrequencyDAGs");
176*9880d681SAndroid Build Coastguard Worker #else
177*9880d681SAndroid Build Coastguard Worker   errs() << "BlockFrequencyInfo::view is only available in debug builds on "
178*9880d681SAndroid Build Coastguard Worker             "systems with Graphviz or gv!\n";
179*9880d681SAndroid Build Coastguard Worker #endif // NDEBUG
180*9880d681SAndroid Build Coastguard Worker }
181*9880d681SAndroid Build Coastguard Worker 
getFunction() const182*9880d681SAndroid Build Coastguard Worker const Function *BlockFrequencyInfo::getFunction() const {
183*9880d681SAndroid Build Coastguard Worker   return BFI ? BFI->getFunction() : nullptr;
184*9880d681SAndroid Build Coastguard Worker }
185*9880d681SAndroid Build Coastguard Worker 
getBPI() const186*9880d681SAndroid Build Coastguard Worker const BranchProbabilityInfo *BlockFrequencyInfo::getBPI() const {
187*9880d681SAndroid Build Coastguard Worker   return BFI ? &BFI->getBPI() : nullptr;
188*9880d681SAndroid Build Coastguard Worker }
189*9880d681SAndroid Build Coastguard Worker 
190*9880d681SAndroid Build Coastguard Worker raw_ostream &BlockFrequencyInfo::
printBlockFreq(raw_ostream & OS,const BlockFrequency Freq) const191*9880d681SAndroid Build Coastguard Worker printBlockFreq(raw_ostream &OS, const BlockFrequency Freq) const {
192*9880d681SAndroid Build Coastguard Worker   return BFI ? BFI->printBlockFreq(OS, Freq) : OS;
193*9880d681SAndroid Build Coastguard Worker }
194*9880d681SAndroid Build Coastguard Worker 
195*9880d681SAndroid Build Coastguard Worker raw_ostream &
printBlockFreq(raw_ostream & OS,const BasicBlock * BB) const196*9880d681SAndroid Build Coastguard Worker BlockFrequencyInfo::printBlockFreq(raw_ostream &OS,
197*9880d681SAndroid Build Coastguard Worker                                    const BasicBlock *BB) const {
198*9880d681SAndroid Build Coastguard Worker   return BFI ? BFI->printBlockFreq(OS, BB) : OS;
199*9880d681SAndroid Build Coastguard Worker }
200*9880d681SAndroid Build Coastguard Worker 
getEntryFreq() const201*9880d681SAndroid Build Coastguard Worker uint64_t BlockFrequencyInfo::getEntryFreq() const {
202*9880d681SAndroid Build Coastguard Worker   return BFI ? BFI->getEntryFreq() : 0;
203*9880d681SAndroid Build Coastguard Worker }
204*9880d681SAndroid Build Coastguard Worker 
releaseMemory()205*9880d681SAndroid Build Coastguard Worker void BlockFrequencyInfo::releaseMemory() { BFI.reset(); }
206*9880d681SAndroid Build Coastguard Worker 
print(raw_ostream & OS) const207*9880d681SAndroid Build Coastguard Worker void BlockFrequencyInfo::print(raw_ostream &OS) const {
208*9880d681SAndroid Build Coastguard Worker   if (BFI)
209*9880d681SAndroid Build Coastguard Worker     BFI->print(OS);
210*9880d681SAndroid Build Coastguard Worker }
211*9880d681SAndroid Build Coastguard Worker 
212*9880d681SAndroid Build Coastguard Worker 
213*9880d681SAndroid Build Coastguard Worker INITIALIZE_PASS_BEGIN(BlockFrequencyInfoWrapperPass, "block-freq",
214*9880d681SAndroid Build Coastguard Worker                       "Block Frequency Analysis", true, true)
215*9880d681SAndroid Build Coastguard Worker INITIALIZE_PASS_DEPENDENCY(BranchProbabilityInfoWrapperPass)
216*9880d681SAndroid Build Coastguard Worker INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass)
217*9880d681SAndroid Build Coastguard Worker INITIALIZE_PASS_END(BlockFrequencyInfoWrapperPass, "block-freq",
218*9880d681SAndroid Build Coastguard Worker                     "Block Frequency Analysis", true, true)
219*9880d681SAndroid Build Coastguard Worker 
220*9880d681SAndroid Build Coastguard Worker char BlockFrequencyInfoWrapperPass::ID = 0;
221*9880d681SAndroid Build Coastguard Worker 
222*9880d681SAndroid Build Coastguard Worker 
BlockFrequencyInfoWrapperPass()223*9880d681SAndroid Build Coastguard Worker BlockFrequencyInfoWrapperPass::BlockFrequencyInfoWrapperPass()
224*9880d681SAndroid Build Coastguard Worker     : FunctionPass(ID) {
225*9880d681SAndroid Build Coastguard Worker   initializeBlockFrequencyInfoWrapperPassPass(*PassRegistry::getPassRegistry());
226*9880d681SAndroid Build Coastguard Worker }
227*9880d681SAndroid Build Coastguard Worker 
~BlockFrequencyInfoWrapperPass()228*9880d681SAndroid Build Coastguard Worker BlockFrequencyInfoWrapperPass::~BlockFrequencyInfoWrapperPass() {}
229*9880d681SAndroid Build Coastguard Worker 
print(raw_ostream & OS,const Module *) const230*9880d681SAndroid Build Coastguard Worker void BlockFrequencyInfoWrapperPass::print(raw_ostream &OS,
231*9880d681SAndroid Build Coastguard Worker                                           const Module *) const {
232*9880d681SAndroid Build Coastguard Worker   BFI.print(OS);
233*9880d681SAndroid Build Coastguard Worker }
234*9880d681SAndroid Build Coastguard Worker 
getAnalysisUsage(AnalysisUsage & AU) const235*9880d681SAndroid Build Coastguard Worker void BlockFrequencyInfoWrapperPass::getAnalysisUsage(AnalysisUsage &AU) const {
236*9880d681SAndroid Build Coastguard Worker   AU.addRequired<BranchProbabilityInfoWrapperPass>();
237*9880d681SAndroid Build Coastguard Worker   AU.addRequired<LoopInfoWrapperPass>();
238*9880d681SAndroid Build Coastguard Worker   AU.setPreservesAll();
239*9880d681SAndroid Build Coastguard Worker }
240*9880d681SAndroid Build Coastguard Worker 
releaseMemory()241*9880d681SAndroid Build Coastguard Worker void BlockFrequencyInfoWrapperPass::releaseMemory() { BFI.releaseMemory(); }
242*9880d681SAndroid Build Coastguard Worker 
runOnFunction(Function & F)243*9880d681SAndroid Build Coastguard Worker bool BlockFrequencyInfoWrapperPass::runOnFunction(Function &F) {
244*9880d681SAndroid Build Coastguard Worker   BranchProbabilityInfo &BPI =
245*9880d681SAndroid Build Coastguard Worker       getAnalysis<BranchProbabilityInfoWrapperPass>().getBPI();
246*9880d681SAndroid Build Coastguard Worker   LoopInfo &LI = getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
247*9880d681SAndroid Build Coastguard Worker   BFI.calculate(F, BPI, LI);
248*9880d681SAndroid Build Coastguard Worker   return false;
249*9880d681SAndroid Build Coastguard Worker }
250*9880d681SAndroid Build Coastguard Worker 
251*9880d681SAndroid Build Coastguard Worker char BlockFrequencyAnalysis::PassID;
run(Function & F,AnalysisManager<Function> & AM)252*9880d681SAndroid Build Coastguard Worker BlockFrequencyInfo BlockFrequencyAnalysis::run(Function &F,
253*9880d681SAndroid Build Coastguard Worker                                                AnalysisManager<Function> &AM) {
254*9880d681SAndroid Build Coastguard Worker   BlockFrequencyInfo BFI;
255*9880d681SAndroid Build Coastguard Worker   BFI.calculate(F, AM.getResult<BranchProbabilityAnalysis>(F),
256*9880d681SAndroid Build Coastguard Worker                 AM.getResult<LoopAnalysis>(F));
257*9880d681SAndroid Build Coastguard Worker   return BFI;
258*9880d681SAndroid Build Coastguard Worker }
259*9880d681SAndroid Build Coastguard Worker 
260*9880d681SAndroid Build Coastguard Worker PreservedAnalyses
run(Function & F,AnalysisManager<Function> & AM)261*9880d681SAndroid Build Coastguard Worker BlockFrequencyPrinterPass::run(Function &F, AnalysisManager<Function> &AM) {
262*9880d681SAndroid Build Coastguard Worker   OS << "Printing analysis results of BFI for function "
263*9880d681SAndroid Build Coastguard Worker      << "'" << F.getName() << "':"
264*9880d681SAndroid Build Coastguard Worker      << "\n";
265*9880d681SAndroid Build Coastguard Worker   AM.getResult<BlockFrequencyAnalysis>(F).print(OS);
266*9880d681SAndroid Build Coastguard Worker   return PreservedAnalyses::all();
267*9880d681SAndroid Build Coastguard Worker }
268