1 //===- PresburgerSpaceTest.cpp - Tests for PresburgerSpace ----------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8
9 #include "mlir/Analysis/Presburger/PresburgerSpace.h"
10 #include <gmock/gmock.h>
11 #include <gtest/gtest.h>
12
13 using namespace mlir;
14 using namespace presburger;
15
TEST(PresburgerSpaceTest,insertId)16 TEST(PresburgerSpaceTest, insertId) {
17 PresburgerSpace space = PresburgerSpace::getRelationSpace(2, 2, 1);
18
19 // Try inserting 2 domain ids.
20 space.insertVar(VarKind::Domain, 0, 2);
21 EXPECT_EQ(space.getNumDomainVars(), 4u);
22
23 // Try inserting 1 range ids.
24 space.insertVar(VarKind::Range, 0, 1);
25 EXPECT_EQ(space.getNumRangeVars(), 3u);
26 }
27
TEST(PresburgerSpaceTest,insertIdSet)28 TEST(PresburgerSpaceTest, insertIdSet) {
29 PresburgerSpace space = PresburgerSpace::getSetSpace(2, 1);
30
31 // Try inserting 2 dimension ids. The space should have 4 range ids since
32 // spaces which do not distinguish between domain, range are implemented like
33 // this.
34 space.insertVar(VarKind::SetDim, 0, 2);
35 EXPECT_EQ(space.getNumRangeVars(), 4u);
36 }
37
TEST(PresburgerSpaceTest,removeIdRange)38 TEST(PresburgerSpaceTest, removeIdRange) {
39 PresburgerSpace space = PresburgerSpace::getRelationSpace(2, 1, 3);
40
41 // Remove 1 domain identifier.
42 space.removeVarRange(VarKind::Domain, 0, 1);
43 EXPECT_EQ(space.getNumDomainVars(), 1u);
44
45 // Remove 1 symbol and 1 range identifier.
46 space.removeVarRange(VarKind::Symbol, 0, 1);
47 space.removeVarRange(VarKind::Range, 0, 1);
48 EXPECT_EQ(space.getNumDomainVars(), 1u);
49 EXPECT_EQ(space.getNumRangeVars(), 0u);
50 EXPECT_EQ(space.getNumSymbolVars(), 2u);
51 }
52
TEST(PresburgerSpaceTest,insertVarIdentifier)53 TEST(PresburgerSpaceTest, insertVarIdentifier) {
54 PresburgerSpace space = PresburgerSpace::getRelationSpace(2, 2, 1, 0);
55 space.resetIds<int *>();
56
57 // Attach identifiers to domain ids.
58 int identifiers[2] = {0, 1};
59 space.setId<int *>(VarKind::Domain, 0, &identifiers[0]);
60 space.setId<int *>(VarKind::Domain, 1, &identifiers[1]);
61
62 // Try inserting 2 domain ids.
63 space.insertVar(VarKind::Domain, 0, 2);
64 EXPECT_EQ(space.getNumDomainVars(), 4u);
65
66 // Try inserting 1 range ids.
67 space.insertVar(VarKind::Range, 0, 1);
68 EXPECT_EQ(space.getNumRangeVars(), 3u);
69
70 // Check if the identifiers for the old ids are still attached properly.
71 EXPECT_EQ(*space.getId<int *>(VarKind::Domain, 2), identifiers[0]);
72 EXPECT_EQ(*space.getId<int *>(VarKind::Domain, 3), identifiers[1]);
73 }
74
TEST(PresburgerSpaceTest,removeVarRangeIdentifier)75 TEST(PresburgerSpaceTest, removeVarRangeIdentifier) {
76 PresburgerSpace space = PresburgerSpace::getRelationSpace(2, 1, 3, 0);
77 space.resetIds<int *>();
78
79 int identifiers[6] = {0, 1, 2, 3, 4, 5};
80
81 // Attach identifiers to domain identifiers.
82 space.setId<int *>(VarKind::Domain, 0, &identifiers[0]);
83 space.setId<int *>(VarKind::Domain, 1, &identifiers[1]);
84
85 // Attach identifiers to range identifiers.
86 space.setId<int *>(VarKind::Range, 0, &identifiers[2]);
87
88 // Attach identifiers to symbol identifiers.
89 space.setId<int *>(VarKind::Symbol, 0, &identifiers[3]);
90 space.setId<int *>(VarKind::Symbol, 1, &identifiers[4]);
91 space.setId<int *>(VarKind::Symbol, 2, &identifiers[5]);
92
93 // Remove 1 domain identifier.
94 space.removeVarRange(VarKind::Domain, 0, 1);
95 EXPECT_EQ(space.getNumDomainVars(), 1u);
96
97 // Remove 1 symbol and 1 range identifier.
98 space.removeVarRange(VarKind::Symbol, 0, 1);
99 space.removeVarRange(VarKind::Range, 0, 1);
100 EXPECT_EQ(space.getNumDomainVars(), 1u);
101 EXPECT_EQ(space.getNumRangeVars(), 0u);
102 EXPECT_EQ(space.getNumSymbolVars(), 2u);
103
104 // Check if domain identifiers are attached properly.
105 EXPECT_EQ(*space.getId<int *>(VarKind::Domain, 0), identifiers[1]);
106
107 // Check if symbol identifiers are attached properly.
108 EXPECT_EQ(*space.getId<int *>(VarKind::Range, 0), identifiers[4]);
109 EXPECT_EQ(*space.getId<int *>(VarKind::Range, 1), identifiers[5]);
110 }
111