diff options
author | Benjamin Kramer <benny.kra@googlemail.com> | 2011-09-04 23:53:04 +0000 |
---|---|---|
committer | Benjamin Kramer <benny.kra@googlemail.com> | 2011-09-04 23:53:04 +0000 |
commit | 0ca1ad0783ea805d8af255a42f55b0eda5a55e4e (patch) | |
tree | 4a664e55f4f47559563446a19198dcbb13e9aa4c /llvm/lib/Analysis/BranchProbabilityInfo.cpp | |
parent | 3f9211d322de8891301140820917f32e21cf9b87 (diff) | |
download | bcm5719-llvm-0ca1ad0783ea805d8af255a42f55b0eda5a55e4e.tar.gz bcm5719-llvm-0ca1ad0783ea805d8af255a42f55b0eda5a55e4e.zip |
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.
llvm-svn: 139110
Diffstat (limited to 'llvm/lib/Analysis/BranchProbabilityInfo.cpp')
-rw-r--r-- | llvm/lib/Analysis/BranchProbabilityInfo.cpp | 55 |
1 files changed, 30 insertions, 25 deletions
diff --git a/llvm/lib/Analysis/BranchProbabilityInfo.cpp b/llvm/lib/Analysis/BranchProbabilityInfo.cpp index c6f6fa77bc2..9c54a7eadd4 100644 --- a/llvm/lib/Analysis/BranchProbabilityInfo.cpp +++ b/llvm/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); |