summaryrefslogtreecommitdiff
path: root/lib/Analysis/BranchProbabilityInfo.cpp
diff options
context:
space:
mode:
authorBenjamin Kramer <benny.kra@googlemail.com>2011-09-04 23:53:04 +0000
committerBenjamin Kramer <benny.kra@googlemail.com>2011-09-04 23:53:04 +0000
commit26eb870d7e0e28ecb25a0cd77e6cdc0490707eff (patch)
tree0dd1d445bc7a7dec6a342ea97f0e3df1aa60e70b /lib/Analysis/BranchProbabilityInfo.cpp
parentfec0c6fa56d5ed91d5b6a1f286aa84b205e17a0f (diff)
downloadllvm-26eb870d7e0e28ecb25a0cd77e6cdc0490707eff.tar.gz
llvm-26eb870d7e0e28ecb25a0cd77e6cdc0490707eff.tar.bz2
llvm-26eb870d7e0e28ecb25a0cd77e6cdc0490707eff.tar.xz
Use canonical forms for the branch probability zero heutistic.
- Drop support for X >u 0, it's equivalent to X != 0 and should be canonicalized into the latter. - Add X < 1 -> unlikely, which is what instcombine canonicalizes X <= 0 into. - Add X > -1 -> likely, which is what instcombine canonicalizes X >= 0 into. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@139110 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/BranchProbabilityInfo.cpp')
-rw-r--r--lib/Analysis/BranchProbabilityInfo.cpp55
1 files changed, 30 insertions, 25 deletions
diff --git a/lib/Analysis/BranchProbabilityInfo.cpp b/lib/Analysis/BranchProbabilityInfo.cpp
index c6f6fa77bc..9c54a7eadd 100644
--- a/lib/Analysis/BranchProbabilityInfo.cpp
+++ b/lib/Analysis/BranchProbabilityInfo.cpp
@@ -289,37 +289,42 @@ bool BranchProbabilityAnalysis::calcZeroHeuristics(BasicBlock *BB) {
Value *RHS = CI->getOperand(1);
ConstantInt *CV = dyn_cast<ConstantInt>(RHS);
- if (!CV || !CV->isZero())
+ if (!CV)
return false;
bool isProb;
- switch (CI->getPredicate()) {
- case CmpInst::ICMP_EQ:
- // Equal to zero is not expected to be taken.
- isProb = false;
- break;
-
- case CmpInst::ICMP_NE:
- // Not equal to zero is expected.
- isProb = true;
- break;
-
- case CmpInst::ICMP_SLT:
- // Less or equal to zero is not expected.
- // X < 0 -> Unlikely
+ if (CV->isZero()) {
+ switch (CI->getPredicate()) {
+ case CmpInst::ICMP_EQ:
+ // X == 0 -> Unlikely
+ isProb = false;
+ break;
+ case CmpInst::ICMP_NE:
+ // X != 0 -> Likely
+ isProb = true;
+ break;
+ case CmpInst::ICMP_SLT:
+ // X < 0 -> Unlikely
+ isProb = false;
+ break;
+ case CmpInst::ICMP_SGT:
+ // X > 0 -> Likely
+ isProb = true;
+ break;
+ default:
+ return false;
+ }
+ } else if (CV->isOne() && CI->getPredicate() == CmpInst::ICMP_SLT) {
+ // InstCombine canonicalizes X <= 0 into X < 1.
+ // X <= 0 -> Unlikely
isProb = false;
- break;
-
- case CmpInst::ICMP_UGT:
- case CmpInst::ICMP_SGT:
- // Greater or equal to zero is expected.
- // X > 0 -> Likely
+ } else if (CV->isAllOnesValue() && CI->getPredicate() == CmpInst::ICMP_SGT) {
+ // InstCombine canonicalizes X >= 0 into X > -1.
+ // X >= 0 -> Likely
isProb = true;
- break;
-
- default:
+ } else {
return false;
- };
+ }
BasicBlock *Taken = BI->getSuccessor(0);
BasicBlock *NonTaken = BI->getSuccessor(1);