[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
This commit is contained in:
Philip Reames 2016-04-26 22:52:30 +00:00
parent d5c62a0aad
commit e5030e85ea
2 changed files with 22 additions and 10 deletions

View 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))))

View 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
}