diff options
Diffstat (limited to 'llvm/lib/CodeGen/MachineBasicBlock.cpp')
-rw-r--r-- | llvm/lib/CodeGen/MachineBasicBlock.cpp | 42 |
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. |