forked from OSchip/llvm-project
Use BlockFrequency instead of uint32_t in BlockFrequencyInfo.
llvm-svn: 136278
This commit is contained in:
parent
39b062bfaa
commit
da3df4302a
|
@ -19,6 +19,7 @@
|
|||
#include "llvm/ADT/PostOrderIterator.h"
|
||||
#include "llvm/CodeGen/MachineBasicBlock.h"
|
||||
#include "llvm/CodeGen/MachineFunction.h"
|
||||
#include "llvm/Support/BlockFrequency.h"
|
||||
#include "llvm/Support/BranchProbability.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
|
@ -40,7 +41,7 @@ class MachineBlockFrequencyInfo;
|
|||
template<class BlockT, class FunctionT, class BlockProbInfoT>
|
||||
class BlockFrequencyImpl {
|
||||
|
||||
DenseMap<BlockT *, uint32_t> Freqs;
|
||||
DenseMap<BlockT *, BlockFrequency> Freqs;
|
||||
|
||||
BlockProbInfoT *BPI;
|
||||
|
||||
|
@ -64,26 +65,21 @@ class BlockFrequencyImpl {
|
|||
return ss.str();
|
||||
}
|
||||
|
||||
void setBlockFreq(BlockT *BB, uint32_t Freq) {
|
||||
void setBlockFreq(BlockT *BB, BlockFrequency Freq) {
|
||||
Freqs[BB] = Freq;
|
||||
DEBUG(dbgs() << "Frequency(" << getBlockName(BB) << ") = " << Freq << "\n");
|
||||
}
|
||||
|
||||
/// getEdgeFreq - Return edge frequency based on SRC frequency and Src -> Dst
|
||||
/// edge probability.
|
||||
uint32_t getEdgeFreq(BlockT *Src, BlockT *Dst) const {
|
||||
BlockFrequency getEdgeFreq(BlockT *Src, BlockT *Dst) const {
|
||||
BranchProbability Prob = BPI->getEdgeProbability(Src, Dst);
|
||||
uint64_t N = Prob.getNumerator();
|
||||
uint64_t D = Prob.getDenominator();
|
||||
uint64_t Res = (N * getBlockFreq(Src)) / D;
|
||||
|
||||
assert(Res <= UINT32_MAX);
|
||||
return (uint32_t) Res;
|
||||
return getBlockFreq(Src) * Prob;
|
||||
}
|
||||
|
||||
/// incBlockFreq - Increase BB block frequency by FREQ.
|
||||
///
|
||||
void incBlockFreq(BlockT *BB, uint32_t Freq) {
|
||||
void incBlockFreq(BlockT *BB, BlockFrequency Freq) {
|
||||
Freqs[BB] += Freq;
|
||||
DEBUG(dbgs() << "Frequency(" << getBlockName(BB) << ") += " << Freq
|
||||
<< " --> " << Freqs[BB] << "\n");
|
||||
|
@ -95,13 +91,13 @@ class BlockFrequencyImpl {
|
|||
uint64_t N = Prob.getNumerator();
|
||||
assert(N && "Illegal division by zero!");
|
||||
uint64_t D = Prob.getDenominator();
|
||||
uint64_t Freq = (Freqs[BB] * D) / N;
|
||||
uint64_t Freq = (Freqs[BB].getFrequency() * D) / N;
|
||||
|
||||
// Should we assert it?
|
||||
if (Freq > UINT32_MAX)
|
||||
Freq = UINT32_MAX;
|
||||
|
||||
Freqs[BB] = (uint32_t) Freq;
|
||||
Freqs[BB] = BlockFrequency(Freq);
|
||||
DEBUG(dbgs() << "Frequency(" << getBlockName(BB) << ") /= (" << Prob
|
||||
<< ") --> " << Freqs[BB] << "\n");
|
||||
}
|
||||
|
@ -136,15 +132,6 @@ class BlockFrequencyImpl {
|
|||
}
|
||||
|
||||
|
||||
/// Return a probability of getting to the DST block through SRC->DST edge.
|
||||
///
|
||||
BranchProbability getBackEdgeProbability(BlockT *Src, BlockT *Dst) const {
|
||||
uint32_t N = getEdgeFreq(Src, Dst);
|
||||
uint32_t D = getBlockFreq(Dst);
|
||||
|
||||
return BranchProbability(N, D);
|
||||
}
|
||||
|
||||
/// isReachable - Returns if BB block is reachable from the entry.
|
||||
///
|
||||
bool isReachable(BlockT *BB) {
|
||||
|
@ -252,9 +239,9 @@ class BlockFrequencyImpl {
|
|||
BlockT *Pred = *PI;
|
||||
assert(Pred);
|
||||
if (isReachable(Pred) && isBackedge(Pred, Head)) {
|
||||
BranchProbability Prob = getBackEdgeProbability(Pred, Head);
|
||||
uint64_t N = Prob.getNumerator();
|
||||
uint64_t D = Prob.getDenominator();
|
||||
uint64_t N = getEdgeFreq(Pred, Head).getFrequency();
|
||||
uint64_t D = getBlockFreq(Head).getFrequency();
|
||||
assert(N <= 1024 && "Backedge frequency must be <= 1024!");
|
||||
uint64_t Res = (N * START_FREQ) / D;
|
||||
|
||||
assert(Res <= UINT32_MAX);
|
||||
|
@ -315,8 +302,8 @@ class BlockFrequencyImpl {
|
|||
|
||||
public:
|
||||
/// getBlockFreq - Return block frequency. Return 0 if we don't have it.
|
||||
uint32_t getBlockFreq(BlockT *BB) const {
|
||||
typename DenseMap<BlockT *, uint32_t>::const_iterator I = Freqs.find(BB);
|
||||
BlockFrequency getBlockFreq(BlockT *BB) const {
|
||||
typename DenseMap<BlockT *, BlockFrequency>::const_iterator I = Freqs.find(BB);
|
||||
if (I != Freqs.end())
|
||||
return I->second;
|
||||
return 0;
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
#define LLVM_ANALYSIS_BLOCKFREQUENCYINFO_H
|
||||
|
||||
#include "llvm/Pass.h"
|
||||
#include "llvm/Support/BlockFrequency.h"
|
||||
#include <climits>
|
||||
|
||||
namespace llvm {
|
||||
|
@ -45,7 +46,7 @@ public:
|
|||
/// 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.
|
||||
///
|
||||
uint32_t getBlockFreq(BasicBlock *BB);
|
||||
BlockFrequency getBlockFreq(BasicBlock *BB);
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
#define LLVM_CODEGEN_MACHINEBLOCKFREQUENCYINFO_H
|
||||
|
||||
#include "llvm/CodeGen/MachineFunctionPass.h"
|
||||
#include "llvm/Support/BlockFrequency.h"
|
||||
#include <climits>
|
||||
|
||||
namespace llvm {
|
||||
|
@ -45,7 +46,7 @@ public:
|
|||
/// 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.
|
||||
///
|
||||
uint32_t getBlockFreq(MachineBasicBlock *MBB);
|
||||
BlockFrequency getBlockFreq(MachineBasicBlock *MBB);
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -54,6 +54,6 @@ bool BlockFrequencyInfo::runOnFunction(Function &F) {
|
|||
/// 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.
|
||||
///
|
||||
uint32_t BlockFrequencyInfo::getBlockFreq(BasicBlock *BB) {
|
||||
BlockFrequency BlockFrequencyInfo::getBlockFreq(BasicBlock *BB) {
|
||||
return BFI->getBlockFreq(BB);
|
||||
}
|
||||
|
|
|
@ -55,6 +55,6 @@ bool MachineBlockFrequencyInfo::runOnMachineFunction(MachineFunction &F) {
|
|||
/// 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.
|
||||
///
|
||||
uint32_t MachineBlockFrequencyInfo::getBlockFreq(MachineBasicBlock *MBB) {
|
||||
BlockFrequency MachineBlockFrequencyInfo::getBlockFreq(MachineBasicBlock *MBB) {
|
||||
return MBFI->getBlockFreq(MBB);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue