1 ///===- LazyMachineBlockFrequencyInfo.cpp - Lazy Machine Block Frequency --===//
2 ///
3 ///                     The LLVM Compiler Infrastructure
4 ///
5 /// This file is distributed under the University of Illinois Open Source
6 /// License. See LICENSE.TXT for details.
7 ///
8 ///===---------------------------------------------------------------------===//
9 /// \file
10 /// This is an alternative analysis pass to MachineBlockFrequencyInfo.  The
11 /// difference is that with this pass the block frequencies are not computed
12 /// when the analysis pass is executed but rather when the BFI result is
13 /// explicitly requested by the analysis client.
14 ///
15 ///===---------------------------------------------------------------------===//
16 
17 #include "llvm/CodeGen/LazyMachineBlockFrequencyInfo.h"
18 
19 using namespace llvm;
20 
21 #define DEBUG_TYPE "lazy-machine-block-freq"
22 
23 INITIALIZE_PASS_BEGIN(LazyMachineBlockFrequencyInfoPass, DEBUG_TYPE,
24                       "Lazy Machine Block Frequency Analysis", true, true)
25 INITIALIZE_PASS_DEPENDENCY(MachineBranchProbabilityInfo)
26 INITIALIZE_PASS_DEPENDENCY(MachineLoopInfo)
27 INITIALIZE_PASS_END(LazyMachineBlockFrequencyInfoPass, DEBUG_TYPE,
28                     "Lazy Machine Block Frequency Analysis", true, true)
29 
30 char LazyMachineBlockFrequencyInfoPass::ID = 0;
31 
32 LazyMachineBlockFrequencyInfoPass::LazyMachineBlockFrequencyInfoPass()
33     : MachineFunctionPass(ID) {
34   initializeLazyMachineBlockFrequencyInfoPassPass(
35       *PassRegistry::getPassRegistry());
36 }
37 
38 void LazyMachineBlockFrequencyInfoPass::print(raw_ostream &OS,
39                                               const Module *M) const {
40   LMBFI.getCalculated().print(OS, M);
41 }
42 
43 void LazyMachineBlockFrequencyInfoPass::getAnalysisUsage(
44     AnalysisUsage &AU) const {
45   AU.addRequired<MachineBranchProbabilityInfo>();
46   AU.addRequired<MachineLoopInfo>();
47   AU.setPreservesAll();
48   MachineFunctionPass::getAnalysisUsage(AU);
49 }
50 
51 void LazyMachineBlockFrequencyInfoPass::releaseMemory() {
52   LMBFI.releaseMemory();
53 }
54 
55 bool LazyMachineBlockFrequencyInfoPass::runOnMachineFunction(
56     MachineFunction &MF) {
57   auto &BPIPass = getAnalysis<MachineBranchProbabilityInfo>();
58   auto &LI = getAnalysis<MachineLoopInfo>();
59   LMBFI.setAnalysis(&MF, &BPIPass, &LI);
60   return false;
61 }
62 
63 void LazyMachineBlockFrequencyInfoPass::getLazyMachineBFIAnalysisUsage(
64     AnalysisUsage &AU) {
65   AU.addRequired<LazyMachineBlockFrequencyInfoPass>();
66   AU.addRequired<MachineBranchProbabilityInfo>();
67   AU.addRequired<MachineLoopInfo>();
68 }
69 
70 void llvm::initializeLazyMachineBFIPassPass(PassRegistry &Registry) {
71   INITIALIZE_PASS_DEPENDENCY(LazyMachineBlockFrequencyInfoPass);
72   INITIALIZE_PASS_DEPENDENCY(MachineBranchProbabilityInfo);
73   INITIALIZE_PASS_DEPENDENCY(MachineLoopInfo);
74 }
75