diff options
author | Philip Reames <listmail@philipreames.com> | 2016-04-26 22:52:30 +0000 |
---|---|---|
committer | Philip Reames <listmail@philipreames.com> | 2016-04-26 22:52:30 +0000 |
commit | e5030e85ea8cadf868ee1e311eebd210e8637728 (patch) | |
tree | d6bca97a6fc52addd78a0ad573cbd9502b51aa68 /llvm/lib/Analysis/LazyValueInfo.cpp | |
parent | d5c62a0aad1f87e89d5a8c1d9837ed949d1687a6 (diff) | |
download | llvm-e5030e85ea8cadf868ee1e311eebd210e8637728.zip llvm-e5030e85ea8cadf868ee1e311eebd210e8637728.tar.gz llvm-e5030e85ea8cadf868ee1e311eebd210e8637728.tar.bz2 |
[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
Diffstat (limited to 'llvm/lib/Analysis/LazyValueInfo.cpp')
-rw-r--r-- | llvm/lib/Analysis/LazyValueInfo.cpp | 21 |
1 files changed, 11 insertions, 10 deletions
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)))) |