[ConstantRange] Exclude full set from isSignWrappedSet()

Split off from D59749. This uses a simpler and more efficient
implementation of isSignWrappedSet(), and considers full sets
as non-wrapped, to be consistent with isWrappedSet(). Otherwise
the behavior is unchanged.

There are currently only two users of this function and both already
check for isFullSet() || isSignWrappedSet(), so this is not going to
cause a change in overall behavior.

Differential Revision: https://reviews.llvm.org/D59848

llvm-svn: 357039
This commit is contained in:
Nikita Popov 2019-03-26 22:37:26 +00:00
parent db8a742206
commit e6eef49f05
3 changed files with 6 additions and 5 deletions

View File

@ -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.

View File

@ -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 {

View File

@ -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());