1875ebd5fSJakub Staszak //====----- MachineBlockFrequencyInfo.cpp - Machine Block Frequency Analysis ----====// 2875ebd5fSJakub Staszak // 3875ebd5fSJakub Staszak // The LLVM Compiler Infrastructure 4875ebd5fSJakub Staszak // 5875ebd5fSJakub Staszak // This file is distributed under the University of Illinois Open Source 6875ebd5fSJakub Staszak // License. See LICENSE.TXT for details. 7875ebd5fSJakub Staszak // 8875ebd5fSJakub Staszak //===----------------------------------------------------------------------===// 9875ebd5fSJakub Staszak // 10875ebd5fSJakub Staszak // Loops should be simplified before this analysis. 11875ebd5fSJakub Staszak // 12875ebd5fSJakub Staszak //===----------------------------------------------------------------------===// 13875ebd5fSJakub Staszak 14875ebd5fSJakub Staszak #include "llvm/InitializePasses.h" 15875ebd5fSJakub Staszak #include "llvm/Analysis/BlockFrequencyImpl.h" 16875ebd5fSJakub Staszak #include "llvm/CodeGen/MachineBlockFrequencyInfo.h" 17875ebd5fSJakub Staszak #include "llvm/CodeGen/Passes.h" 18875ebd5fSJakub Staszak #include "llvm/CodeGen/MachineBranchProbabilityInfo.h" 19875ebd5fSJakub Staszak 20875ebd5fSJakub Staszak using namespace llvm; 21875ebd5fSJakub Staszak 22875ebd5fSJakub Staszak INITIALIZE_PASS_BEGIN(MachineBlockFrequencyInfo, "machine-block-freq", 23875ebd5fSJakub Staszak "Machine Block Frequency Analysis", true, true) 24875ebd5fSJakub Staszak INITIALIZE_PASS_DEPENDENCY(MachineBranchProbabilityInfo) 25875ebd5fSJakub Staszak INITIALIZE_PASS_END(MachineBlockFrequencyInfo, "machine-block-freq", 26875ebd5fSJakub Staszak "Machine Block Frequency Analysis", true, true) 27875ebd5fSJakub Staszak 28875ebd5fSJakub Staszak char MachineBlockFrequencyInfo::ID = 0; 29875ebd5fSJakub Staszak 30875ebd5fSJakub Staszak 31875ebd5fSJakub Staszak MachineBlockFrequencyInfo::MachineBlockFrequencyInfo() : MachineFunctionPass(ID) { 32875ebd5fSJakub Staszak initializeMachineBlockFrequencyInfoPass(*PassRegistry::getPassRegistry()); 33875ebd5fSJakub Staszak MBFI = new BlockFrequencyImpl<MachineBasicBlock, MachineFunction, 34875ebd5fSJakub Staszak MachineBranchProbabilityInfo>(); 35875ebd5fSJakub Staszak } 36875ebd5fSJakub Staszak 37875ebd5fSJakub Staszak MachineBlockFrequencyInfo::~MachineBlockFrequencyInfo() { 38875ebd5fSJakub Staszak delete MBFI; 39875ebd5fSJakub Staszak } 40875ebd5fSJakub Staszak 41875ebd5fSJakub Staszak void MachineBlockFrequencyInfo::getAnalysisUsage(AnalysisUsage &AU) const { 42875ebd5fSJakub Staszak AU.addRequired<MachineBranchProbabilityInfo>(); 43875ebd5fSJakub Staszak AU.setPreservesAll(); 44875ebd5fSJakub Staszak MachineFunctionPass::getAnalysisUsage(AU); 45875ebd5fSJakub Staszak } 46875ebd5fSJakub Staszak 47875ebd5fSJakub Staszak bool MachineBlockFrequencyInfo::runOnMachineFunction(MachineFunction &F) { 48875ebd5fSJakub Staszak MachineBranchProbabilityInfo &MBPI = getAnalysis<MachineBranchProbabilityInfo>(); 49875ebd5fSJakub Staszak MBFI->doFunction(&F, &MBPI); 50875ebd5fSJakub Staszak return false; 51875ebd5fSJakub Staszak } 52875ebd5fSJakub Staszak 53875ebd5fSJakub Staszak /// getblockFreq - Return block frequency. Return 0 if we don't have the 54875ebd5fSJakub Staszak /// information. Please note that initial frequency is equal to 1024. It means 55875ebd5fSJakub Staszak /// that we should not rely on the value itself, but only on the comparison to 56875ebd5fSJakub Staszak /// the other block frequencies. We do this to avoid using of floating points. 57875ebd5fSJakub Staszak /// 58*a60d130fSJakub Staszak BlockFrequency MachineBlockFrequencyInfo:: 59*a60d130fSJakub Staszak getBlockFreq(MachineBasicBlock *MBB) const { 60875ebd5fSJakub Staszak return MBFI->getBlockFreq(MBB); 61875ebd5fSJakub Staszak } 62