1bbb141c7SAdam Nemet ///===- LazyMachineBlockFrequencyInfo.cpp - Lazy Machine Block Frequency --===//
2bbb141c7SAdam Nemet ///
3bbb141c7SAdam Nemet ///                     The LLVM Compiler Infrastructure
4bbb141c7SAdam Nemet ///
5bbb141c7SAdam Nemet /// This file is distributed under the University of Illinois Open Source
6bbb141c7SAdam Nemet /// License. See LICENSE.TXT for details.
7bbb141c7SAdam Nemet ///
8bbb141c7SAdam Nemet ///===---------------------------------------------------------------------===//
9bbb141c7SAdam Nemet /// \file
10bbb141c7SAdam Nemet /// This is an alternative analysis pass to MachineBlockFrequencyInfo.  The
11bbb141c7SAdam Nemet /// difference is that with this pass the block frequencies are not computed
12bbb141c7SAdam Nemet /// when the analysis pass is executed but rather when the BFI result is
13bbb141c7SAdam Nemet /// explicitly requested by the analysis client.
14bbb141c7SAdam Nemet ///
15bbb141c7SAdam Nemet ///===---------------------------------------------------------------------===//
16bbb141c7SAdam Nemet 
17bbb141c7SAdam Nemet #include "llvm/CodeGen/LazyMachineBlockFrequencyInfo.h"
18bbb141c7SAdam Nemet 
19bbb141c7SAdam Nemet using namespace llvm;
20bbb141c7SAdam Nemet 
21bbb141c7SAdam Nemet #define DEBUG_TYPE "lazy-machine-block-freq"
22bbb141c7SAdam Nemet 
23bbb141c7SAdam Nemet INITIALIZE_PASS_BEGIN(LazyMachineBlockFrequencyInfoPass, DEBUG_TYPE,
24bbb141c7SAdam Nemet                       "Lazy Machine Block Frequency Analysis", true, true)
25bbb141c7SAdam Nemet INITIALIZE_PASS_DEPENDENCY(MachineBranchProbabilityInfo)
26bbb141c7SAdam Nemet INITIALIZE_PASS_DEPENDENCY(MachineLoopInfo)
27bbb141c7SAdam Nemet INITIALIZE_PASS_END(LazyMachineBlockFrequencyInfoPass, DEBUG_TYPE,
28bbb141c7SAdam Nemet                     "Lazy Machine Block Frequency Analysis", true, true)
29bbb141c7SAdam Nemet 
30bbb141c7SAdam Nemet char LazyMachineBlockFrequencyInfoPass::ID = 0;
31bbb141c7SAdam Nemet 
32bbb141c7SAdam Nemet LazyMachineBlockFrequencyInfoPass::LazyMachineBlockFrequencyInfoPass()
33bbb141c7SAdam Nemet     : MachineFunctionPass(ID) {
34bbb141c7SAdam Nemet   initializeLazyMachineBlockFrequencyInfoPassPass(
35bbb141c7SAdam Nemet       *PassRegistry::getPassRegistry());
36bbb141c7SAdam Nemet }
37bbb141c7SAdam Nemet 
38bbb141c7SAdam Nemet void LazyMachineBlockFrequencyInfoPass::print(raw_ostream &OS,
39bbb141c7SAdam Nemet                                               const Module *M) const {
40*b516cf3fSAdam Nemet   getBFI().print(OS, M);
41bbb141c7SAdam Nemet }
42bbb141c7SAdam Nemet 
43bbb141c7SAdam Nemet void LazyMachineBlockFrequencyInfoPass::getAnalysisUsage(
44bbb141c7SAdam Nemet     AnalysisUsage &AU) const {
45bbb141c7SAdam Nemet   AU.addRequired<MachineBranchProbabilityInfo>();
46bbb141c7SAdam Nemet   AU.setPreservesAll();
47bbb141c7SAdam Nemet   MachineFunctionPass::getAnalysisUsage(AU);
48bbb141c7SAdam Nemet }
49bbb141c7SAdam Nemet 
50bbb141c7SAdam Nemet void LazyMachineBlockFrequencyInfoPass::releaseMemory() {
51*b516cf3fSAdam Nemet   OwnedMBFI.reset();
52*b516cf3fSAdam Nemet   OwnedMLI.reset();
53*b516cf3fSAdam Nemet   OwnedMDT.reset();
54*b516cf3fSAdam Nemet }
55*b516cf3fSAdam Nemet 
56*b516cf3fSAdam Nemet MachineBlockFrequencyInfo &
57*b516cf3fSAdam Nemet LazyMachineBlockFrequencyInfoPass::calculateIfNotAvailable() const {
58*b516cf3fSAdam Nemet   auto *MBFI = getAnalysisIfAvailable<MachineBlockFrequencyInfo>();
59*b516cf3fSAdam Nemet   if (MBFI) {
60*b516cf3fSAdam Nemet     DEBUG(dbgs() << "MachineBlockFrequencyInfo is available\n");
61*b516cf3fSAdam Nemet     return *MBFI;
62*b516cf3fSAdam Nemet   }
63*b516cf3fSAdam Nemet 
64*b516cf3fSAdam Nemet   auto &MBPI = getAnalysis<MachineBranchProbabilityInfo>();
65*b516cf3fSAdam Nemet   auto *MLI = getAnalysisIfAvailable<MachineLoopInfo>();
66*b516cf3fSAdam Nemet   auto *MDT = getAnalysisIfAvailable<MachineDominatorTree>();
67*b516cf3fSAdam Nemet   DEBUG(dbgs() << "Building MachineBlockFrequencyInfo on the fly\n");
68*b516cf3fSAdam Nemet   DEBUG(if (MLI) dbgs() << "LoopInfo is available\n");
69*b516cf3fSAdam Nemet 
70*b516cf3fSAdam Nemet   if (!MLI) {
71*b516cf3fSAdam Nemet     DEBUG(dbgs() << "Building LoopInfo on the fly\n");
72*b516cf3fSAdam Nemet     // First create a dominator tree.
73*b516cf3fSAdam Nemet     DEBUG(if (MDT) dbgs() << "DominatorTree is available\n");
74*b516cf3fSAdam Nemet 
75*b516cf3fSAdam Nemet     if (!MDT) {
76*b516cf3fSAdam Nemet       DEBUG(dbgs() << "Building DominatorTree on the fly\n");
77*b516cf3fSAdam Nemet       OwnedMDT = make_unique<MachineDominatorTree>();
78*b516cf3fSAdam Nemet       OwnedMDT->getBase().recalculate(*MF);
79*b516cf3fSAdam Nemet       MDT = OwnedMDT.get();
80*b516cf3fSAdam Nemet     }
81*b516cf3fSAdam Nemet 
82*b516cf3fSAdam Nemet     // Generate LoopInfo from it.
83*b516cf3fSAdam Nemet     OwnedMLI = make_unique<MachineLoopInfo>();
84*b516cf3fSAdam Nemet     OwnedMLI->getBase().analyze(MDT->getBase());
85*b516cf3fSAdam Nemet     MLI = OwnedMLI.get();
86*b516cf3fSAdam Nemet   }
87*b516cf3fSAdam Nemet 
88*b516cf3fSAdam Nemet   OwnedMBFI = make_unique<MachineBlockFrequencyInfo>();
89*b516cf3fSAdam Nemet   OwnedMBFI->calculate(*MF, MBPI, *MLI);
90*b516cf3fSAdam Nemet   return *OwnedMBFI.get();
91bbb141c7SAdam Nemet }
92bbb141c7SAdam Nemet 
93bbb141c7SAdam Nemet bool LazyMachineBlockFrequencyInfoPass::runOnMachineFunction(
94*b516cf3fSAdam Nemet     MachineFunction &F) {
95*b516cf3fSAdam Nemet   MF = &F;
96bbb141c7SAdam Nemet   return false;
97bbb141c7SAdam Nemet }
98