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