void MachineBranchProbabilityInfo::anchor() { }
-uint32_t
-MachineBranchProbabilityInfo::getSumForBlock(MachineBasicBlock *MBB) const {
- // Normalize the weights of MBB's all successors so that the sum is guaranteed
- // to be no greater than UINT32_MAX.
- MBB->normalizeSuccWeights();
-
- SmallVector<uint32_t, 8> Weights;
- for (MachineBasicBlock::const_succ_iterator I = MBB->succ_begin(),
- E = MBB->succ_end();
- I != E; ++I)
- Weights.push_back(getEdgeWeight(MBB, I));
-
- return std::accumulate(Weights.begin(), Weights.end(), 0u);
-}
-
-uint32_t
-MachineBranchProbabilityInfo::getSumForBlock(const MachineBasicBlock *MBB,
- uint32_t &Scale) const {
- SmallVector<uint32_t, 8> Weights;
- for (MachineBasicBlock::const_succ_iterator I = MBB->succ_begin(),
- E = MBB->succ_end();
- I != E; ++I)
- Weights.push_back(getEdgeWeight(MBB, I));
-
- if (MBB->areSuccWeightsNormalized())
- Scale = 1;
- else
- Scale = MachineBranchProbabilityInfo::normalizeEdgeWeights(Weights);
- return std::accumulate(Weights.begin(), Weights.end(), 0u);
-}
-
-uint32_t MachineBranchProbabilityInfo::
-getEdgeWeight(const MachineBasicBlock *Src,
- MachineBasicBlock::const_succ_iterator Dst) const {
- uint32_t Weight = Src->getSuccWeight(Dst);
- if (!Weight)
- return DEFAULT_WEIGHT;
- return Weight;
+BranchProbability MachineBranchProbabilityInfo::getEdgeProbability(
+ const MachineBasicBlock *Src,
+ MachineBasicBlock::const_succ_iterator Dst) const {
+ return Src->getSuccProbability(Dst);
}
-uint32_t MachineBranchProbabilityInfo::
-getEdgeWeight(const MachineBasicBlock *Src,
- const MachineBasicBlock *Dst) const {
+BranchProbability MachineBranchProbabilityInfo::getEdgeProbability(
+ const MachineBasicBlock *Src, const MachineBasicBlock *Dst) const {
// This is a linear search. Try to use the const_succ_iterator version when
// possible.
- return getEdgeWeight(Src, std::find(Src->succ_begin(), Src->succ_end(), Dst));
+ return getEdgeProbability(Src,
+ std::find(Src->succ_begin(), Src->succ_end(), Dst));
}
bool
MachineBranchProbabilityInfo::isEdgeHot(const MachineBasicBlock *Src,
const MachineBasicBlock *Dst) const {
// Hot probability is at least 4/5 = 80%
- // FIXME: Compare against a static "hot" BranchProbability.
- return getEdgeProbability(Src, Dst) > BranchProbability(4, 5);
+ static BranchProbability HotProb(4, 5);
+ return getEdgeProbability(Src, Dst) > HotProb;
}
MachineBasicBlock *
MachineBranchProbabilityInfo::getHotSucc(MachineBasicBlock *MBB) const {
- uint32_t MaxWeight = 0;
+ auto MaxProb = BranchProbability::getZero();
MachineBasicBlock *MaxSucc = nullptr;
for (MachineBasicBlock::const_succ_iterator I = MBB->succ_begin(),
E = MBB->succ_end(); I != E; ++I) {
- uint32_t Weight = getEdgeWeight(MBB, I);
- if (Weight > MaxWeight) {
- MaxWeight = Weight;
+ auto Prob = getEdgeProbability(MBB, I);
+ if (Prob > MaxProb) {
+ MaxProb = Prob;
MaxSucc = *I;
}
}
- if (getEdgeProbability(MBB, MaxSucc) >= BranchProbability(4, 5))
+ static BranchProbability HotProb(4, 5);
+ if (getEdgeProbability(MBB, MaxSucc) >= HotProb)
return MaxSucc;
return nullptr;
}
-BranchProbability MachineBranchProbabilityInfo::getEdgeProbability(
- const MachineBasicBlock *Src, const MachineBasicBlock *Dst) const {
- uint32_t Scale = 1;
- uint32_t D = getSumForBlock(Src, Scale);
- uint32_t N = getEdgeWeight(Src, Dst) / Scale;
-
- return BranchProbability(N, D);
-}
-
raw_ostream &MachineBranchProbabilityInfo::printEdgeProbability(
raw_ostream &OS, const MachineBasicBlock *Src,
const MachineBasicBlock *Dst) const {