blob: c241d5d2f0e817c5f1ca24ceeefeba3992b42bd5 [file] [log] [blame] [edit]
//===- 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));
}