#include "llvm/CodeGen/MachineBasicBlock.h"
#include "llvm/Pass.h"
#include "llvm/Support/BranchProbability.h"
-#include <algorithm>
#include <climits>
#include <numeric>
AU.setPreservesAll();
}
- // Return edge weight. If we don't have any informations about it - return
- // DEFAULT_WEIGHT.
- uint32_t getEdgeWeight(const MachineBasicBlock *Src,
- const MachineBasicBlock *Dst) const;
-
- // Same thing, but using a const_succ_iterator from Src. This is faster when
- // the iterator is already available.
- uint32_t getEdgeWeight(const MachineBasicBlock *Src,
- MachineBasicBlock::const_succ_iterator Dst) const;
+ // Return edge probability.
+ BranchProbability getEdgeProbability(const MachineBasicBlock *Src,
+ const MachineBasicBlock *Dst) const;
- // Get sum of the block successors' weights, potentially scaling them to fit
- // within 32-bits. If scaling is required, sets Scale based on the necessary
- // adjustment. Any edge weights used with the sum should be divided by Scale.
- uint32_t getSumForBlock(const MachineBasicBlock *MBB, uint32_t &Scale) const;
+ // Same as above, but using a const_succ_iterator from Src. This is faster
+ // when the iterator is already available.
+ BranchProbability
+ getEdgeProbability(const MachineBasicBlock *Src,
+ MachineBasicBlock::const_succ_iterator Dst) const;
// A 'Hot' edge is an edge which probability is >= 80%.
bool isEdgeHot(const MachineBasicBlock *Src,
// NB: This routine's complexity is linear on the number of successors.
MachineBasicBlock *getHotSucc(MachineBasicBlock *MBB) const;
- // Return a probability as a fraction between 0 (0% probability) and
- // 1 (100% probability), however the value is never equal to 0, and can be 1
- // only iff SRC block has only one successor.
- // NB: This routine's complexity is linear on the number of successors of
- // Src. Querying sequentially for each successor's probability is a quadratic
- // query pattern.
- BranchProbability getEdgeProbability(const MachineBasicBlock *Src,
- const MachineBasicBlock *Dst) const;
-
// Print value between 0 (0% probability) and 1 (100% probability),
// however the value is never equal to 0, and can be 1 only iff SRC block
// has only one successor.
raw_ostream &printEdgeProbability(raw_ostream &OS,
const MachineBasicBlock *Src,
const MachineBasicBlock *Dst) const;
-
- // Normalize a list of weights by scaling them down so that the sum of them
- // doesn't exceed UINT32_MAX. Return the scale.
- template <class WeightListIter>
- static uint32_t normalizeEdgeWeights(WeightListIter Begin,
- WeightListIter End);
};
-template <class WeightListIter>
-uint32_t
-MachineBranchProbabilityInfo::normalizeEdgeWeights(WeightListIter Begin,
- WeightListIter End) {
- // First we compute the sum with 64-bits of precision.
- uint64_t Sum = std::accumulate(Begin, End, uint64_t(0));
-
- // If Sum is zero, set all weights to 1.
- if (Sum == 0)
- std::fill(Begin, End, uint64_t(1));
-
- // If the computed sum fits in 32-bits, we're done.
- if (Sum <= UINT32_MAX)
- return 1;
-
- // Otherwise, compute the scale necessary to cause the weights to fit, and
- // re-sum with that scale applied.
- assert((Sum / UINT32_MAX) < UINT32_MAX &&
- "The sum of weights exceeds UINT32_MAX^2!");
- uint32_t Scale = (Sum / UINT32_MAX) + 1;
- for (auto I = Begin; I != End; ++I)
- *I /= Scale;
- return Scale;
-}
-
}