98 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			98 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C++
		
	
	
	
| ///===- LazyMachineBlockFrequencyInfo.cpp - Lazy Machine Block Frequency --===//
 | |
| ///
 | |
| ///                     The LLVM Compiler Infrastructure
 | |
| ///
 | |
| /// This file is distributed under the University of Illinois Open Source
 | |
| /// License. See LICENSE.TXT for details.
 | |
| ///
 | |
| ///===---------------------------------------------------------------------===//
 | |
| /// \file
 | |
| /// This is an alternative analysis pass to MachineBlockFrequencyInfo.  The
 | |
| /// difference is that with this pass the block frequencies are not computed
 | |
| /// when the analysis pass is executed but rather when the BFI result is
 | |
| /// explicitly requested by the analysis client.
 | |
| ///
 | |
| ///===---------------------------------------------------------------------===//
 | |
| 
 | |
| #include "llvm/CodeGen/LazyMachineBlockFrequencyInfo.h"
 | |
| 
 | |
| using namespace llvm;
 | |
| 
 | |
| #define DEBUG_TYPE "lazy-machine-block-freq"
 | |
| 
 | |
| INITIALIZE_PASS_BEGIN(LazyMachineBlockFrequencyInfoPass, DEBUG_TYPE,
 | |
|                       "Lazy Machine Block Frequency Analysis", true, true)
 | |
| INITIALIZE_PASS_DEPENDENCY(MachineBranchProbabilityInfo)
 | |
| INITIALIZE_PASS_DEPENDENCY(MachineLoopInfo)
 | |
| INITIALIZE_PASS_END(LazyMachineBlockFrequencyInfoPass, DEBUG_TYPE,
 | |
|                     "Lazy Machine Block Frequency Analysis", true, true)
 | |
| 
 | |
| char LazyMachineBlockFrequencyInfoPass::ID = 0;
 | |
| 
 | |
| LazyMachineBlockFrequencyInfoPass::LazyMachineBlockFrequencyInfoPass()
 | |
|     : MachineFunctionPass(ID) {
 | |
|   initializeLazyMachineBlockFrequencyInfoPassPass(
 | |
|       *PassRegistry::getPassRegistry());
 | |
| }
 | |
| 
 | |
| void LazyMachineBlockFrequencyInfoPass::print(raw_ostream &OS,
 | |
|                                               const Module *M) const {
 | |
|   getBFI().print(OS, M);
 | |
| }
 | |
| 
 | |
| void LazyMachineBlockFrequencyInfoPass::getAnalysisUsage(
 | |
|     AnalysisUsage &AU) const {
 | |
|   AU.addRequired<MachineBranchProbabilityInfo>();
 | |
|   AU.setPreservesAll();
 | |
|   MachineFunctionPass::getAnalysisUsage(AU);
 | |
| }
 | |
| 
 | |
| void LazyMachineBlockFrequencyInfoPass::releaseMemory() {
 | |
|   OwnedMBFI.reset();
 | |
|   OwnedMLI.reset();
 | |
|   OwnedMDT.reset();
 | |
| }
 | |
| 
 | |
| MachineBlockFrequencyInfo &
 | |
| LazyMachineBlockFrequencyInfoPass::calculateIfNotAvailable() const {
 | |
|   auto *MBFI = getAnalysisIfAvailable<MachineBlockFrequencyInfo>();
 | |
|   if (MBFI) {
 | |
|     LLVM_DEBUG(dbgs() << "MachineBlockFrequencyInfo is available\n");
 | |
|     return *MBFI;
 | |
|   }
 | |
| 
 | |
|   auto &MBPI = getAnalysis<MachineBranchProbabilityInfo>();
 | |
|   auto *MLI = getAnalysisIfAvailable<MachineLoopInfo>();
 | |
|   auto *MDT = getAnalysisIfAvailable<MachineDominatorTree>();
 | |
|   LLVM_DEBUG(dbgs() << "Building MachineBlockFrequencyInfo on the fly\n");
 | |
|   LLVM_DEBUG(if (MLI) dbgs() << "LoopInfo is available\n");
 | |
| 
 | |
|   if (!MLI) {
 | |
|     LLVM_DEBUG(dbgs() << "Building LoopInfo on the fly\n");
 | |
|     // First create a dominator tree.
 | |
|     LLVM_DEBUG(if (MDT) dbgs() << "DominatorTree is available\n");
 | |
| 
 | |
|     if (!MDT) {
 | |
|       LLVM_DEBUG(dbgs() << "Building DominatorTree on the fly\n");
 | |
|       OwnedMDT = make_unique<MachineDominatorTree>();
 | |
|       OwnedMDT->getBase().recalculate(*MF);
 | |
|       MDT = OwnedMDT.get();
 | |
|     }
 | |
| 
 | |
|     // Generate LoopInfo from it.
 | |
|     OwnedMLI = make_unique<MachineLoopInfo>();
 | |
|     OwnedMLI->getBase().analyze(MDT->getBase());
 | |
|     MLI = OwnedMLI.get();
 | |
|   }
 | |
| 
 | |
|   OwnedMBFI = make_unique<MachineBlockFrequencyInfo>();
 | |
|   OwnedMBFI->calculate(*MF, MBPI, *MLI);
 | |
|   return *OwnedMBFI.get();
 | |
| }
 | |
| 
 | |
| bool LazyMachineBlockFrequencyInfoPass::runOnMachineFunction(
 | |
|     MachineFunction &F) {
 | |
|   MF = &F;
 | |
|   return false;
 | |
| }
 |