[llvm] r357854 - [ConstantRange] Shl considers full-set shifting to last bit position.
Marcello Maggioni via llvm-commits
llvm-commits at lists.llvm.org
Sat Apr 6 23:12:45 PDT 2019
Author: mggm
Date: Sat Apr 6 23:12:44 2019
New Revision: 357854
URL: http://llvm.org/viewvc/llvm-project?rev=357854&view=rev
Log:
[ConstantRange] Shl considers full-set shifting to last bit position.
if we do SHL of two 16-bit ranges like [0, 30000) with [1,2) we get
"full-set" instead of what I would have expected [0, 60000) which is
still in the 16-bit unsigned range.
This patch changes the SHL algorithm to allow getting a usable range
even in this case.
Differential Revision: https://reviews.llvm.org/D57983
Modified:
llvm/trunk/lib/IR/ConstantRange.cpp
llvm/trunk/unittests/IR/ConstantRangeTest.cpp
Modified: llvm/trunk/lib/IR/ConstantRange.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/ConstantRange.cpp?rev=357854&r1=357853&r2=357854&view=diff
==============================================================================
--- llvm/trunk/lib/IR/ConstantRange.cpp (original)
+++ llvm/trunk/lib/IR/ConstantRange.cpp Sat Apr 6 23:12:44 2019
@@ -1006,8 +1006,12 @@ ConstantRange::shl(const ConstantRange &
APInt max = getUnsignedMax();
APInt Other_umax = Other.getUnsignedMax();
+ // If we are shifting by maximum amount of
+ // zero return return the original range.
+ if (Other_umax.isNullValue())
+ return *this;
// there's overflow!
- if (Other_umax.uge(max.countLeadingZeros()))
+ if (Other_umax.ugt(max.countLeadingZeros()))
return getFull();
// FIXME: implement the other tricky cases
Modified: llvm/trunk/unittests/IR/ConstantRangeTest.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/IR/ConstantRangeTest.cpp?rev=357854&r1=357853&r2=357854&view=diff
==============================================================================
--- llvm/trunk/unittests/IR/ConstantRangeTest.cpp (original)
+++ llvm/trunk/unittests/IR/ConstantRangeTest.cpp Sat Apr 6 23:12:44 2019
@@ -704,6 +704,8 @@ TEST_F(ConstantRangeTest, UDiv) {
}
TEST_F(ConstantRangeTest, Shl) {
+ ConstantRange Some2(APInt(16, 0xfff), APInt(16, 0x8000));
+ ConstantRange WrapNullMax(APInt(16, 0x1), APInt(16, 0x0));
EXPECT_EQ(Full.shl(Full), Full);
EXPECT_EQ(Full.shl(Empty), Empty);
EXPECT_EQ(Full.shl(One), Full); // TODO: [0, (-1 << 0xa) + 1)
@@ -720,6 +722,10 @@ TEST_F(ConstantRangeTest, Shl) {
EXPECT_EQ(Some.shl(Some), Full); // TODO: [0xa << 0xa, 0xfc01)
EXPECT_EQ(Some.shl(Wrap), Full); // TODO: [0xa, 0x7ff << 0x5 + 1)
EXPECT_EQ(Wrap.shl(Wrap), Full);
+ EXPECT_EQ(
+ Some2.shl(ConstantRange(APInt(16, 0x1))),
+ ConstantRange(APInt(16, 0xfff << 0x1), APInt(16, 0x7fff << 0x1) + 1));
+ EXPECT_EQ(One.shl(WrapNullMax), Full);
}
TEST_F(ConstantRangeTest, Lshr) {
More information about the llvm-commits
mailing list