mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-29 14:40:25 +00:00
6aa5c26c81
layer already had support for printing the results of this analysis, but the wiring was missing. Now that printing the analysis works, actually bring some of this analysis, and the BranchProbabilityInfo analysis that it wraps, under test! I'm planning on fixing some bugs and doing other work here, so having a nice place to add regression tests and a way to observe the results is really useful. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@142491 91177308-0d34-0410-b5e6-96231b3b80d8
64 lines
2.1 KiB
C++
64 lines
2.1 KiB
C++
//=======-------- BlockFrequencyInfo.cpp - Block Frequency Analysis -------=======//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Loops should be simplified before this analysis.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/InitializePasses.h"
|
|
#include "llvm/Analysis/BlockFrequencyImpl.h"
|
|
#include "llvm/Analysis/BlockFrequencyInfo.h"
|
|
#include "llvm/Analysis/LoopInfo.h"
|
|
#include "llvm/Analysis/Passes.h"
|
|
#include "llvm/Analysis/BranchProbabilityInfo.h"
|
|
|
|
using namespace llvm;
|
|
|
|
INITIALIZE_PASS_BEGIN(BlockFrequencyInfo, "block-freq", "Block Frequency Analysis",
|
|
true, true)
|
|
INITIALIZE_PASS_DEPENDENCY(BranchProbabilityInfo)
|
|
INITIALIZE_PASS_END(BlockFrequencyInfo, "block-freq", "Block Frequency Analysis",
|
|
true, true)
|
|
|
|
char BlockFrequencyInfo::ID = 0;
|
|
|
|
|
|
BlockFrequencyInfo::BlockFrequencyInfo() : FunctionPass(ID) {
|
|
initializeBlockFrequencyInfoPass(*PassRegistry::getPassRegistry());
|
|
BFI = new BlockFrequencyImpl<BasicBlock, Function, BranchProbabilityInfo>();
|
|
}
|
|
|
|
BlockFrequencyInfo::~BlockFrequencyInfo() {
|
|
delete BFI;
|
|
}
|
|
|
|
void BlockFrequencyInfo::getAnalysisUsage(AnalysisUsage &AU) const {
|
|
AU.addRequired<BranchProbabilityInfo>();
|
|
AU.setPreservesAll();
|
|
}
|
|
|
|
bool BlockFrequencyInfo::runOnFunction(Function &F) {
|
|
BranchProbabilityInfo &BPI = getAnalysis<BranchProbabilityInfo>();
|
|
BFI->doFunction(&F, &BPI);
|
|
return false;
|
|
}
|
|
|
|
void BlockFrequencyInfo::print(raw_ostream &O, const Module *) const {
|
|
if (BFI) BFI->print(O);
|
|
}
|
|
|
|
/// getblockFreq - Return block frequency. Return 0 if we don't have the
|
|
/// information. Please note that initial frequency is equal to 1024. It means
|
|
/// that we should not rely on the value itself, but only on the comparison to
|
|
/// the other block frequencies. We do this to avoid using of floating points.
|
|
///
|
|
BlockFrequency BlockFrequencyInfo::getBlockFreq(BasicBlock *BB) const {
|
|
return BFI->getBlockFreq(BB);
|
|
}
|