Add an inverse() method to ConstantRange.

llvm-svn: 110504
This commit is contained in:
Owen Anderson 2010-08-07 05:47:46 +00:00
parent 5caa7c58db
commit 1a9078b862
3 changed files with 17 additions and 0 deletions

View File

@ -232,6 +232,9 @@ public:
/// from a logical right shift of a value in this range by the Amount value. /// from a logical right shift of a value in this range by the Amount value.
ConstantRange lshr(const ConstantRange &Amount) const; ConstantRange lshr(const ConstantRange &Amount) const;
/// inverse - Return a new range that is the logical not of the current set.
ConstantRange inverse() const;
/// print - Print out the bounds to a stream... /// print - Print out the bounds to a stream...
/// ///
void print(raw_ostream &OS) const; void print(raw_ostream &OS) const;

View File

@ -655,6 +655,17 @@ ConstantRange::lshr(const ConstantRange &Amount) const {
return ConstantRange(min, max); return ConstantRange(min, max);
} }
ConstantRange ConstantRange::inverse() const {
if (isFullSet()) {
return ConstantRange(APInt::getNullValue(Lower.getBitWidth()),
APInt::getNullValue(Lower.getBitWidth()));
} else if (isEmptySet()) {
return ConstantRange(APInt::getAllOnesValue(Lower.getBitWidth()),
APInt::getAllOnesValue(Lower.getBitWidth()));
}
return ConstantRange(Upper, Lower);
}
/// print - Print out the bounds to a stream... /// print - Print out the bounds to a stream...
/// ///
void ConstantRange::print(raw_ostream &OS) const { void ConstantRange::print(raw_ostream &OS) const {

View File

@ -33,6 +33,7 @@ ConstantRange ConstantRangeTest::Wrap(APInt(16, 0xaaa), APInt(16, 0xa));
TEST_F(ConstantRangeTest, Basics) { TEST_F(ConstantRangeTest, Basics) {
EXPECT_TRUE(Full.isFullSet()); EXPECT_TRUE(Full.isFullSet());
EXPECT_FALSE(Full.isEmptySet()); EXPECT_FALSE(Full.isEmptySet());
EXPECT_TRUE(Full.inverse().isEmptySet());
EXPECT_FALSE(Full.isWrappedSet()); EXPECT_FALSE(Full.isWrappedSet());
EXPECT_TRUE(Full.contains(APInt(16, 0x0))); EXPECT_TRUE(Full.contains(APInt(16, 0x0)));
EXPECT_TRUE(Full.contains(APInt(16, 0x9))); EXPECT_TRUE(Full.contains(APInt(16, 0x9)));
@ -42,6 +43,7 @@ TEST_F(ConstantRangeTest, Basics) {
EXPECT_FALSE(Empty.isFullSet()); EXPECT_FALSE(Empty.isFullSet());
EXPECT_TRUE(Empty.isEmptySet()); EXPECT_TRUE(Empty.isEmptySet());
EXPECT_TRUE(Empty.inverse().isFullSet());
EXPECT_FALSE(Empty.isWrappedSet()); EXPECT_FALSE(Empty.isWrappedSet());
EXPECT_FALSE(Empty.contains(APInt(16, 0x0))); EXPECT_FALSE(Empty.contains(APInt(16, 0x0)));
EXPECT_FALSE(Empty.contains(APInt(16, 0x9))); EXPECT_FALSE(Empty.contains(APInt(16, 0x9)));
@ -57,6 +59,7 @@ TEST_F(ConstantRangeTest, Basics) {
EXPECT_TRUE(One.contains(APInt(16, 0xa))); EXPECT_TRUE(One.contains(APInt(16, 0xa)));
EXPECT_FALSE(One.contains(APInt(16, 0xaa9))); EXPECT_FALSE(One.contains(APInt(16, 0xaa9)));
EXPECT_FALSE(One.contains(APInt(16, 0xaaa))); EXPECT_FALSE(One.contains(APInt(16, 0xaaa)));
EXPECT_FALSE(One.inverse().contains(APInt(16, 0xa)));
EXPECT_FALSE(Some.isFullSet()); EXPECT_FALSE(Some.isFullSet());
EXPECT_FALSE(Some.isEmptySet()); EXPECT_FALSE(Some.isEmptySet());