[Mlir-commits] [mlir] e63cc56 - [MLIR][presburger] normalize divisionrepr
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Thu Apr 27 01:43:27 PDT 2023
Author: gilsaia
Date: 2023-04-27T14:13:15+05:30
New Revision: e63cc56d9d049edbc30528aba7e9dd918ab8f82d
URL: https://github.com/llvm/llvm-project/commit/e63cc56d9d049edbc30528aba7e9dd918ab8f82d
DIFF: https://github.com/llvm/llvm-project/commit/e63cc56d9d049edbc30528aba7e9dd918ab8f82d.diff
LOG: [MLIR][presburger] normalize divisionrepr
Added a simple normalize function to divisionrepr and added a simple unittest.
Added a normalizediv call to divisionrepr's removeDuplicateDivs function, which now eliminates divs that are consistent after gcd's normalize
Reviewed By: Groverkss
Differential Revision: https://reviews.llvm.org/D147381
Added:
mlir/unittests/Analysis/Presburger/UtilsTest.cpp
Modified:
mlir/include/mlir/Analysis/Presburger/Utils.h
mlir/lib/Analysis/Presburger/Utils.cpp
mlir/unittests/Analysis/Presburger/CMakeLists.txt
Removed:
################################################################################
diff --git a/mlir/include/mlir/Analysis/Presburger/Utils.h b/mlir/include/mlir/Analysis/Presburger/Utils.h
index 592782d564497..a3000a26c3f3d 100644
--- a/mlir/include/mlir/Analysis/Presburger/Utils.h
+++ b/mlir/include/mlir/Analysis/Presburger/Utils.h
@@ -156,6 +156,11 @@ class DivisionRepr {
denoms[i] = divisor;
}
+ // Find the greatest common divisor (GCD) of the dividends and divisor for
+ // each valid division. Divide the dividends and divisor by the GCD to
+ // simplify the expression.
+ void normalizeDivs();
+
void insertDiv(unsigned pos, ArrayRef<MPInt> dividend, const MPInt &divisor);
void insertDiv(unsigned pos, unsigned num = 1);
diff --git a/mlir/lib/Analysis/Presburger/Utils.cpp b/mlir/lib/Analysis/Presburger/Utils.cpp
index 89ccc4f263290..1d2404eeb59cf 100644
--- a/mlir/lib/Analysis/Presburger/Utils.cpp
+++ b/mlir/lib/Analysis/Presburger/Utils.cpp
@@ -437,6 +437,7 @@ void DivisionRepr::removeDuplicateDivs(
// variable at position `i` only depends on local variables at position <
// `i`. This would make sure that all divisions depending on other local
// variables that can be merged, are merged.
+ normalizeDivs();
for (unsigned i = 0; i < getNumDivs(); ++i) {
// Check if a division representation exists for the `i^th` local var.
if (denoms[i] == 0)
@@ -472,6 +473,14 @@ void DivisionRepr::removeDuplicateDivs(
}
}
+void DivisionRepr::normalizeDivs() {
+ for (unsigned i = 0, e = getNumDivs(); i < e; ++i) {
+ if (getDenom(i) == 0 || getDividend(i).empty())
+ continue;
+ normalizeDiv(getDividend(i), getDenom(i));
+ }
+}
+
void DivisionRepr::insertDiv(unsigned pos, ArrayRef<MPInt> dividend,
const MPInt &divisor) {
assert(pos <= getNumDivs() && "Invalid insertion position");
diff --git a/mlir/unittests/Analysis/Presburger/CMakeLists.txt b/mlir/unittests/Analysis/Presburger/CMakeLists.txt
index 5af423295c0b6..4bfaf95f1a89b 100644
--- a/mlir/unittests/Analysis/Presburger/CMakeLists.txt
+++ b/mlir/unittests/Analysis/Presburger/CMakeLists.txt
@@ -10,6 +10,7 @@ add_mlir_unittest(MLIRPresburgerTests
PresburgerSpaceTest.cpp
PWMAFunctionTest.cpp
SimplexTest.cpp
+ UtilsTest.cpp
)
target_link_libraries(MLIRPresburgerTests
diff --git a/mlir/unittests/Analysis/Presburger/UtilsTest.cpp b/mlir/unittests/Analysis/Presburger/UtilsTest.cpp
new file mode 100644
index 0000000000000..c4acf5874235b
--- /dev/null
+++ b/mlir/unittests/Analysis/Presburger/UtilsTest.cpp
@@ -0,0 +1,68 @@
+//===- Utils.cpp - Tests for Utils file ----------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "mlir/Analysis/Presburger/Utils.h"
+
+#include <gmock/gmock.h>
+#include <gtest/gtest.h>
+
+using namespace mlir;
+using namespace presburger;
+
+static DivisionRepr parseDivisionRepr(unsigned numVars, unsigned numDivs,
+ ArrayRef<ArrayRef<MPInt>> dividends,
+ ArrayRef<MPInt> divisors) {
+ DivisionRepr repr(numVars, numDivs);
+ for (unsigned i = 0, rows = dividends.size(); i < rows; ++i)
+ repr.setDiv(i, dividends[i], divisors[i]);
+ return repr;
+}
+
+static void checkEqual(DivisionRepr &a, DivisionRepr &b) {
+ EXPECT_EQ(a.getNumVars(), b.getNumVars());
+ EXPECT_EQ(a.getNumDivs(), b.getNumDivs());
+ for (unsigned i = 0, rows = a.getNumDivs(); i < rows; ++i) {
+ EXPECT_EQ(a.hasRepr(i), b.hasRepr(i));
+ if (!a.hasRepr(i))
+ continue;
+ EXPECT_TRUE(a.getDenom(i) == b.getDenom(i));
+ EXPECT_TRUE(a.getDividend(i).equals(b.getDividend(i)));
+ }
+}
+
+TEST(UtilsTest, ParseAndCompareDivisionReprTest) {
+ auto merge = [this](unsigned i, unsigned j) -> bool { return true; };
+ DivisionRepr a = parseDivisionRepr(1, 1, {{MPInt(1), MPInt(2)}}, {MPInt(2)}),
+ b = parseDivisionRepr(1, 1, {{MPInt(1), MPInt(2)}}, {MPInt(2)}),
+ c = parseDivisionRepr(2, 2,
+ {{MPInt(0), MPInt(1), MPInt(2)},
+ {MPInt(0), MPInt(1), MPInt(2)}},
+ {MPInt(2), MPInt(2)});
+ c.removeDuplicateDivs(merge);
+ checkEqual(a, b);
+ checkEqual(a, c);
+}
+
+TEST(UtilsTest, DivisionReprNormalizeTest) {
+ auto merge = [this](unsigned i, unsigned j) -> bool { return true; };
+ DivisionRepr a = parseDivisionRepr(2, 1, {{MPInt(1), MPInt(2), MPInt(-1)}},
+ {MPInt(2)}),
+ b = parseDivisionRepr(2, 1, {{MPInt(16), MPInt(32), MPInt(-16)}},
+ {MPInt(32)}),
+ c = parseDivisionRepr(1, 1, {{MPInt(12), MPInt(-4)}},
+ {MPInt(8)}),
+ d = parseDivisionRepr(2, 2,
+ {{MPInt(1), MPInt(2), MPInt(-1)},
+ {MPInt(4), MPInt(8), MPInt(-4)}},
+ {MPInt(2), MPInt(8)});
+ b.removeDuplicateDivs(merge);
+ c.removeDuplicateDivs(merge);
+ d.removeDuplicateDivs(merge);
+ checkEqual(a, b);
+ checkEqual(c, d);
+}
More information about the Mlir-commits
mailing list