@@ -94,4 +94,116 @@ TEST_F(ConstantRangeListTest, Insert) {
9494 EXPECT_TRUE (CRL == Expected);
9595}
9696
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+
97209} // anonymous namespace
0 commit comments