[Mlir-commits] [mlir] fb857de - [MLIR][Presburger] Add inverse to IntegerRelation
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Wed May 25 07:10:57 PDT 2022
Author: Groverkss
Date: 2022-05-25T19:37:52+05:30
New Revision: fb857ded70e108afec4f4f7e024b0315bbe00de4
URL: https://github.com/llvm/llvm-project/commit/fb857ded70e108afec4f4f7e024b0315bbe00de4
DIFF: https://github.com/llvm/llvm-project/commit/fb857ded70e108afec4f4f7e024b0315bbe00de4.diff
LOG: [MLIR][Presburger] Add inverse to IntegerRelation
This patch adds support for obtaining inverse of a relation.
Reviewed By: ftynse
Differential Revision: https://reviews.llvm.org/D126327
Added:
Modified:
mlir/include/mlir/Analysis/Presburger/IntegerRelation.h
mlir/lib/Analysis/Presburger/IntegerRelation.cpp
mlir/unittests/Analysis/Presburger/IntegerRelationTest.cpp
Removed:
################################################################################
diff --git a/mlir/include/mlir/Analysis/Presburger/IntegerRelation.h b/mlir/include/mlir/Analysis/Presburger/IntegerRelation.h
index 1eca9efd39fb..b74413b9ff01 100644
--- a/mlir/include/mlir/Analysis/Presburger/IntegerRelation.h
+++ b/mlir/include/mlir/Analysis/Presburger/IntegerRelation.h
@@ -505,6 +505,12 @@ class IntegerRelation {
/// Return a set corresponding to all points in the range of the relation.
IntegerPolyhedron getRangeSet() const;
+ /// Invert the relation i.e., swap it's domain and range.
+ ///
+ /// Formally, let the relation `this` be R: A -> B, then this operation
+ /// modifies R to be B -> A.
+ void inverse();
+
void print(raw_ostream &os) const;
void dump() const;
diff --git a/mlir/lib/Analysis/Presburger/IntegerRelation.cpp b/mlir/lib/Analysis/Presburger/IntegerRelation.cpp
index 4df84aaad906..87132728103a 100644
--- a/mlir/lib/Analysis/Presburger/IntegerRelation.cpp
+++ b/mlir/lib/Analysis/Presburger/IntegerRelation.cpp
@@ -2102,6 +2102,12 @@ IntegerPolyhedron IntegerRelation::getRangeSet() const {
return IntegerPolyhedron(std::move(copyRel));
}
+void IntegerRelation::inverse() {
+ unsigned numRangeIds = getNumIdKind(IdKind::Range);
+ convertIdKind(IdKind::Domain, 0, getIdKindEnd(IdKind::Domain), IdKind::Range);
+ convertIdKind(IdKind::Range, 0, numRangeIds, IdKind::Domain);
+}
+
void IntegerRelation::printSpace(raw_ostream &os) const {
space.print(os);
os << getNumConstraints() << " constraints\n";
diff --git a/mlir/unittests/Analysis/Presburger/IntegerRelationTest.cpp b/mlir/unittests/Analysis/Presburger/IntegerRelationTest.cpp
index 06dbee01896b..ee922584f564 100644
--- a/mlir/unittests/Analysis/Presburger/IntegerRelationTest.cpp
+++ b/mlir/unittests/Analysis/Presburger/IntegerRelationTest.cpp
@@ -41,3 +41,19 @@ TEST(IntegerRelationTest, getDomainAndRangeSet) {
EXPECT_TRUE(rangeSet.isEqual(expectedRangeSet));
}
+
+TEST(IntegerRelationTest, inverse) {
+ IntegerRelation rel =
+ parseRelationFromSet("(x, y, z)[N, M] : (z - x - y == 0, x >= 0, N - x "
+ ">= 0, y >= 0, M - y >= 0)",
+ 2);
+
+ IntegerRelation inverseRel =
+ parseRelationFromSet("(z, x, y)[N, M] : (x >= 0, N - x >= 0, y >= 0, M "
+ "- y >= 0, x + y - z == 0)",
+ 1);
+
+ rel.inverse();
+
+ EXPECT_TRUE(rel.isEqual(inverseRel));
+}
More information about the Mlir-commits
mailing list