diff options
author | Jessica Paquette <jpaquette@apple.com> | 2020-08-05 16:32:55 -0700 |
---|---|---|
committer | Jessica Paquette <jpaquette@apple.com> | 2020-08-06 16:47:07 -0700 |
commit | c8a282bcf7b6304e99f65bf22eea4553e240fb40 (patch) | |
tree | 6453834f8d7390a1480dcdfe4517866bc21cfed6 /llvm/lib/Analysis/ValueTracking.cpp | |
parent | 243903f3262d0e1727fe7d473da741c4a742a937 (diff) | |
download | llvm-c8a282bcf7b6304e99f65bf22eea4553e240fb40.zip llvm-c8a282bcf7b6304e99f65bf22eea4553e240fb40.tar.gz llvm-c8a282bcf7b6304e99f65bf22eea4553e240fb40.tar.bz2 |
[GlobalISel] Fix computing known bits for loads with range metadata
In GlobalISel, if you have a load into a small type with a range, you'll hit
an assert if you try to compute known bits on it starting at a larger type.
e.g.
```
%x:_(s8) = G_LOAD %whatever(p0) :: (load 1 ... !range !n)
...
%y:_(s32) = G_SOMETHING %x
```
When we walk through G_SOMETHING and hit the load, the width of our known bits
is 32. However, the width of the range is going to be 8. This will cause us
to hit an assert.
To fix this, make computeKnownBitsFromRangeMetadata zero extend or truncate
the range type to match the bitwidth of the known bits we're calculating.
Add a testcase in CodeGen/GlobalISel/KnownBitsTest.cpp to reflect that this
works now.
https://reviews.llvm.org/D85375
Diffstat (limited to 'llvm/lib/Analysis/ValueTracking.cpp')
-rw-r--r-- | llvm/lib/Analysis/ValueTracking.cpp | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp index af55c96..3cd90e8 100644 --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -549,10 +549,10 @@ void llvm::computeKnownBitsFromRangeMetadata(const MDNode &Ranges, // The first CommonPrefixBits of all values in Range are equal. unsigned CommonPrefixBits = (Range.getUnsignedMax() ^ Range.getUnsignedMin()).countLeadingZeros(); - APInt Mask = APInt::getHighBitsSet(BitWidth, CommonPrefixBits); - Known.One &= Range.getUnsignedMax() & Mask; - Known.Zero &= ~Range.getUnsignedMax() & Mask; + APInt UnsignedMax = Range.getUnsignedMax().zextOrTrunc(BitWidth); + Known.One &= UnsignedMax & Mask; + Known.Zero &= ~UnsignedMax & Mask; } } |