[LVI] A better fix for the assertion error introduced by 267609
authorPhilip Reames <listmail@philipreames.com>
Tue, 26 Apr 2016 22:52:30 +0000 (22:52 +0000)
committerPhilip Reames <listmail@philipreames.com>
Tue, 26 Apr 2016 22:52:30 +0000 (22:52 +0000)
Essentially, I was using the wrong size function.  For types which were sized, but not primitive, I wasn't getting a useful size for the operand and failed an assert.  I fixed this, and also added a guard that the input is a sized type.  Test case is for the original mistake.  I'm not sure how to actually exercise the sized type check.

llvm-svn: 267618

llvm/lib/Analysis/LazyValueInfo.cpp
llvm/test/Transforms/CorrelatedValuePropagation/basic.ll

index 5f1d179..6bc639c 100644 (file)
@@ -1002,7 +1002,14 @@ bool LazyValueInfoCache::solveBlockValueSelect(LVILatticeVal &BBLV,
 
 bool LazyValueInfoCache::solveBlockValueCast(LVILatticeVal &BBLV,
                                              Instruction *BBI,
-                                             BasicBlock *BB) {  
+                                             BasicBlock *BB) {
+  if (!BBI->getOperand(0)->getType()->isSized()) {
+    // Without knowing how wide the input is, we can't analyze it in any useful
+    // way.
+    BBLV.markOverdefined();
+    return true;
+  }
+  
   // Figure out the range of the LHS.  If that fails, we still apply the
   // transfer rule on the full set since we may be able to locally infer
   // interesting facts.
@@ -1012,14 +1019,7 @@ bool LazyValueInfoCache::solveBlockValueCast(LVILatticeVal &BBLV,
       return false;
 
   const unsigned OperandBitWidth =
-    BBI->getOperand(0)->getType()->getPrimitiveSizeInBits();
-  if (OperandBitWidth == 0) {
-    // Without knowing how wide the input is, we can't analyze it in any useful
-    // way.  
-    BBLV.markOverdefined();
-    return true;
-  }
-  
+    DL.getTypeSizeInBits(BBI->getOperand(0)->getType());
   ConstantRange LHSRange = ConstantRange(OperandBitWidth);
   if (hasBlockValue(BBI->getOperand(0), BB)) {
     LVILatticeVal LHSVal = getBlockValue(BBI->getOperand(0), BB);
@@ -1062,7 +1062,8 @@ bool LazyValueInfoCache::solveBlockValueCast(LVILatticeVal &BBLV,
 
 bool LazyValueInfoCache::solveBlockValueBinaryOp(LVILatticeVal &BBLV,
                                                  Instruction *BBI,
-                                                 BasicBlock *BB) {  
+                                                 BasicBlock *BB) {
+  
   // Figure out the range of the LHS.  If that fails, bail.
   if (!hasBlockValue(BBI->getOperand(0), BB)) {
     if (pushBlockValue(std::make_pair(BB, BBI->getOperand(0))))
index 0112d48..9f41807 100644 (file)
@@ -429,3 +429,14 @@ entry:
 exit:
   ret i1 %cmp
 }
+
+define i1 @bitcast_unknown2(i8* %p) {
+; CHECK-LABEL: @bitcast_unknown2
+; CHECK: ret i1 %cmp
+entry:
+  %p64 = ptrtoint i8* %p to i64
+  %cmp = icmp sle i64 %p64, 128
+  br label %exit
+exit:
+  ret i1 %cmp
+}