[llvm-commits] [llvm] r112620 - /llvm/trunk/lib/Transforms/Scalar/JumpThreading.cpp

Owen Anderson resistor at mac.com
Tue Aug 31 11:48:48 PDT 2010


Author: resistor
Date: Tue Aug 31 13:48:48 2010
New Revision: 112620

URL: http://llvm.org/viewvc/llvm-project?rev=112620&view=rev
Log:
Refactor my fix for PR5652 to terminate the predecessor lookups after the first failure.

Modified:
    llvm/trunk/lib/Transforms/Scalar/JumpThreading.cpp

Modified: llvm/trunk/lib/Transforms/Scalar/JumpThreading.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/JumpThreading.cpp?rev=112620&r1=112619&r2=112620&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/JumpThreading.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/JumpThreading.cpp Tue Aug 31 13:48:48 2010
@@ -715,37 +715,36 @@
     // the branch based on that.
     BranchInst *CondBr = dyn_cast<BranchInst>(BB->getTerminator());
     Constant *CondConst = dyn_cast<Constant>(CondCmp->getOperand(1));
-    if (LVI && CondBr && CondConst && CondBr->isConditional() &&
+    pred_iterator PI = pred_begin(BB), PE = pred_end(BB);
+    if (LVI && CondBr && CondConst && CondBr->isConditional() && PI != PE &&
         (!isa<Instruction>(CondCmp->getOperand(0)) ||
          cast<Instruction>(CondCmp->getOperand(0))->getParent() != BB)) {
       // For predecessor edge, determine if the comparison is true or false
       // on that edge.  If they're all true or all false, we can simplify the
       // branch.
       // FIXME: We could handle mixed true/false by duplicating code.
-      unsigned Trues = 0, Falses = 0, predcount = 0;
-      for (pred_iterator PI = pred_begin(BB), PE = pred_end(BB);PI != PE; ++PI){
-        ++predcount;
-        LazyValueInfo::Tristate Ret =
-          LVI->getPredicateOnEdge(CondCmp->getPredicate(), 
-                                  CondCmp->getOperand(0), CondConst, *PI, BB);
-        if (Ret == LazyValueInfo::True)
-          ++Trues;
-        else if (Ret == LazyValueInfo::False)
-          ++Falses;
-      }
-      
-      // If we can determine the branch direction statically, convert
-      // the conditional branch to an unconditional one.
-      if (Trues && Trues == predcount) {
-        RemovePredecessorAndSimplify(CondBr->getSuccessor(1), BB, TD);
-        BranchInst::Create(CondBr->getSuccessor(0), CondBr);
-        CondBr->eraseFromParent();
-        return true;
-      } else if (Falses && Falses == predcount) {
-        RemovePredecessorAndSimplify(CondBr->getSuccessor(0), BB, TD);
-        BranchInst::Create(CondBr->getSuccessor(1), CondBr);
-        CondBr->eraseFromParent();
-        return true;
+      LazyValueInfo::Tristate Baseline =      
+        LVI->getPredicateOnEdge(CondCmp->getPredicate(), CondCmp->getOperand(0),
+                                CondConst, *PI, BB);
+      if (Baseline != LazyValueInfo::Unknown) {
+        // Check that all remaining incoming values match the first one.
+        while (++PI != PE) {
+          LazyValueInfo::Tristate Ret = LVI->getPredicateOnEdge(
+                                          CondCmp->getPredicate(),
+                                          CondCmp->getOperand(0),
+                                          CondConst, *PI, BB);
+          if (Ret != Baseline) break;
+        }
+        
+        // If we terminated early, then one of the values didn't match.
+        if (PI == PE) {
+          unsigned ToRemove = Baseline == LazyValueInfo::True ? 1 : 0;
+          unsigned ToKeep = Baseline == LazyValueInfo::True ? 0 : 1;
+          RemovePredecessorAndSimplify(CondBr->getSuccessor(ToRemove), BB, TD);
+          BranchInst::Create(CondBr->getSuccessor(ToKeep), CondBr);
+          CondBr->eraseFromParent();
+          return true;
+        }
       }
     }
   }





More information about the llvm-commits mailing list