1*875ebd5fSJakub Staszak //====----- MachineBlockFrequencyInfo.cpp - Machine Block Frequency Analysis ----====// 2*875ebd5fSJakub Staszak // 3*875ebd5fSJakub Staszak // The LLVM Compiler Infrastructure 4*875ebd5fSJakub Staszak // 5*875ebd5fSJakub Staszak // This file is distributed under the University of Illinois Open Source 6*875ebd5fSJakub Staszak // License. See LICENSE.TXT for details. 7*875ebd5fSJakub Staszak // 8*875ebd5fSJakub Staszak //===----------------------------------------------------------------------===// 9*875ebd5fSJakub Staszak // 10*875ebd5fSJakub Staszak // Loops should be simplified before this analysis. 11*875ebd5fSJakub Staszak // 12*875ebd5fSJakub Staszak //===----------------------------------------------------------------------===// 13*875ebd5fSJakub Staszak 14*875ebd5fSJakub Staszak #include "llvm/InitializePasses.h" 15*875ebd5fSJakub Staszak #include "llvm/Analysis/BlockFrequencyImpl.h" 16*875ebd5fSJakub Staszak #include "llvm/CodeGen/MachineBlockFrequencyInfo.h" 17*875ebd5fSJakub Staszak #include "llvm/CodeGen/Passes.h" 18*875ebd5fSJakub Staszak #include "llvm/CodeGen/MachineBranchProbabilityInfo.h" 19*875ebd5fSJakub Staszak 20*875ebd5fSJakub Staszak using namespace llvm; 21*875ebd5fSJakub Staszak 22*875ebd5fSJakub Staszak INITIALIZE_PASS_BEGIN(MachineBlockFrequencyInfo, "machine-block-freq", 23*875ebd5fSJakub Staszak "Machine Block Frequency Analysis", true, true) 24*875ebd5fSJakub Staszak INITIALIZE_PASS_DEPENDENCY(MachineBranchProbabilityInfo) 25*875ebd5fSJakub Staszak INITIALIZE_PASS_END(MachineBlockFrequencyInfo, "machine-block-freq", 26*875ebd5fSJakub Staszak "Machine Block Frequency Analysis", true, true) 27*875ebd5fSJakub Staszak 28*875ebd5fSJakub Staszak char MachineBlockFrequencyInfo::ID = 0; 29*875ebd5fSJakub Staszak 30*875ebd5fSJakub Staszak 31*875ebd5fSJakub Staszak MachineBlockFrequencyInfo::MachineBlockFrequencyInfo() : MachineFunctionPass(ID) { 32*875ebd5fSJakub Staszak initializeMachineBlockFrequencyInfoPass(*PassRegistry::getPassRegistry()); 33*875ebd5fSJakub Staszak MBFI = new BlockFrequencyImpl<MachineBasicBlock, MachineFunction, 34*875ebd5fSJakub Staszak MachineBranchProbabilityInfo>(); 35*875ebd5fSJakub Staszak } 36*875ebd5fSJakub Staszak 37*875ebd5fSJakub Staszak MachineBlockFrequencyInfo::~MachineBlockFrequencyInfo() { 38*875ebd5fSJakub Staszak delete MBFI; 39*875ebd5fSJakub Staszak } 40*875ebd5fSJakub Staszak 41*875ebd5fSJakub Staszak void MachineBlockFrequencyInfo::getAnalysisUsage(AnalysisUsage &AU) const { 42*875ebd5fSJakub Staszak AU.addRequired<MachineBranchProbabilityInfo>(); 43*875ebd5fSJakub Staszak AU.setPreservesAll(); 44*875ebd5fSJakub Staszak MachineFunctionPass::getAnalysisUsage(AU); 45*875ebd5fSJakub Staszak } 46*875ebd5fSJakub Staszak 47*875ebd5fSJakub Staszak bool MachineBlockFrequencyInfo::runOnMachineFunction(MachineFunction &F) { 48*875ebd5fSJakub Staszak MachineBranchProbabilityInfo &MBPI = getAnalysis<MachineBranchProbabilityInfo>(); 49*875ebd5fSJakub Staszak MBFI->doFunction(&F, &MBPI); 50*875ebd5fSJakub Staszak return false; 51*875ebd5fSJakub Staszak } 52*875ebd5fSJakub Staszak 53*875ebd5fSJakub Staszak /// getblockFreq - Return block frequency. Return 0 if we don't have the 54*875ebd5fSJakub Staszak /// information. Please note that initial frequency is equal to 1024. It means 55*875ebd5fSJakub Staszak /// that we should not rely on the value itself, but only on the comparison to 56*875ebd5fSJakub Staszak /// the other block frequencies. We do this to avoid using of floating points. 57*875ebd5fSJakub Staszak /// 58*875ebd5fSJakub Staszak uint32_t MachineBlockFrequencyInfo::getBlockFreq(MachineBasicBlock *MBB) { 59*875ebd5fSJakub Staszak return MBFI->getBlockFreq(MBB); 60*875ebd5fSJakub Staszak } 61