Don't assume that all constants with integer types are ConstantInts.
authorOwen Anderson <resistor@mac.com>
Tue, 24 Aug 2010 07:55:44 +0000 (07:55 +0000)
committerOwen Anderson <resistor@mac.com>
Tue, 24 Aug 2010 07:55:44 +0000 (07:55 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@111906 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/LazyValueInfo.cpp

index 57b4dcb8d7c765ce34a9702b7620f29b5426f620..e8cc69de551f66e417a516f51e5ebe1fb8c81da2 100644 (file)
@@ -216,6 +216,8 @@ public:
           return markOverdefined();
         else
           return markConstantRange(NewR);
+      } else if (!isUndefined()) {
+        return markOverdefined();
       }
       
       assert(isUndefined() && "Unexpected lattice");
@@ -541,7 +543,12 @@ LVILatticeVal LVIQuery::getBlockValue(BasicBlock *BB) {
   ConstantRange RHSRange(1);
   const IntegerType *ResultTy = cast<IntegerType>(BBI->getType());
   if (isa<BinaryOperator>(BBI)) {
-    RHS = cast<ConstantInt>(BBI->getOperand(1));
+    RHS = dyn_cast<ConstantInt>(BBI->getOperand(1));
+    if (!RHS) {
+      Result.markOverdefined();
+      return Result;
+    }
+    
     RHSRange = ConstantRange(RHS->getValue(), RHS->getValue()+1);
   }
       
@@ -842,7 +849,9 @@ LazyValueInfo::getPredicateOnEdge(unsigned Pred, Value *V, Constant *C,
   }
   
   if (Result.isConstantRange()) {
-    ConstantInt *CI = cast<ConstantInt>(C);
+    ConstantInt *CI = dyn_cast<ConstantInt>(C);
+    if (!CI) return Unknown;
+    
     ConstantRange CR = Result.getConstantRange();
     if (Pred == ICmpInst::ICMP_EQ) {
       if (!CR.contains(CI->getValue()))