1dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines//===- BlockFrequencyInfo.h - Block Frequency Analysis ----------*- C++ -*-===// 2fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak// 3fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak// The LLVM Compiler Infrastructure 4fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak// 5fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak// This file is distributed under the University of Illinois Open Source 6fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak// License. See LICENSE.TXT for details. 7fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak// 8fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak//===----------------------------------------------------------------------===// 9fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak// 10fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak// Loops should be simplified before this analysis. 11fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak// 12fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak//===----------------------------------------------------------------------===// 13fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak 14f55c1c85881afd65647bde5346f64d9685235c7cJakub Staszak#ifndef LLVM_ANALYSIS_BLOCKFREQUENCYINFO_H 15f55c1c85881afd65647bde5346f64d9685235c7cJakub Staszak#define LLVM_ANALYSIS_BLOCKFREQUENCYINFO_H 16fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak 17fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak#include "llvm/Pass.h" 189a24f1f070f7a9e18f7fc46214c2f2d0a38ab0f9Jakub Staszak#include "llvm/Support/BlockFrequency.h" 19fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak#include <climits> 20fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak 21fd9533b4a35983d38804349efca8116788b311d9Jakub Staszaknamespace llvm { 22fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak 23fd9533b4a35983d38804349efca8116788b311d9Jakub Staszakclass BranchProbabilityInfo; 24dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinestemplate <class BlockT> class BlockFrequencyInfoImpl; 25fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak 26dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines/// BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to 27dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines/// estimate IR basic block frequencies. 28f55c1c85881afd65647bde5346f64d9685235c7cJakub Staszakclass BlockFrequencyInfo : public FunctionPass { 29dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines typedef BlockFrequencyInfoImpl<BasicBlock> ImplType; 3036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::unique_ptr<ImplType> BFI; 31fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak 32fd9533b4a35983d38804349efca8116788b311d9Jakub Staszakpublic: 33fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak static char ID; 34fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak 35f55c1c85881afd65647bde5346f64d9685235c7cJakub Staszak BlockFrequencyInfo(); 36fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak 37f55c1c85881afd65647bde5346f64d9685235c7cJakub Staszak ~BlockFrequencyInfo(); 38fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak 3936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void getAnalysisUsage(AnalysisUsage &AU) const override; 40fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak 4136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool runOnFunction(Function &F) override; 4236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void releaseMemory() override; 4336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void print(raw_ostream &O, const Module *M) const override; 44e2058ff5bd4fa0397b57f6bdd84e5a5aa2343433Michael Gottesman const Function *getFunction() const; 45e2058ff5bd4fa0397b57f6bdd84e5a5aa2343433Michael Gottesman void view() const; 46fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak 4723f34f1c22db8df6e767a29365d668ac9ede112cJakub Staszak /// getblockFreq - Return block frequency. Return 0 if we don't have the 4875b51621540c23ddfc1e9ef6b4dc803453d9d122Benjamin Kramer /// information. Please note that initial frequency is equal to ENTRY_FREQ. It 4975b51621540c23ddfc1e9ef6b4dc803453d9d122Benjamin Kramer /// means that we should not rely on the value itself, but only on the 5075b51621540c23ddfc1e9ef6b4dc803453d9d122Benjamin Kramer /// comparison to the other block frequencies. We do this to avoid using of 5175b51621540c23ddfc1e9ef6b4dc803453d9d122Benjamin Kramer /// floating points. 5225101bb2a799a36be9f077ee2fc2dcf0df2b6efbJakub Staszak BlockFrequency getBlockFreq(const BasicBlock *BB) const; 5336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 5436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Print the block frequency Freq to OS using the current functions entry 5536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // frequency to convert freq into a relative decimal form. 5636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines raw_ostream &printBlockFreq(raw_ostream &OS, const BlockFrequency Freq) const; 5736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 5836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Convenience method that attempts to look up the frequency associated with 5936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // BB and print it to OS. 6036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines raw_ostream &printBlockFreq(raw_ostream &OS, const BasicBlock *BB) const; 6136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 6236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint64_t getEntryFreq() const; 6336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 64fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak}; 65fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak 66fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak} 67fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak 68fd9533b4a35983d38804349efca8116788b311d9Jakub Staszak#endif 69