diff --git a/lib/Transforms/Scalar/JumpThreading.cpp b/lib/Transforms/Scalar/JumpThreading.cpp
index c0b0cbe..7a4c685 100644
--- a/lib/Transforms/Scalar/JumpThreading.cpp
+++ b/lib/Transforms/Scalar/JumpThreading.cpp
@@ -16,6 +16,7 @@
 #include "llvm/IntrinsicInst.h"
 #include "llvm/LLVMContext.h"
 #include "llvm/Pass.h"
+#include "llvm/Analysis/ConstantFolding.h"
 #include "llvm/Analysis/InstructionSimplify.h"
 #include "llvm/Analysis/LazyValueInfo.h"
 #include "llvm/Analysis/Loads.h"
@@ -325,9 +326,10 @@
       } else if (LVI) {
         Constant *CI = LVI->getConstantOnEdge(InVal,
                                               PN->getIncomingBlock(i), BB);
-        ConstantInt *CInt = dyn_cast_or_null<ConstantInt>(CI);
-        if (CInt)
-          Result.push_back(std::make_pair(CInt, PN->getIncomingBlock(i)));
+        // LVI returns null is no value could be determined.
+        if (!CI) continue;
+        ConstantInt *CInt = dyn_cast<ConstantInt>(CI);
+        Result.push_back(std::make_pair(CInt, PN->getIncomingBlock(i)));
       }
     }
     return !Result.empty();
@@ -373,10 +375,6 @@
           }
         }
       return !Result.empty();
-    
-    // Try to process a few other binary operator patterns.
-    } else if (isa<BinaryOperator>(I)) {
-      
     }
     
     // Handle the NOT form of XOR.
@@ -400,12 +398,19 @@
     // AND or OR of a value with itself is that value.
     ConstantInt *CI = dyn_cast<ConstantInt>(BO->getOperand(1));
     if (CI && (BO->getOpcode() == Instruction::And ||
-         BO->getOpcode() == Instruction::Or)) {
+        BO->getOpcode() == Instruction::Or)) {
       SmallVector<std::pair<ConstantInt*, BasicBlock*>, 8> LHSVals;
       ComputeValueKnownInPredecessors(BO->getOperand(0), BB, LHSVals);
-      for (unsigned i = 0, e = LHSVals.size(); i != e; ++i) 
-        if (LHSVals[i].first == CI)
-        Result.push_back(std::make_pair(CI, LHSVals[i].second));
+      for (unsigned i = 0, e = LHSVals.size(); i != e; ++i)
+        if (LHSVals[i].first == 0) {
+          ConstantInt *Zero =
+            cast<ConstantInt>(ConstantInt::get(BO->getType(), 0));
+          Result.push_back(std::make_pair(Zero, LHSVals[i].second));
+        } else if (Constant *Folded = ConstantExpr::get(BO->getOpcode(),
+                                                   LHSVals[i].first, CI)) {
+          Result.push_back(std::make_pair(cast<ConstantInt>(Folded), 
+                                          LHSVals[i].second));
+        }
       
       return !Result.empty();
     }
@@ -450,7 +455,7 @@
     if (LVI && isa<Constant>(Cmp->getOperand(1)) &&
         Cmp->getType()->isIntegerTy()) {
       if (!isa<Instruction>(Cmp->getOperand(0)) ||
-           cast<Instruction>(Cmp->getOperand(0))->getParent() != BB) {
+          cast<Instruction>(Cmp->getOperand(0))->getParent() != BB) {
         Constant *RHSCst = cast<Constant>(Cmp->getOperand(1));
 
         for (pred_iterator PI = pred_begin(BB), E = pred_end(BB);PI != E; ++PI){
@@ -472,20 +477,18 @@
       
       // Try to find a constant value for the LHS of an equality comparison,
       // and evaluate it statically if we can.
-      if (Cmp->getPredicate() == CmpInst::ICMP_EQ || 
-          Cmp->getPredicate() == CmpInst::ICMP_NE) {
+      if (Constant *CmpConst = dyn_cast<Constant>(Cmp->getOperand(1))) {
         SmallVector<std::pair<ConstantInt*, BasicBlock*>, 8> LHSVals;
         ComputeValueKnownInPredecessors(I->getOperand(0), BB, LHSVals);
         
-        ConstantInt *True = ConstantInt::getTrue(I->getContext());
-        ConstantInt *False = ConstantInt::getFalse(I->getContext());
-        if (Cmp->getPredicate() == CmpInst::ICMP_NE) std::swap(True, False);
-        
         for (unsigned i = 0, e = LHSVals.size(); i != e; ++i) {
-          if (LHSVals[i].first == Cmp->getOperand(1))
-            Result.push_back(std::make_pair(True, LHSVals[i].second));
-          else 
-            Result.push_back(std::make_pair(False, LHSVals[i].second));
+          if (LHSVals[i].first == 0)
+            Result.push_back(std::make_pair((ConstantInt*)0,
+                                            LHSVals[i].second));
+          else if (Constant *Folded = ConstantExpr::getCompare(
+                               Cmp->getPredicate(), LHSVals[i].first, CmpConst))
+            Result.push_back(std::make_pair(cast<ConstantInt>(Folded),
+                                            LHSVals[i].second));
         }
         
         return !Result.empty();
