| //===- IntegerRelationTest.cpp - Tests for IntegerRelation class ----------===// |
| // |
| // 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/IntegerRelation.h" |
| #include "./Utils.h" |
| #include "mlir/Analysis/Presburger/Simplex.h" |
| |
| #include <gmock/gmock.h> |
| #include <gtest/gtest.h> |
| |
| using namespace mlir; |
| using namespace presburger; |
| |
| static IntegerRelation parseRelationFromSet(StringRef set, unsigned numDomain) { |
| IntegerRelation rel = parsePoly(set); |
| |
| rel.convertVarKind(VarKind::SetDim, 0, numDomain, VarKind::Domain); |
| |
| return rel; |
| } |
| |
| TEST(IntegerRelationTest, getDomainAndRangeSet) { |
| IntegerRelation rel = parseRelationFromSet( |
| "(x, xr)[N] : (xr - x - 10 == 0, xr >= 0, N - xr >= 0)", 1); |
| |
| IntegerPolyhedron domainSet = rel.getDomainSet(); |
| |
| IntegerPolyhedron expectedDomainSet = |
| parsePoly("(x)[N] : (x + 10 >= 0, N - x - 10 >= 0)"); |
| |
| EXPECT_TRUE(domainSet.isEqual(expectedDomainSet)); |
| |
| IntegerPolyhedron rangeSet = rel.getRangeSet(); |
| |
| IntegerPolyhedron expectedRangeSet = |
| parsePoly("(x)[N] : (x >= 0, N - x >= 0)"); |
| |
| 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)); |
| } |
| |
| TEST(IntegerRelationTest, intersectDomainAndRange) { |
| IntegerRelation rel = parseRelationFromSet( |
| "(x, y, z)[N, M]: (y floordiv 2 - N >= 0, z floordiv 5 - M" |
| ">= 0, x + y + z floordiv 7 == 0)", |
| 1); |
| |
| { |
| IntegerPolyhedron poly = parsePoly("(x)[N, M] : (x >= 0, M - x - 1 >= 0)"); |
| |
| IntegerRelation expectedRel = parseRelationFromSet( |
| "(x, y, z)[N, M]: (y floordiv 2 - N >= 0, z floordiv 5 - M" |
| ">= 0, x + y + z floordiv 7 == 0, x >= 0, M - x - 1 >= 0)", |
| 1); |
| |
| IntegerRelation copyRel = rel; |
| copyRel.intersectDomain(poly); |
| EXPECT_TRUE(copyRel.isEqual(expectedRel)); |
| } |
| |
| { |
| IntegerPolyhedron poly = |
| parsePoly("(y, z)[N, M] : (y >= 0, M - y - 1 >= 0, y + z == 0)"); |
| |
| IntegerRelation expectedRel = parseRelationFromSet( |
| "(x, y, z)[N, M]: (y floordiv 2 - N >= 0, z floordiv 5 - M" |
| ">= 0, x + y + z floordiv 7 == 0, y >= 0, M - y - 1 >= 0, y + z == 0)", |
| 1); |
| |
| IntegerRelation copyRel = rel; |
| copyRel.intersectRange(poly); |
| EXPECT_TRUE(copyRel.isEqual(expectedRel)); |
| } |
| } |
| |
| TEST(IntegerRelationTest, applyDomainAndRange) { |
| |
| { |
| IntegerRelation map1 = parseRelationFromSet( |
| "(x, y, a, b)[N] : (a - x - N == 0, b - y + N == 0)", 2); |
| IntegerRelation map2 = |
| parseRelationFromSet("(x, y, a)[N] : (a - x - y == 0)", 2); |
| |
| map1.applyRange(map2); |
| |
| IntegerRelation map3 = |
| parseRelationFromSet("(x, y, a)[N] : (a - x - y == 0)", 2); |
| |
| EXPECT_TRUE(map1.isEqual(map3)); |
| } |
| |
| { |
| IntegerRelation map1 = parseRelationFromSet( |
| "(x, y, a, b)[N] : (a - x + N == 0, b - y - N == 0)", 2); |
| IntegerRelation map2 = |
| parseRelationFromSet("(x, y, a, b)[N] : (a - N == 0, b - N == 0)", 2); |
| |
| IntegerRelation map3 = |
| parseRelationFromSet("(x, y, a, b)[N] : (x - N == 0, y - N == 0)", 2); |
| |
| map1.applyDomain(map2); |
| |
| EXPECT_TRUE(map1.isEqual(map3)); |
| } |
| } |
| |
| TEST(IntegerRelationTest, symbolicLexmin) { |
| SymbolicLexMin lexmin = |
| parseRelationFromSet("(a, x)[b] : (x - a >= 0, x - b >= 0)", 1) |
| .findSymbolicIntegerLexMin(); |
| |
| PWMAFunction expectedLexmin = |
| parsePWMAF(/*numInputs=*/2, |
| /*numOutputs=*/1, |
| { |
| {"(a)[b] : (a - b >= 0)", {{1, 0, 0}}}, // a |
| {"(a)[b] : (b - a - 1 >= 0)", {{0, 1, 0}}}, // b |
| }, |
| /*numSymbols=*/1); |
| EXPECT_TRUE(lexmin.unboundedDomain.isIntegerEmpty()); |
| EXPECT_TRUE(lexmin.lexmin.isEqual(expectedLexmin)); |
| } |