diff options
author | Sanjay Patel <spatel@rotateright.com> | 2018-02-08 14:52:40 +0000 |
---|---|---|
committer | Sanjay Patel <spatel@rotateright.com> | 2018-02-08 14:52:40 +0000 |
commit | a60aec1ab72ab5df8c72d8c0cb37b823b0b28b7c (patch) | |
tree | b43a4772b959ab175f41a54bbf4a4d5b6597e662 /llvm/lib/Analysis/ValueTracking.cpp | |
parent | 2583976e81268250bd53aaaa5914242aaa267bc4 (diff) | |
download | llvm-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.cpp | 8 |
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))) |