@@ -94,4 +94,116 @@ TEST_F(ConstantRangeListTest, Insert) {
94
94
EXPECT_TRUE (CRL == Expected);
95
95
}
96
96
97
+ ConstantRangeList GetCRL (ArrayRef<std::pair<APInt, APInt>> Pairs) {
98
+ SmallVector<ConstantRange, 2 > Ranges;
99
+ for (auto &[Start, End] : Pairs)
100
+ Ranges.push_back (ConstantRange (Start, End));
101
+ return ConstantRangeList (Ranges);
102
+ }
103
+
104
+ TEST_F (ConstantRangeListTest, Union) {
105
+ APInt APN4 = APInt (64 , -4 , /* isSigned=*/ true );
106
+ APInt APN2 = APInt (64 , -2 , /* isSigned=*/ true );
107
+ APInt AP0 = APInt (64 , 0 , /* isSigned=*/ true );
108
+ APInt AP2 = APInt (64 , 2 , /* isSigned=*/ true );
109
+ APInt AP4 = APInt (64 , 4 , /* isSigned=*/ true );
110
+ APInt AP6 = APInt (64 , 6 , /* isSigned=*/ true );
111
+ APInt AP7 = APInt (64 , 7 , /* isSigned=*/ true );
112
+ APInt AP8 = APInt (64 , 8 , /* isSigned=*/ true );
113
+ APInt AP10 = APInt (64 , 10 , /* isSigned=*/ true );
114
+ APInt AP11 = APInt (64 , 11 , /* isSigned=*/ true );
115
+ APInt AP12 = APInt (64 , 12 , /* isSigned=*/ true );
116
+ APInt AP16 = APInt (64 , 16 , /* isSigned=*/ true );
117
+ APInt AP18 = APInt (64 , 18 , /* isSigned=*/ true );
118
+ ConstantRangeList CRL = GetCRL ({{AP0, AP4}, {AP8, AP12}});
119
+
120
+ // Union with a subset.
121
+ ConstantRangeList Empty;
122
+ EXPECT_EQ (CRL.unionWith (Empty), CRL);
123
+ EXPECT_EQ (Empty.unionWith (CRL), CRL);
124
+
125
+ EXPECT_EQ (CRL.unionWith (GetCRL ({{AP0, AP2}})), CRL);
126
+ EXPECT_EQ (CRL.unionWith (GetCRL ({{AP10, AP12}})), CRL);
127
+
128
+ EXPECT_EQ (CRL.unionWith (GetCRL ({{AP0, AP2}, {AP8, AP10}})), CRL);
129
+ EXPECT_EQ (CRL.unionWith (GetCRL ({{AP0, AP2}, {AP10, AP12}})), CRL);
130
+ EXPECT_EQ (CRL.unionWith (GetCRL ({{AP2, AP4}, {AP8, AP10}})), CRL);
131
+ EXPECT_EQ (CRL.unionWith (GetCRL ({{AP2, AP4}, {AP10, AP12}})), CRL);
132
+
133
+ EXPECT_EQ (CRL.unionWith (GetCRL ({{AP0, AP4}, {AP8, AP10}, {AP11, AP12}})),
134
+ CRL);
135
+
136
+ EXPECT_EQ (CRL.unionWith (CRL), CRL);
137
+
138
+ // Union with new ranges.
139
+ EXPECT_EQ (CRL.unionWith (GetCRL ({{APN4, APN2}})),
140
+ GetCRL ({{APN4, APN2}, {AP0, AP4}, {AP8, AP12}}));
141
+ EXPECT_EQ (CRL.unionWith (GetCRL ({{AP6, AP7}})),
142
+ GetCRL ({{AP0, AP4}, {AP6, AP7}, {AP8, AP12}}));
143
+ EXPECT_EQ (CRL.unionWith (GetCRL ({{AP16, AP18}})),
144
+ GetCRL ({{AP0, AP4}, {AP8, AP12}, {AP16, AP18}}));
145
+
146
+ EXPECT_EQ (CRL.unionWith (GetCRL ({{APN2, AP2}})),
147
+ GetCRL ({{APN2, AP4}, {AP8, AP12}}));
148
+ EXPECT_EQ (CRL.unionWith (GetCRL ({{AP2, AP6}})),
149
+ GetCRL ({{AP0, AP6}, {AP8, AP12}}));
150
+ EXPECT_EQ (CRL.unionWith (GetCRL ({{AP10, AP16}})),
151
+ GetCRL ({{AP0, AP4}, {AP8, AP16}}));
152
+
153
+ EXPECT_EQ (CRL.unionWith (GetCRL ({{APN2, AP10}})), GetCRL ({{APN2, AP12}}));
154
+ EXPECT_EQ (CRL.unionWith (GetCRL ({{AP2, AP10}})), GetCRL ({{AP0, AP12}}));
155
+ EXPECT_EQ (CRL.unionWith (GetCRL ({{AP4, AP16}})), GetCRL ({{AP0, AP16}}));
156
+ EXPECT_EQ (CRL.unionWith (GetCRL ({{APN2, AP16}})), GetCRL ({{APN2, AP16}}));
157
+ }
158
+
159
+ TEST_F (ConstantRangeListTest, Intersect) {
160
+ APInt APN2 = APInt (64 , -2 , /* isSigned=*/ true );
161
+ APInt AP0 = APInt (64 , 0 , /* isSigned=*/ true );
162
+ APInt AP2 = APInt (64 , 2 , /* isSigned=*/ true );
163
+ APInt AP4 = APInt (64 , 4 , /* isSigned=*/ true );
164
+ APInt AP6 = APInt (64 , 6 , /* isSigned=*/ true );
165
+ APInt AP7 = APInt (64 , 7 , /* isSigned=*/ true );
166
+ APInt AP8 = APInt (64 , 8 , /* isSigned=*/ true );
167
+ APInt AP10 = APInt (64 , 10 , /* isSigned=*/ true );
168
+ APInt AP11 = APInt (64 , 11 , /* isSigned=*/ true );
169
+ APInt AP12 = APInt (64 , 12 , /* isSigned=*/ true );
170
+ APInt AP16 = APInt (64 , 16 , /* isSigned=*/ true );
171
+ ConstantRangeList CRL = GetCRL ({{AP0, AP4}, {AP8, AP12}});
172
+
173
+ // No intersection.
174
+ ConstantRangeList Empty;
175
+ EXPECT_EQ (CRL.intersectWith (Empty), Empty);
176
+ EXPECT_EQ (Empty.intersectWith (CRL), Empty);
177
+
178
+ EXPECT_EQ (CRL.intersectWith (GetCRL ({{APN2, AP0}})), Empty);
179
+ EXPECT_EQ (CRL.intersectWith (GetCRL ({{AP6, AP8}})), Empty);
180
+ EXPECT_EQ (CRL.intersectWith (GetCRL ({{AP12, AP16}})), Empty);
181
+
182
+ // Single intersect range.
183
+ EXPECT_EQ (CRL.intersectWith (GetCRL ({{APN2, AP2}})), GetCRL ({{AP0, AP2}}));
184
+ EXPECT_EQ (CRL.intersectWith (GetCRL ({{APN2, AP6}})), GetCRL ({{AP0, AP4}}));
185
+ EXPECT_EQ (CRL.intersectWith (GetCRL ({{AP2, AP4}})), GetCRL ({{AP2, AP4}}));
186
+ EXPECT_EQ (CRL.intersectWith (GetCRL ({{AP2, AP6}})), GetCRL ({{AP2, AP4}}));
187
+ EXPECT_EQ (CRL.intersectWith (GetCRL ({{AP6, AP10}})), GetCRL ({{AP8, AP10}}));
188
+ EXPECT_EQ (CRL.intersectWith (GetCRL ({{AP6, AP16}})), GetCRL ({{AP8, AP12}}));
189
+ EXPECT_EQ (CRL.intersectWith (GetCRL ({{AP10, AP12}})), GetCRL ({{AP10, AP12}}));
190
+ EXPECT_EQ (CRL.intersectWith (GetCRL ({{AP10, AP16}})), GetCRL ({{AP10, AP12}}));
191
+
192
+ // Multiple intersect ranges.
193
+ EXPECT_EQ (CRL.intersectWith (GetCRL ({{APN2, AP10}})),
194
+ GetCRL ({{AP0, AP4}, {AP8, AP10}}));
195
+ EXPECT_EQ (CRL.intersectWith (GetCRL ({{APN2, AP16}})), CRL);
196
+ EXPECT_EQ (CRL.intersectWith (GetCRL ({{AP2, AP10}})),
197
+ GetCRL ({{AP2, AP4}, {AP8, AP10}}));
198
+ EXPECT_EQ (CRL.intersectWith (GetCRL ({{AP2, AP16}})),
199
+ GetCRL ({{AP2, AP4}, {AP8, AP12}}));
200
+ EXPECT_EQ (CRL.intersectWith (GetCRL ({{APN2, AP2}, {AP6, AP10}})),
201
+ GetCRL ({{AP0, AP2}, {AP8, AP10}}));
202
+ EXPECT_EQ (CRL.intersectWith (GetCRL ({{AP2, AP6}, {AP10, AP16}})),
203
+ GetCRL ({{AP2, AP4}, {AP10, AP12}}));
204
+ EXPECT_EQ (CRL.intersectWith (GetCRL ({{APN2, AP2}, {AP7, AP10}, {AP11, AP16}})),
205
+ GetCRL ({{AP0, AP2}, {AP8, AP10}, {AP11, AP12}}));
206
+ EXPECT_EQ (CRL.intersectWith (CRL), CRL);
207
+ }
208
+
97
209
} // anonymous namespace
0 commit comments