aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Analysis/ValueTracking.cpp
diff options
context:
space:
mode:
authorSanjay Patel <spatel@rotateright.com>2018-02-08 14:52:40 +0000
committerSanjay Patel <spatel@rotateright.com>2018-02-08 14:52:40 +0000
commita60aec1ab72ab5df8c72d8c0cb37b823b0b28b7c (patch)
treeb43a4772b959ab175f41a54bbf4a4d5b6597e662 /llvm/lib/Analysis/ValueTracking.cpp
parent2583976e81268250bd53aaaa5914242aaa267bc4 (diff)
downloadllvm-a60aec1ab72ab5df8c72d8c0cb37b823b0b28b7c.zip
llvm-a60aec1ab72ab5df8c72d8c0cb37b823b0b28b7c.tar.gz
llvm-a60aec1ab72ab5df8c72d8c0cb37b823b0b28b7c.tar.bz2
[ValueTracking] don't crash when assumptions conflict (PR36270)
The last assume in the test says that %B12 is 0. The first assume says that %and1 is less than %B12. Therefore, %and1 is unsigned less than 0...does not compute. That means this line: Known.Zero.setHighBits(RHSKnown.countMinLeadingZeros() + 1); ...tries to set more bits than exist. Differential Revision: https://reviews.llvm.org/D43052 llvm-svn: 324610
Diffstat (limited to 'llvm/lib/Analysis/ValueTracking.cpp')
-rw-r--r--llvm/lib/Analysis/ValueTracking.cpp8
1 files changed, 8 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp
index 5a8bd4b..ada31e0 100644
--- a/llvm/lib/Analysis/ValueTracking.cpp
+++ b/llvm/lib/Analysis/ValueTracking.cpp
@@ -816,6 +816,14 @@ static void computeKnownBitsFromAssume(const Value *V, KnownBits &Known,
KnownBits RHSKnown(BitWidth);
computeKnownBits(A, RHSKnown, Depth+1, Query(Q, I));
+ // If the RHS is known zero, then this assumption must be wrong (nothing
+ // is unsigned less than zero). Signal a conflict and get out of here.
+ if (RHSKnown.isZero()) {
+ Known.Zero.setAllBits();
+ Known.One.setAllBits();
+ break;
+ }
+
// Whatever high bits in c are zero are known to be zero (if c is a power
// of 2, then one more).
if (isKnownToBeAPowerOfTwo(A, false, Depth + 1, Query(Q, I)))