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