Add an inverse() method to ConstantRange.
authorOwen Anderson <resistor@mac.com>
Sat, 7 Aug 2010 05:47:46 +0000 (05:47 +0000)
committerOwen Anderson <resistor@mac.com>
Sat, 7 Aug 2010 05:47:46 +0000 (05:47 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@110504 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Support/ConstantRange.h
lib/Support/ConstantRange.cpp
unittests/Support/ConstantRangeTest.cpp

index d767bd36b0c00a89d51958de4a99ad0e09d431c3..c3a6dd03fdfa4679b8053f69e61cb64caa602229 100644 (file)
@@ -232,6 +232,9 @@ public:
   /// from a logical right shift of a value in this range by the Amount value.
   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...
   ///
   void print(raw_ostream &OS) const;
index fb0442823c4c5b6f3d0f6e223eed721d811c4602..26a23efe031c5ff8379081084d376faf439956a5 100644 (file)
@@ -655,6 +655,17 @@ ConstantRange::lshr(const ConstantRange &Amount) const {
   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...
 ///
 void ConstantRange::print(raw_ostream &OS) const {
index 6b8d01d553f4918822aa88976e3258f35b5eda7c..fc1f5b8d06ca3a3690fe7bb3804cf514cea954a2 100644 (file)
@@ -33,6 +33,7 @@ ConstantRange ConstantRangeTest::Wrap(APInt(16, 0xaaa), APInt(16, 0xa));
 TEST_F(ConstantRangeTest, Basics) {
   EXPECT_TRUE(Full.isFullSet());
   EXPECT_FALSE(Full.isEmptySet());
+  EXPECT_TRUE(Full.inverse().isEmptySet());
   EXPECT_FALSE(Full.isWrappedSet());
   EXPECT_TRUE(Full.contains(APInt(16, 0x0)));
   EXPECT_TRUE(Full.contains(APInt(16, 0x9)));
@@ -42,6 +43,7 @@ TEST_F(ConstantRangeTest, Basics) {
 
   EXPECT_FALSE(Empty.isFullSet());
   EXPECT_TRUE(Empty.isEmptySet());
+  EXPECT_TRUE(Empty.inverse().isFullSet());
   EXPECT_FALSE(Empty.isWrappedSet());
   EXPECT_FALSE(Empty.contains(APInt(16, 0x0)));
   EXPECT_FALSE(Empty.contains(APInt(16, 0x9)));
@@ -57,6 +59,7 @@ TEST_F(ConstantRangeTest, Basics) {
   EXPECT_TRUE(One.contains(APInt(16, 0xa)));
   EXPECT_FALSE(One.contains(APInt(16, 0xaa9)));
   EXPECT_FALSE(One.contains(APInt(16, 0xaaa)));
+  EXPECT_FALSE(One.inverse().contains(APInt(16, 0xa)));
 
   EXPECT_FALSE(Some.isFullSet());
   EXPECT_FALSE(Some.isEmptySet());