@@ -45,6 +45,18 @@ static bool parseAndCompare(StringRef str, const IntegerPolyhedron &ex) {
45
45
}
46
46
47
47
TEST (ParseFACTest, ParseAndCompareTest) {
48
+ // constant-fold addition
49
+ EXPECT_TRUE (parseAndCompare (" () : (4 + 3 >= 0)" ,
50
+ makeFACFromConstraints (0 , 0 , {}, {})));
51
+
52
+ // constant-fold addition + multiplication
53
+ EXPECT_TRUE (parseAndCompare (" ()[a] : (4 * 3 == 10 + 2)" ,
54
+ makeFACFromConstraints (0 , 1 , {}, {})));
55
+
56
+ // constant-fold ceildiv + floordiv
57
+ EXPECT_TRUE (parseAndCompare (" (x) : (11 ceildiv 3 == 13 floordiv 3)" ,
58
+ makeFACFromConstraints (1 , 0 , {}, {})));
59
+
48
60
// simple ineq
49
61
EXPECT_TRUE (parseAndCompare (" (x)[] : (x >= 0)" ,
50
62
makeFACFromConstraints (1 , 0 , {{1 , 0 }})));
@@ -57,6 +69,11 @@ TEST(ParseFACTest, ParseAndCompareTest) {
57
69
EXPECT_TRUE (parseAndCompare (" (x)[] : (7 * x >= 0, -7 * x + 5 >= 0)" ,
58
70
makeFACFromConstraints (1 , 0 , {{7 , 0 }, {-7 , 5 }})));
59
71
72
+ // multiplication distribution
73
+ EXPECT_TRUE (
74
+ parseAndCompare (" (x) : (2 * x >= 2, (-7 + x * 9) * 5 >= 0)" ,
75
+ makeFACFromConstraints (1 , 0 , {{2 , -2 }, {45 , -35 }})));
76
+
60
77
// multiple dimensions
61
78
EXPECT_TRUE (parseAndCompare (" (x,y,z)[] : (x + y - z >= 0)" ,
62
79
makeFACFromConstraints (3 , 0 , {{1 , 1 , -1 , 0 }})));
@@ -70,20 +87,61 @@ TEST(ParseFACTest, ParseAndCompareTest) {
70
87
EXPECT_TRUE (parseAndCompare (" ()[a] : (2 * a - 4 == 0)" ,
71
88
makeFACFromConstraints (0 , 1 , {}, {{2 , -4 }})));
72
89
90
+ // no linear terms
91
+ EXPECT_TRUE (parseAndCompare (
92
+ " (x, y) : (26 * (x floordiv 6) == y floordiv 3)" ,
93
+ makeFACFromConstraints (2 , 0 , {}, {{0 , 0 , 26 , -1 , 0 }},
94
+ {{{1 , 0 , 0 }, 6 }, {{0 , 1 , 0 , 0 }, 3 }})));
95
+
73
96
// simple floordiv
74
97
EXPECT_TRUE (parseAndCompare (
75
98
" (x, y) : (y - 3 * ((x + y - 13) floordiv 3) - 42 == 0)" ,
76
99
makeFACFromConstraints (2 , 0 , {}, {{0 , 1 , -3 , -42 }}, {{{1 , 1 , -13 }, 3 }})));
77
100
101
+ // simple ceildiv
102
+ EXPECT_TRUE (parseAndCompare (
103
+ " (x, y) : (y - 3 * ((x + y - 13) ceildiv 3) - 42 == 0)" ,
104
+ makeFACFromConstraints (2 , 0 , {}, {{0 , 1 , -3 , -42 }}, {{{1 , 1 , -11 }, 3 }})));
105
+
106
+ // simple mod
107
+ EXPECT_TRUE (parseAndCompare (
108
+ " (x, y) : (y - 3 * ((x + y - 13) mod 3) - 42 == 0)" ,
109
+ makeFACFromConstraints (2 , 0 , {}, {{-3 , -2 , 9 , -3 }}, {{{1 , 1 , -13 }, 3 }})));
110
+
78
111
// multiple floordiv
79
112
EXPECT_TRUE (parseAndCompare (
80
113
" (x, y) : (y - x floordiv 3 - y floordiv 2 == 0)" ,
81
114
makeFACFromConstraints (2 , 0 , {}, {{0 , 1 , -1 , -1 , 0 }},
82
115
{{{1 , 0 , 0 }, 3 }, {{0 , 1 , 0 , 0 }, 2 }})));
83
116
117
+ // multiple ceildiv
118
+ EXPECT_TRUE (parseAndCompare (
119
+ " (x, y) : (y - x ceildiv 3 - y ceildiv 2 == 0)" ,
120
+ makeFACFromConstraints (2 , 0 , {}, {{0 , 1 , -1 , -1 , 0 }},
121
+ {{{1 , 0 , 2 }, 3 }, {{0 , 1 , 0 , 1 }, 2 }})));
122
+
123
+ // multiple mod
124
+ EXPECT_TRUE (parseAndCompare (
125
+ " (x, y) : (y - x mod 3 - y mod 2 == 0)" ,
126
+ makeFACFromConstraints (2 , 0 , {}, {{-1 , 0 , 3 , 2 , 0 }},
127
+ {{{1 , 0 , 0 }, 3 }, {{0 , 1 , 0 , 0 }, 2 }})));
128
+
84
129
// nested floordiv
85
130
EXPECT_TRUE (parseAndCompare (
86
131
" (x, y) : (y - (x + y floordiv 2) floordiv 3 == 0)" ,
87
132
makeFACFromConstraints (2 , 0 , {}, {{0 , 1 , 0 , -1 , 0 }},
88
133
{{{0 , 1 , 0 }, 2 }, {{1 , 0 , 1 , 0 }, 3 }})));
134
+
135
+ // nested mod
136
+ EXPECT_TRUE (parseAndCompare (
137
+ " (x, y) : (y - (x + y mod 2) mod 3 == 0)" ,
138
+ makeFACFromConstraints (2 , 0 , {}, {{-1 , 0 , 2 , 3 , 0 }},
139
+ {{{0 , 1 , 0 }, 2 }, {{1 , 1 , -2 , 0 }, 3 }})));
140
+
141
+ // nested floordiv + ceildiv + mod
142
+ EXPECT_TRUE (parseAndCompare (
143
+ " (x, y) : ((2 * x + 3 * (y floordiv 2) + x mod 7 + 1) ceildiv 3 == 42)" ,
144
+ makeFACFromConstraints (
145
+ 2 , 0 , {}, {{0 , 0 , 0 , 0 , 1 , -42 }},
146
+ {{{0 , 1 , 0 }, 2 }, {{1 , 0 , 0 , 0 }, 7 }, {{3 , 0 , 3 , -7 , 3 }, 3 }})));
89
147
}
0 commit comments