1eae62b22SGroverkss //===- PresburgerSpaceTest.cpp - Tests for PresburgerSpace ----------------===//
2eae62b22SGroverkss //
3eae62b22SGroverkss // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4eae62b22SGroverkss // See https://llvm.org/LICENSE.txt for license information.
5eae62b22SGroverkss // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6eae62b22SGroverkss //
7eae62b22SGroverkss //===----------------------------------------------------------------------===//
8eae62b22SGroverkss
9eae62b22SGroverkss #include "mlir/Analysis/Presburger/PresburgerSpace.h"
10eae62b22SGroverkss #include <gmock/gmock.h>
11eae62b22SGroverkss #include <gtest/gtest.h>
12eae62b22SGroverkss
13eae62b22SGroverkss using namespace mlir;
140c1f6865SGroverkss using namespace presburger;
150c1f6865SGroverkss
TEST(PresburgerSpaceTest,insertId)16eae62b22SGroverkss TEST(PresburgerSpaceTest, insertId) {
17a5a598beSGroverkss PresburgerSpace space = PresburgerSpace::getRelationSpace(2, 2, 1);
18eae62b22SGroverkss
19eae62b22SGroverkss // Try inserting 2 domain ids.
20d95140a5SGroverkss space.insertVar(VarKind::Domain, 0, 2);
21d95140a5SGroverkss EXPECT_EQ(space.getNumDomainVars(), 4u);
22eae62b22SGroverkss
23eae62b22SGroverkss // Try inserting 1 range ids.
24d95140a5SGroverkss space.insertVar(VarKind::Range, 0, 1);
25d95140a5SGroverkss EXPECT_EQ(space.getNumRangeVars(), 3u);
26eae62b22SGroverkss }
27eae62b22SGroverkss
TEST(PresburgerSpaceTest,insertIdSet)28eae62b22SGroverkss TEST(PresburgerSpaceTest, insertIdSet) {
29a5a598beSGroverkss PresburgerSpace space = PresburgerSpace::getSetSpace(2, 1);
30eae62b22SGroverkss
31eae62b22SGroverkss // Try inserting 2 dimension ids. The space should have 4 range ids since
32eae62b22SGroverkss // spaces which do not distinguish between domain, range are implemented like
33eae62b22SGroverkss // this.
34d95140a5SGroverkss space.insertVar(VarKind::SetDim, 0, 2);
35d95140a5SGroverkss EXPECT_EQ(space.getNumRangeVars(), 4u);
36eae62b22SGroverkss }
37eae62b22SGroverkss
TEST(PresburgerSpaceTest,removeIdRange)38eae62b22SGroverkss TEST(PresburgerSpaceTest, removeIdRange) {
39a5a598beSGroverkss PresburgerSpace space = PresburgerSpace::getRelationSpace(2, 1, 3);
40eae62b22SGroverkss
41eae62b22SGroverkss // Remove 1 domain identifier.
42d95140a5SGroverkss space.removeVarRange(VarKind::Domain, 0, 1);
43d95140a5SGroverkss EXPECT_EQ(space.getNumDomainVars(), 1u);
44eae62b22SGroverkss
45eae62b22SGroverkss // Remove 1 symbol and 1 range identifier.
46d95140a5SGroverkss space.removeVarRange(VarKind::Symbol, 0, 1);
47d95140a5SGroverkss space.removeVarRange(VarKind::Range, 0, 1);
48d95140a5SGroverkss EXPECT_EQ(space.getNumDomainVars(), 1u);
49d95140a5SGroverkss EXPECT_EQ(space.getNumRangeVars(), 0u);
50d95140a5SGroverkss EXPECT_EQ(space.getNumSymbolVars(), 2u);
51eae62b22SGroverkss }
52127780e5SGroverkss
TEST(PresburgerSpaceTest,insertVarIdentifier)53ed3b040bSGroverkss TEST(PresburgerSpaceTest, insertVarIdentifier) {
54127780e5SGroverkss PresburgerSpace space = PresburgerSpace::getRelationSpace(2, 2, 1, 0);
55d222b690SGroverkss
56d222b690SGroverkss int identifiers[2] = {0, 1};
57127780e5SGroverkss
58ed3b040bSGroverkss // Attach identifiers to domain ids.
59*24da7fa0SBharathi Ramana Joshi space.setId(VarKind::Domain, 0, Identifier(&identifiers[0]));
60*24da7fa0SBharathi Ramana Joshi space.setId(VarKind::Domain, 1, Identifier(&identifiers[1]));
61127780e5SGroverkss
62127780e5SGroverkss // Try inserting 2 domain ids.
63d95140a5SGroverkss space.insertVar(VarKind::Domain, 0, 2);
64d95140a5SGroverkss EXPECT_EQ(space.getNumDomainVars(), 4u);
65127780e5SGroverkss
66127780e5SGroverkss // Try inserting 1 range ids.
67d95140a5SGroverkss space.insertVar(VarKind::Range, 0, 1);
68d95140a5SGroverkss EXPECT_EQ(space.getNumRangeVars(), 3u);
69127780e5SGroverkss
70ed3b040bSGroverkss // Check if the identifiers for the old ids are still attached properly.
71d222b690SGroverkss EXPECT_EQ(space.getId(VarKind::Domain, 2), Identifier(&identifiers[0]));
72d222b690SGroverkss EXPECT_EQ(space.getId(VarKind::Domain, 3), Identifier(&identifiers[1]));
73127780e5SGroverkss }
74127780e5SGroverkss
TEST(PresburgerSpaceTest,removeVarRangeIdentifier)75ed3b040bSGroverkss TEST(PresburgerSpaceTest, removeVarRangeIdentifier) {
76127780e5SGroverkss PresburgerSpace space = PresburgerSpace::getRelationSpace(2, 1, 3, 0);
77127780e5SGroverkss
78ed3b040bSGroverkss int identifiers[6] = {0, 1, 2, 3, 4, 5};
79127780e5SGroverkss
80ed3b040bSGroverkss // Attach identifiers to domain identifiers.
81*24da7fa0SBharathi Ramana Joshi space.setId(VarKind::Domain, 0, Identifier(&identifiers[0]));
82*24da7fa0SBharathi Ramana Joshi space.setId(VarKind::Domain, 1, Identifier(&identifiers[1]));
83127780e5SGroverkss
84ed3b040bSGroverkss // Attach identifiers to range identifiers.
85*24da7fa0SBharathi Ramana Joshi space.setId(VarKind::Range, 0, Identifier(&identifiers[2]));
86127780e5SGroverkss
87ed3b040bSGroverkss // Attach identifiers to symbol identifiers.
88*24da7fa0SBharathi Ramana Joshi space.setId(VarKind::Symbol, 0, Identifier(&identifiers[3]));
89*24da7fa0SBharathi Ramana Joshi space.setId(VarKind::Symbol, 1, Identifier(&identifiers[4]));
90*24da7fa0SBharathi Ramana Joshi space.setId(VarKind::Symbol, 2, Identifier(&identifiers[5]));
91127780e5SGroverkss
92127780e5SGroverkss // Remove 1 domain identifier.
93d95140a5SGroverkss space.removeVarRange(VarKind::Domain, 0, 1);
94d95140a5SGroverkss EXPECT_EQ(space.getNumDomainVars(), 1u);
95127780e5SGroverkss
96127780e5SGroverkss // Remove 1 symbol and 1 range identifier.
97d95140a5SGroverkss space.removeVarRange(VarKind::Symbol, 0, 1);
98d95140a5SGroverkss space.removeVarRange(VarKind::Range, 0, 1);
99d95140a5SGroverkss EXPECT_EQ(space.getNumDomainVars(), 1u);
100d95140a5SGroverkss EXPECT_EQ(space.getNumRangeVars(), 0u);
101d95140a5SGroverkss EXPECT_EQ(space.getNumSymbolVars(), 2u);
102127780e5SGroverkss
103ed3b040bSGroverkss // Check if domain identifiers are attached properly.
104d222b690SGroverkss EXPECT_EQ(space.getId(VarKind::Domain, 0), Identifier(&identifiers[1]));
105127780e5SGroverkss
106ed3b040bSGroverkss // Check if symbol identifiers are attached properly.
107d222b690SGroverkss EXPECT_EQ(space.getId(VarKind::Range, 0), Identifier(&identifiers[4]));
108d222b690SGroverkss EXPECT_EQ(space.getId(VarKind::Range, 1), Identifier(&identifiers[5]));
109d222b690SGroverkss }
110d222b690SGroverkss
TEST(PresburgerSpaceTest,IdentifierIsEqual)111b8e4053cSBharathi Ramana Joshi TEST(PresburgerSpaceTest, IdentifierIsEqual) {
112b8e4053cSBharathi Ramana Joshi PresburgerSpace space = PresburgerSpace::getRelationSpace(1, 2, 0, 0);
113b8e4053cSBharathi Ramana Joshi
114b8e4053cSBharathi Ramana Joshi int identifiers[2] = {0, 1};
115*24da7fa0SBharathi Ramana Joshi space.setId(VarKind::Domain, 0, Identifier(&identifiers[0]));
116*24da7fa0SBharathi Ramana Joshi space.setId(VarKind::Range, 0, Identifier(&identifiers[0]));
117*24da7fa0SBharathi Ramana Joshi space.setId(VarKind::Range, 1, Identifier(&identifiers[1]));
118b8e4053cSBharathi Ramana Joshi
119b8e4053cSBharathi Ramana Joshi EXPECT_EQ(space.getId(VarKind::Domain, 0), space.getId(VarKind::Range, 0));
120b8e4053cSBharathi Ramana Joshi EXPECT_FALSE(
121b8e4053cSBharathi Ramana Joshi space.getId(VarKind::Range, 0).isEqual(space.getId(VarKind::Range, 1)));
122b8e4053cSBharathi Ramana Joshi }
123b8e4053cSBharathi Ramana Joshi
TEST(PresburgerSpaceTest,convertVarKind)124d222b690SGroverkss TEST(PresburgerSpaceTest, convertVarKind) {
125d222b690SGroverkss PresburgerSpace space = PresburgerSpace::getRelationSpace(2, 2, 0, 0);
126d222b690SGroverkss
127d222b690SGroverkss // Attach identifiers.
128d222b690SGroverkss int identifiers[4] = {0, 1, 2, 3};
129*24da7fa0SBharathi Ramana Joshi space.setId(VarKind::Domain, 0, Identifier(&identifiers[0]));
130*24da7fa0SBharathi Ramana Joshi space.setId(VarKind::Domain, 1, Identifier(&identifiers[1]));
131*24da7fa0SBharathi Ramana Joshi space.setId(VarKind::Range, 0, Identifier(&identifiers[2]));
132*24da7fa0SBharathi Ramana Joshi space.setId(VarKind::Range, 1, Identifier(&identifiers[3]));
133d222b690SGroverkss
134d222b690SGroverkss // Convert Range variables to symbols.
135d222b690SGroverkss space.convertVarKind(VarKind::Range, 0, 2, VarKind::Symbol, 0);
136d222b690SGroverkss
137d222b690SGroverkss // Check if the identifiers are moved to symbols.
138d222b690SGroverkss EXPECT_EQ(space.getId(VarKind::Symbol, 0), Identifier(&identifiers[2]));
139d222b690SGroverkss EXPECT_EQ(space.getId(VarKind::Symbol, 1), Identifier(&identifiers[3]));
140d222b690SGroverkss
141d222b690SGroverkss // Convert 1 symbol to range identifier.
142d222b690SGroverkss space.convertVarKind(VarKind::Symbol, 1, 1, VarKind::Range, 0);
143d222b690SGroverkss
144d222b690SGroverkss // Check if the identifier is moved to range.
145d222b690SGroverkss EXPECT_EQ(space.getId(VarKind::Range, 0), Identifier(&identifiers[3]));
146d222b690SGroverkss }
147d222b690SGroverkss
TEST(PresburgerSpaceTest,convertVarKindLocals)148d222b690SGroverkss TEST(PresburgerSpaceTest, convertVarKindLocals) {
149d222b690SGroverkss PresburgerSpace space = PresburgerSpace::getRelationSpace(2, 2, 0, 0);
150d222b690SGroverkss
151d222b690SGroverkss // Attach identifiers to range variables.
152d222b690SGroverkss int identifiers[4] = {0, 1};
153*24da7fa0SBharathi Ramana Joshi space.setId(VarKind::Range, 0, Identifier(&identifiers[0]));
154*24da7fa0SBharathi Ramana Joshi space.setId(VarKind::Range, 1, Identifier(&identifiers[1]));
155d222b690SGroverkss
156d222b690SGroverkss // Convert Range variables to locals i.e. project them out.
157d222b690SGroverkss space.convertVarKind(VarKind::Range, 0, 2, VarKind::Local, 0);
158d222b690SGroverkss
159d222b690SGroverkss // Check if the variables were moved.
160d222b690SGroverkss EXPECT_EQ(space.getNumVarKind(VarKind::Range), 0u);
161d222b690SGroverkss EXPECT_EQ(space.getNumVarKind(VarKind::Local), 2u);
162d222b690SGroverkss
163d222b690SGroverkss // Convert the Local variables back to Range variables.
164d222b690SGroverkss space.convertVarKind(VarKind::Local, 0, 2, VarKind::Range, 0);
165d222b690SGroverkss
166d222b690SGroverkss // The identifier information should be lost.
167d222b690SGroverkss EXPECT_FALSE(space.getId(VarKind::Range, 0).hasValue());
168d222b690SGroverkss EXPECT_FALSE(space.getId(VarKind::Range, 1).hasValue());
169127780e5SGroverkss }
1707ce800baSKunwar Grover
TEST(PresburgerSpaceTest,convertVarKind2)1717ce800baSKunwar Grover TEST(PresburgerSpaceTest, convertVarKind2) {
1727ce800baSKunwar Grover PresburgerSpace space = PresburgerSpace::getRelationSpace(0, 2, 2, 0);
1737ce800baSKunwar Grover
1747ce800baSKunwar Grover // Attach identifiers.
1757ce800baSKunwar Grover int identifiers[4] = {0, 1, 2, 3};
176*24da7fa0SBharathi Ramana Joshi space.setId(VarKind::Range, 0, Identifier(&identifiers[0]));
177*24da7fa0SBharathi Ramana Joshi space.setId(VarKind::Range, 1, Identifier(&identifiers[1]));
178*24da7fa0SBharathi Ramana Joshi space.setId(VarKind::Symbol, 0, Identifier(&identifiers[2]));
179*24da7fa0SBharathi Ramana Joshi space.setId(VarKind::Symbol, 1, Identifier(&identifiers[3]));
1807ce800baSKunwar Grover
1817ce800baSKunwar Grover // Convert Range variables to symbols.
1827ce800baSKunwar Grover space.convertVarKind(VarKind::Range, 0, 2, VarKind::Symbol, 1);
1837ce800baSKunwar Grover
1847ce800baSKunwar Grover // Check if the identifiers are moved to symbols.
1857ce800baSKunwar Grover EXPECT_EQ(space.getId(VarKind::Symbol, 0), Identifier(&identifiers[2]));
1867ce800baSKunwar Grover EXPECT_EQ(space.getId(VarKind::Symbol, 1), Identifier(&identifiers[0]));
1877ce800baSKunwar Grover EXPECT_EQ(space.getId(VarKind::Symbol, 2), Identifier(&identifiers[1]));
1887ce800baSKunwar Grover EXPECT_EQ(space.getId(VarKind::Symbol, 3), Identifier(&identifiers[3]));
1897ce800baSKunwar Grover }
190ff804146SBharathi Ramana Joshi
TEST(PresburgerSpaceTest,mergeAndAlignSymbols)191ff804146SBharathi Ramana Joshi TEST(PresburgerSpaceTest, mergeAndAlignSymbols) {
192ff804146SBharathi Ramana Joshi PresburgerSpace space = PresburgerSpace::getRelationSpace(3, 3, 2, 0);
193ff804146SBharathi Ramana Joshi
194ff804146SBharathi Ramana Joshi PresburgerSpace otherSpace = PresburgerSpace::getRelationSpace(3, 2, 3, 0);
195ff804146SBharathi Ramana Joshi
196ff804146SBharathi Ramana Joshi // Attach identifiers.
197ff804146SBharathi Ramana Joshi int identifiers[7] = {0, 1, 2, 3, 4, 5, 6};
198ff804146SBharathi Ramana Joshi int otherIdentifiers[8] = {10, 11, 12, 13, 14, 15, 16, 17};
199ff804146SBharathi Ramana Joshi
200*24da7fa0SBharathi Ramana Joshi space.setId(VarKind::Domain, 0, Identifier(&identifiers[0]));
201*24da7fa0SBharathi Ramana Joshi space.setId(VarKind::Domain, 1, Identifier(&identifiers[1]));
202ff804146SBharathi Ramana Joshi // Note the common identifier.
203*24da7fa0SBharathi Ramana Joshi space.setId(VarKind::Domain, 2, Identifier(&otherIdentifiers[2]));
204*24da7fa0SBharathi Ramana Joshi space.setId(VarKind::Range, 0, Identifier(&identifiers[2]));
205*24da7fa0SBharathi Ramana Joshi space.setId(VarKind::Range, 1, Identifier(&identifiers[3]));
206*24da7fa0SBharathi Ramana Joshi space.setId(VarKind::Range, 2, Identifier(&identifiers[4]));
207*24da7fa0SBharathi Ramana Joshi space.setId(VarKind::Symbol, 0, Identifier(&identifiers[5]));
208*24da7fa0SBharathi Ramana Joshi space.setId(VarKind::Symbol, 1, Identifier(&identifiers[6]));
209ff804146SBharathi Ramana Joshi
210*24da7fa0SBharathi Ramana Joshi otherSpace.setId(VarKind::Domain, 0, Identifier(&otherIdentifiers[0]));
211*24da7fa0SBharathi Ramana Joshi otherSpace.setId(VarKind::Domain, 1, Identifier(&otherIdentifiers[1]));
212*24da7fa0SBharathi Ramana Joshi otherSpace.setId(VarKind::Domain, 2, Identifier(&otherIdentifiers[2]));
213*24da7fa0SBharathi Ramana Joshi otherSpace.setId(VarKind::Range, 0, Identifier(&otherIdentifiers[3]));
214*24da7fa0SBharathi Ramana Joshi otherSpace.setId(VarKind::Range, 1, Identifier(&otherIdentifiers[4]));
215ff804146SBharathi Ramana Joshi // Note the common identifier.
216*24da7fa0SBharathi Ramana Joshi otherSpace.setId(VarKind::Symbol, 0, Identifier(&identifiers[6]));
217*24da7fa0SBharathi Ramana Joshi otherSpace.setId(VarKind::Symbol, 1, Identifier(&otherIdentifiers[5]));
218*24da7fa0SBharathi Ramana Joshi otherSpace.setId(VarKind::Symbol, 2, Identifier(&otherIdentifiers[7]));
219ff804146SBharathi Ramana Joshi
220ff804146SBharathi Ramana Joshi space.mergeAndAlignSymbols(otherSpace);
221ff804146SBharathi Ramana Joshi
222ff804146SBharathi Ramana Joshi // Check if merge & align is successful.
223ff804146SBharathi Ramana Joshi // Check symbol var identifiers.
224ff804146SBharathi Ramana Joshi EXPECT_EQ(4u, space.getNumSymbolVars());
225ff804146SBharathi Ramana Joshi EXPECT_EQ(4u, otherSpace.getNumSymbolVars());
226ff804146SBharathi Ramana Joshi EXPECT_EQ(space.getId(VarKind::Symbol, 0), Identifier(&identifiers[5]));
227ff804146SBharathi Ramana Joshi EXPECT_EQ(space.getId(VarKind::Symbol, 1), Identifier(&identifiers[6]));
228ff804146SBharathi Ramana Joshi EXPECT_EQ(space.getId(VarKind::Symbol, 2), Identifier(&otherIdentifiers[5]));
229ff804146SBharathi Ramana Joshi EXPECT_EQ(space.getId(VarKind::Symbol, 3), Identifier(&otherIdentifiers[7]));
230ff804146SBharathi Ramana Joshi EXPECT_EQ(otherSpace.getId(VarKind::Symbol, 0), Identifier(&identifiers[5]));
231ff804146SBharathi Ramana Joshi EXPECT_EQ(otherSpace.getId(VarKind::Symbol, 1), Identifier(&identifiers[6]));
232ff804146SBharathi Ramana Joshi EXPECT_EQ(otherSpace.getId(VarKind::Symbol, 2),
233ff804146SBharathi Ramana Joshi Identifier(&otherIdentifiers[5]));
234ff804146SBharathi Ramana Joshi EXPECT_EQ(otherSpace.getId(VarKind::Symbol, 3),
235ff804146SBharathi Ramana Joshi Identifier(&otherIdentifiers[7]));
236ff804146SBharathi Ramana Joshi // Check that domain and range var identifiers are not affected.
237ff804146SBharathi Ramana Joshi EXPECT_EQ(3u, space.getNumDomainVars());
238ff804146SBharathi Ramana Joshi EXPECT_EQ(3u, space.getNumRangeVars());
239ff804146SBharathi Ramana Joshi EXPECT_EQ(space.getId(VarKind::Domain, 0), Identifier(&identifiers[0]));
240ff804146SBharathi Ramana Joshi EXPECT_EQ(space.getId(VarKind::Domain, 1), Identifier(&identifiers[1]));
241ff804146SBharathi Ramana Joshi EXPECT_EQ(space.getId(VarKind::Domain, 2), Identifier(&otherIdentifiers[2]));
242ff804146SBharathi Ramana Joshi EXPECT_EQ(space.getId(VarKind::Range, 0), Identifier(&identifiers[2]));
243ff804146SBharathi Ramana Joshi EXPECT_EQ(space.getId(VarKind::Range, 1), Identifier(&identifiers[3]));
244ff804146SBharathi Ramana Joshi EXPECT_EQ(space.getId(VarKind::Range, 2), Identifier(&identifiers[4]));
245ff804146SBharathi Ramana Joshi EXPECT_EQ(3u, otherSpace.getNumDomainVars());
246ff804146SBharathi Ramana Joshi EXPECT_EQ(2u, otherSpace.getNumRangeVars());
247ff804146SBharathi Ramana Joshi EXPECT_EQ(otherSpace.getId(VarKind::Domain, 0),
248ff804146SBharathi Ramana Joshi Identifier(&otherIdentifiers[0]));
249ff804146SBharathi Ramana Joshi EXPECT_EQ(otherSpace.getId(VarKind::Domain, 1),
250ff804146SBharathi Ramana Joshi Identifier(&otherIdentifiers[1]));
251ff804146SBharathi Ramana Joshi EXPECT_EQ(otherSpace.getId(VarKind::Domain, 2),
252ff804146SBharathi Ramana Joshi Identifier(&otherIdentifiers[2]));
253ff804146SBharathi Ramana Joshi EXPECT_EQ(otherSpace.getId(VarKind::Range, 0),
254ff804146SBharathi Ramana Joshi Identifier(&otherIdentifiers[3]));
255ff804146SBharathi Ramana Joshi EXPECT_EQ(otherSpace.getId(VarKind::Range, 1),
256ff804146SBharathi Ramana Joshi Identifier(&otherIdentifiers[4]));
257ff804146SBharathi Ramana Joshi }
258