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