aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/CodeGen/MachineBasicBlock.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/CodeGen/MachineBasicBlock.cpp')
-rw-r--r--llvm/lib/CodeGen/MachineBasicBlock.cpp42
1 files changed, 29 insertions, 13 deletions
diff --git a/llvm/lib/CodeGen/MachineBasicBlock.cpp b/llvm/lib/CodeGen/MachineBasicBlock.cpp
index fa6b534..37fe37f 100644
--- a/llvm/lib/CodeGen/MachineBasicBlock.cpp
+++ b/llvm/lib/CodeGen/MachineBasicBlock.cpp
@@ -1587,20 +1587,36 @@ MachineBasicBlock::getSuccProbability(const_succ_iterator Succ) const {
return BranchProbability(1, succ_size());
const auto &Prob = *getProbabilityIterator(Succ);
- if (Prob.isUnknown()) {
- // For unknown probabilities, collect the sum of all known ones, and evenly
- // ditribute the complemental of the sum to each unknown probability.
- unsigned KnownProbNum = 0;
- auto Sum = BranchProbability::getZero();
- for (const auto &P : Probs) {
- if (!P.isUnknown()) {
- Sum += P;
- KnownProbNum++;
- }
- }
- return Sum.getCompl() / (Probs.size() - KnownProbNum);
- } else
+ if (!Prob.isUnknown())
return Prob;
+ // For unknown probabilities, collect the sum of all known ones, and evenly
+ // ditribute the complemental of the sum to each unknown probability.
+ unsigned KnownProbNum = 0;
+ auto Sum = BranchProbability::getZero();
+ for (const auto &P : Probs) {
+ if (!P.isUnknown()) {
+ Sum += P;
+ KnownProbNum++;
+ }
+ }
+ return Sum.getCompl() / (Probs.size() - KnownProbNum);
+}
+
+bool MachineBasicBlock::canPredictBranchProbabilities() const {
+ if (succ_size() <= 1)
+ return true;
+ if (!hasSuccessorProbabilities())
+ return true;
+
+ SmallVector<BranchProbability, 8> Normalized(Probs.begin(), Probs.end());
+ BranchProbability::normalizeProbabilities(Normalized);
+
+ // Normalize assuming unknown probabilities. This will assign equal
+ // probabilities to all successors.
+ SmallVector<BranchProbability, 8> Equal(Normalized.size());
+ BranchProbability::normalizeProbabilities(Equal);
+
+ return llvm::equal(Normalized, Equal);
}
/// Set successor probability of a given iterator.