OSDN Git Service

Extend the floating point heuristic to consider NaN checks unlikely.
authorBenjamin Kramer <benny.kra@googlemail.com>
Fri, 21 Oct 2011 21:13:47 +0000 (21:13 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Fri, 21 Oct 2011 21:13:47 +0000 (21:13 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@142687 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/BranchProbabilityInfo.cpp

index 6e8d7e0..fc69da9 100644 (file)
@@ -391,15 +391,28 @@ bool BranchProbabilityAnalysis::calcFloatingPointHeuristics(BasicBlock *BB) {
 
   Value *Cond = BI->getCondition();
   FCmpInst *FCmp = dyn_cast<FCmpInst>(Cond);
-  if (!FCmp || !FCmp->isEquality())
+  if (!FCmp)
     return false;
 
+  bool isProb;
+  if (FCmp->isEquality()) {
+    // f1 == f2 -> Unlikely
+    // f1 != f2 -> Likely
+    isProb = !FCmp->isTrueWhenEqual();
+  } else if (FCmp->getPredicate() == FCmpInst::FCMP_ORD) {
+    // !isnan -> Likely
+    isProb = true;
+  } else if (FCmp->getPredicate() == FCmpInst::FCMP_UNO) {
+    // isnan -> Unlikely
+    isProb = false;
+  } else {
+    return false;
+  }
+
   BasicBlock *Taken = BI->getSuccessor(0);
   BasicBlock *NonTaken = BI->getSuccessor(1);
 
-  // f1 == f2 -> Unlikely
-  // f1 != f2 -> Likely
-  if (FCmp->isTrueWhenEqual())
+  if (!isProb)
     std::swap(Taken, NonTaken);
 
   BP->setEdgeWeight(BB, Taken, FPH_TAKEN_WEIGHT);