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"
17989f1c72Sserge-sans-paille #include "llvm/CodeGen/MachineBranchProbabilityInfo.h"
1805da2fe5SReid Kleckner #include "llvm/InitializePasses.h"
19bbb141c7SAdam Nemet
20bbb141c7SAdam Nemet using namespace llvm;
21bbb141c7SAdam Nemet
22bbb141c7SAdam Nemet #define DEBUG_TYPE "lazy-machine-block-freq"
23bbb141c7SAdam Nemet
24bbb141c7SAdam Nemet INITIALIZE_PASS_BEGIN(LazyMachineBlockFrequencyInfoPass, DEBUG_TYPE,
25bbb141c7SAdam Nemet "Lazy Machine Block Frequency Analysis", true, true)
26bbb141c7SAdam Nemet INITIALIZE_PASS_DEPENDENCY(MachineBranchProbabilityInfo)
27bbb141c7SAdam Nemet INITIALIZE_PASS_DEPENDENCY(MachineLoopInfo)
28bbb141c7SAdam Nemet INITIALIZE_PASS_END(LazyMachineBlockFrequencyInfoPass, DEBUG_TYPE,
29bbb141c7SAdam Nemet "Lazy Machine Block Frequency Analysis", true, true)
30bbb141c7SAdam Nemet
31bbb141c7SAdam Nemet char LazyMachineBlockFrequencyInfoPass::ID = 0;
32bbb141c7SAdam Nemet
LazyMachineBlockFrequencyInfoPass()33bbb141c7SAdam Nemet LazyMachineBlockFrequencyInfoPass::LazyMachineBlockFrequencyInfoPass()
34bbb141c7SAdam Nemet : MachineFunctionPass(ID) {
35bbb141c7SAdam Nemet initializeLazyMachineBlockFrequencyInfoPassPass(
36bbb141c7SAdam Nemet *PassRegistry::getPassRegistry());
37bbb141c7SAdam Nemet }
38bbb141c7SAdam Nemet
print(raw_ostream & OS,const Module * M) const39bbb141c7SAdam Nemet void LazyMachineBlockFrequencyInfoPass::print(raw_ostream &OS,
40bbb141c7SAdam Nemet const Module *M) const {
41b516cf3fSAdam Nemet getBFI().print(OS, M);
42bbb141c7SAdam Nemet }
43bbb141c7SAdam Nemet
getAnalysisUsage(AnalysisUsage & AU) const44bbb141c7SAdam Nemet void LazyMachineBlockFrequencyInfoPass::getAnalysisUsage(
45bbb141c7SAdam Nemet AnalysisUsage &AU) const {
46bbb141c7SAdam Nemet AU.addRequired<MachineBranchProbabilityInfo>();
47bbb141c7SAdam Nemet AU.setPreservesAll();
48bbb141c7SAdam Nemet MachineFunctionPass::getAnalysisUsage(AU);
49bbb141c7SAdam Nemet }
50bbb141c7SAdam Nemet
releaseMemory()51bbb141c7SAdam Nemet void LazyMachineBlockFrequencyInfoPass::releaseMemory() {
52b516cf3fSAdam Nemet OwnedMBFI.reset();
53b516cf3fSAdam Nemet OwnedMLI.reset();
54b516cf3fSAdam Nemet OwnedMDT.reset();
55b516cf3fSAdam Nemet }
56b516cf3fSAdam Nemet
57b516cf3fSAdam Nemet MachineBlockFrequencyInfo &
calculateIfNotAvailable() const58b516cf3fSAdam Nemet LazyMachineBlockFrequencyInfoPass::calculateIfNotAvailable() const {
59b516cf3fSAdam Nemet auto *MBFI = getAnalysisIfAvailable<MachineBlockFrequencyInfo>();
60b516cf3fSAdam Nemet if (MBFI) {
61d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "MachineBlockFrequencyInfo is available\n");
62b516cf3fSAdam Nemet return *MBFI;
63b516cf3fSAdam Nemet }
64b516cf3fSAdam Nemet
65b516cf3fSAdam Nemet auto &MBPI = getAnalysis<MachineBranchProbabilityInfo>();
66b516cf3fSAdam Nemet auto *MLI = getAnalysisIfAvailable<MachineLoopInfo>();
67b516cf3fSAdam Nemet auto *MDT = getAnalysisIfAvailable<MachineDominatorTree>();
68d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "Building MachineBlockFrequencyInfo on the fly\n");
69d34e60caSNicola Zaghen LLVM_DEBUG(if (MLI) dbgs() << "LoopInfo is available\n");
70b516cf3fSAdam Nemet
71b516cf3fSAdam Nemet if (!MLI) {
72d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "Building LoopInfo on the fly\n");
73b516cf3fSAdam Nemet // First create a dominator tree.
74d34e60caSNicola Zaghen LLVM_DEBUG(if (MDT) dbgs() << "DominatorTree is available\n");
75b516cf3fSAdam Nemet
76b516cf3fSAdam Nemet if (!MDT) {
77d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "Building DominatorTree on the fly\n");
780eaee545SJonas Devlieghere OwnedMDT = std::make_unique<MachineDominatorTree>();
79b516cf3fSAdam Nemet OwnedMDT->getBase().recalculate(*MF);
80b516cf3fSAdam Nemet MDT = OwnedMDT.get();
81b516cf3fSAdam Nemet }
82b516cf3fSAdam Nemet
83b516cf3fSAdam Nemet // Generate LoopInfo from it.
840eaee545SJonas Devlieghere OwnedMLI = std::make_unique<MachineLoopInfo>();
85b516cf3fSAdam Nemet OwnedMLI->getBase().analyze(MDT->getBase());
86b516cf3fSAdam Nemet MLI = OwnedMLI.get();
87b516cf3fSAdam Nemet }
88b516cf3fSAdam Nemet
890eaee545SJonas Devlieghere OwnedMBFI = std::make_unique<MachineBlockFrequencyInfo>();
90b516cf3fSAdam Nemet OwnedMBFI->calculate(*MF, MBPI, *MLI);
91*1eada2adSKazu Hirata return *OwnedMBFI;
92bbb141c7SAdam Nemet }
93bbb141c7SAdam Nemet
runOnMachineFunction(MachineFunction & F)94bbb141c7SAdam Nemet bool LazyMachineBlockFrequencyInfoPass::runOnMachineFunction(
95b516cf3fSAdam Nemet MachineFunction &F) {
96b516cf3fSAdam Nemet MF = &F;
97bbb141c7SAdam Nemet return false;
98bbb141c7SAdam Nemet }
99