From: Philip Reames Date: Tue, 26 Apr 2016 22:52:30 +0000 (+0000) Subject: [LVI] A better fix for the assertion error introduced by 267609 X-Git-Tag: llvmorg-3.9.0-rc1~7865 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e5030e85ea8cadf868ee1e311eebd210e8637728;p=platform%2Fupstream%2Fllvm.git [LVI] A better fix for the assertion error introduced by 267609 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 --- diff --git a/llvm/lib/Analysis/LazyValueInfo.cpp b/llvm/lib/Analysis/LazyValueInfo.cpp index 5f1d179..6bc639c 100644 --- a/llvm/lib/Analysis/LazyValueInfo.cpp +++ b/llvm/lib/Analysis/LazyValueInfo.cpp @@ -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)))) diff --git a/llvm/test/Transforms/CorrelatedValuePropagation/basic.ll b/llvm/test/Transforms/CorrelatedValuePropagation/basic.ll index 0112d48..9f41807 100644 --- a/llvm/test/Transforms/CorrelatedValuePropagation/basic.ll +++ b/llvm/test/Transforms/CorrelatedValuePropagation/basic.ll @@ -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 +}