[llvm-commits] [llvm] r139110 - /llvm/trunk/lib/Analysis/BranchProbabilityInfo.cpp

Benjamin Kramer benny.kra at googlemail.com
Sun Sep 4 16:53:04 PDT 2011


Author: d0k
Date: Sun Sep  4 18:53:04 2011
New Revision: 139110

URL: http://llvm.org/viewvc/llvm-project?rev=139110&view=rev
Log:
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.

Modified:
    llvm/trunk/lib/Analysis/BranchProbabilityInfo.cpp

Modified: llvm/trunk/lib/Analysis/BranchProbabilityInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/BranchProbabilityInfo.cpp?rev=139110&r1=139109&r2=139110&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/BranchProbabilityInfo.cpp (original)
+++ llvm/trunk/lib/Analysis/BranchProbabilityInfo.cpp Sun Sep  4 18:53:04 2011
@@ -289,37 +289,42 @@
 
   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);





More information about the llvm-commits mailing list