summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/include/llvm/IR/ConstantRange.h6
-rw-r--r--llvm/lib/IR/ConstantRange.cpp3
-rw-r--r--llvm/unittests/IR/ConstantRangeTest.cpp2
3 files changed, 6 insertions, 5 deletions
diff --git a/llvm/include/llvm/IR/ConstantRange.h b/llvm/include/llvm/IR/ConstantRange.h
index 11481a88fbf..3ac853f3161 100644
--- a/llvm/include/llvm/IR/ConstantRange.h
+++ b/llvm/include/llvm/IR/ConstantRange.h
@@ -167,8 +167,10 @@ public:
/// For example: [100, 8).
bool isWrappedSet() const;
- /// Return true if this set wraps around the INT_MIN of
- /// its bitwidth. For example: i8 [120, 140).
+ /// Return true if this set wraps around the signed domain. Special cases:
+ /// * Empty set: Not wrapped.
+ /// * Full set: Not wrapped.
+ /// * [X, SignedMin) == [X, SignedMax]: Not wrapped.
bool isSignWrappedSet() const;
/// Return true if the specified value is in the set.
diff --git a/llvm/lib/IR/ConstantRange.cpp b/llvm/lib/IR/ConstantRange.cpp
index 732f5c03d4e..0c2a3a86597 100644
--- a/llvm/lib/IR/ConstantRange.cpp
+++ b/llvm/lib/IR/ConstantRange.cpp
@@ -349,8 +349,7 @@ bool ConstantRange::isWrappedSet() const {
}
bool ConstantRange::isSignWrappedSet() const {
- return contains(APInt::getSignedMaxValue(getBitWidth())) &&
- contains(APInt::getSignedMinValue(getBitWidth()));
+ return Lower.sgt(Upper) && !Upper.isMinSignedValue();
}
APInt ConstantRange::getSetSize() const {
diff --git a/llvm/unittests/IR/ConstantRangeTest.cpp b/llvm/unittests/IR/ConstantRangeTest.cpp
index 058f534249e..c63c6cef7e1 100644
--- a/llvm/unittests/IR/ConstantRangeTest.cpp
+++ b/llvm/unittests/IR/ConstantRangeTest.cpp
@@ -161,7 +161,7 @@ TEST_F(ConstantRangeTest, GetMinsAndMaxes) {
}
TEST_F(ConstantRangeTest, SignWrapped) {
- EXPECT_TRUE(Full.isSignWrappedSet());
+ EXPECT_FALSE(Full.isSignWrappedSet());
EXPECT_FALSE(Empty.isSignWrappedSet());
EXPECT_FALSE(One.isSignWrappedSet());
EXPECT_FALSE(Some.isSignWrappedSet());
OpenPOWER on IntegriCloud