diff options
| author | Nuno Lopes <nunoplopes@sapo.pt> | 2012-06-28 16:10:13 +0000 | 
|---|---|---|
| committer | Nuno Lopes <nunoplopes@sapo.pt> | 2012-06-28 16:10:13 +0000 | 
| commit | 5020db2a8c40b7046ef62970690415361fe45907 (patch) | |
| tree | 6ecedf8271533dd84c8d7c4342272e361ed95926 | |
| parent | debc71cea3ae0e2b40fbe511de2d4f0e56a66fb1 (diff) | |
| download | bcm5719-llvm-5020db2a8c40b7046ef62970690415361fe45907.tar.gz bcm5719-llvm-5020db2a8c40b7046ef62970690415361fe45907.zip  | |
add ConstantRange::difference (to perform set difference/relative complement)
llvm-svn: 159352
| -rw-r--r-- | llvm/include/llvm/Support/ConstantRange.h | 4 | ||||
| -rw-r--r-- | llvm/lib/Support/ConstantRange.cpp | 6 | ||||
| -rw-r--r-- | llvm/unittests/Support/ConstantRangeTest.cpp | 17 | 
3 files changed, 27 insertions, 0 deletions
diff --git a/llvm/include/llvm/Support/ConstantRange.h b/llvm/include/llvm/Support/ConstantRange.h index ced3a2cf2db..90dd69fa478 100644 --- a/llvm/include/llvm/Support/ConstantRange.h +++ b/llvm/include/llvm/Support/ConstantRange.h @@ -155,6 +155,10 @@ public:    /// constant range.    ConstantRange subtract(const APInt &CI) const; +  /// \brief Subtract the specified range from this range (aka relative +  /// complement of the sets). +  ConstantRange difference(const ConstantRange &CR) const; +    /// intersectWith - Return the range that results from the intersection of    /// this range with another range.  The resultant range is guaranteed to    /// include all elements contained in both input ranges, and to have the diff --git a/llvm/lib/Support/ConstantRange.cpp b/llvm/lib/Support/ConstantRange.cpp index 61d333f24a0..91d086b6890 100644 --- a/llvm/lib/Support/ConstantRange.cpp +++ b/llvm/lib/Support/ConstantRange.cpp @@ -248,6 +248,12 @@ ConstantRange ConstantRange::subtract(const APInt &Val) const {    return ConstantRange(Lower - Val, Upper - Val);  } +/// \brief Subtract the specified range from this range (aka relative complement +/// of the sets). +ConstantRange ConstantRange::difference(const ConstantRange &CR) const { +  return intersectWith(CR.inverse()); +} +  /// intersectWith - Return the range that results from the intersection of this  /// range with another range.  The resultant range is guaranteed to include all  /// elements contained in both input ranges, and to have the smallest possible diff --git a/llvm/unittests/Support/ConstantRangeTest.cpp b/llvm/unittests/Support/ConstantRangeTest.cpp index a562080981a..72540c6999c 100644 --- a/llvm/unittests/Support/ConstantRangeTest.cpp +++ b/llvm/unittests/Support/ConstantRangeTest.cpp @@ -289,6 +289,23 @@ TEST_F(ConstantRangeTest, UnionWith) {                ConstantRange(16));  } +TEST_F(ConstantRangeTest, SetDifference) { +  EXPECT_EQ(Full.difference(Empty), Full); +  EXPECT_EQ(Full.difference(Full), Empty); +  EXPECT_EQ(Empty.difference(Empty), Empty); +  EXPECT_EQ(Empty.difference(Full), Empty); + +  ConstantRange A(APInt(16, 3), APInt(16, 7)); +  ConstantRange B(APInt(16, 5), APInt(16, 9)); +  ConstantRange C(APInt(16, 3), APInt(16, 5)); +  ConstantRange D(APInt(16, 7), APInt(16, 9)); +  ConstantRange E(APInt(16, 5), APInt(16, 4)); +  ConstantRange F(APInt(16, 7), APInt(16, 3)); +  EXPECT_EQ(A.difference(B), C); +  EXPECT_EQ(B.difference(A), D); +  EXPECT_EQ(E.difference(A), F); +} +  TEST_F(ConstantRangeTest, SubtractAPInt) {    EXPECT_EQ(Full.subtract(APInt(16, 4)), Full);    EXPECT_EQ(Empty.subtract(APInt(16, 4)), Empty);  | 

