1 //===- ConstantRangeTest.cpp - ConstantRange tests ------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include "llvm/IR/ConstantRange.h"
11 #include "llvm/IR/Instructions.h"
12 #include "llvm/IR/Operator.h"
13 #include "gtest/gtest.h"
14 
15 using namespace llvm;
16 
17 namespace {
18 
19 class ConstantRangeTest : public ::testing::Test {
20 protected:
21   static ConstantRange Full;
22   static ConstantRange Empty;
23   static ConstantRange One;
24   static ConstantRange Some;
25   static ConstantRange Wrap;
26 };
27 
28 ConstantRange ConstantRangeTest::Full(16);
29 ConstantRange ConstantRangeTest::Empty(16, false);
30 ConstantRange ConstantRangeTest::One(APInt(16, 0xa));
31 ConstantRange ConstantRangeTest::Some(APInt(16, 0xa), APInt(16, 0xaaa));
32 ConstantRange ConstantRangeTest::Wrap(APInt(16, 0xaaa), APInt(16, 0xa));
33 
34 TEST_F(ConstantRangeTest, Basics) {
35   EXPECT_TRUE(Full.isFullSet());
36   EXPECT_FALSE(Full.isEmptySet());
37   EXPECT_TRUE(Full.inverse().isEmptySet());
38   EXPECT_FALSE(Full.isWrappedSet());
39   EXPECT_TRUE(Full.contains(APInt(16, 0x0)));
40   EXPECT_TRUE(Full.contains(APInt(16, 0x9)));
41   EXPECT_TRUE(Full.contains(APInt(16, 0xa)));
42   EXPECT_TRUE(Full.contains(APInt(16, 0xaa9)));
43   EXPECT_TRUE(Full.contains(APInt(16, 0xaaa)));
44 
45   EXPECT_FALSE(Empty.isFullSet());
46   EXPECT_TRUE(Empty.isEmptySet());
47   EXPECT_TRUE(Empty.inverse().isFullSet());
48   EXPECT_FALSE(Empty.isWrappedSet());
49   EXPECT_FALSE(Empty.contains(APInt(16, 0x0)));
50   EXPECT_FALSE(Empty.contains(APInt(16, 0x9)));
51   EXPECT_FALSE(Empty.contains(APInt(16, 0xa)));
52   EXPECT_FALSE(Empty.contains(APInt(16, 0xaa9)));
53   EXPECT_FALSE(Empty.contains(APInt(16, 0xaaa)));
54 
55   EXPECT_FALSE(One.isFullSet());
56   EXPECT_FALSE(One.isEmptySet());
57   EXPECT_FALSE(One.isWrappedSet());
58   EXPECT_FALSE(One.contains(APInt(16, 0x0)));
59   EXPECT_FALSE(One.contains(APInt(16, 0x9)));
60   EXPECT_TRUE(One.contains(APInt(16, 0xa)));
61   EXPECT_FALSE(One.contains(APInt(16, 0xaa9)));
62   EXPECT_FALSE(One.contains(APInt(16, 0xaaa)));
63   EXPECT_FALSE(One.inverse().contains(APInt(16, 0xa)));
64 
65   EXPECT_FALSE(Some.isFullSet());
66   EXPECT_FALSE(Some.isEmptySet());
67   EXPECT_FALSE(Some.isWrappedSet());
68   EXPECT_FALSE(Some.contains(APInt(16, 0x0)));
69   EXPECT_FALSE(Some.contains(APInt(16, 0x9)));
70   EXPECT_TRUE(Some.contains(APInt(16, 0xa)));
71   EXPECT_TRUE(Some.contains(APInt(16, 0xaa9)));
72   EXPECT_FALSE(Some.contains(APInt(16, 0xaaa)));
73 
74   EXPECT_FALSE(Wrap.isFullSet());
75   EXPECT_FALSE(Wrap.isEmptySet());
76   EXPECT_TRUE(Wrap.isWrappedSet());
77   EXPECT_TRUE(Wrap.contains(APInt(16, 0x0)));
78   EXPECT_TRUE(Wrap.contains(APInt(16, 0x9)));
79   EXPECT_FALSE(Wrap.contains(APInt(16, 0xa)));
80   EXPECT_FALSE(Wrap.contains(APInt(16, 0xaa9)));
81   EXPECT_TRUE(Wrap.contains(APInt(16, 0xaaa)));
82 }
83 
84 TEST_F(ConstantRangeTest, Equality) {
85   EXPECT_EQ(Full, Full);
86   EXPECT_EQ(Empty, Empty);
87   EXPECT_EQ(One, One);
88   EXPECT_EQ(Some, Some);
89   EXPECT_EQ(Wrap, Wrap);
90   EXPECT_NE(Full, Empty);
91   EXPECT_NE(Full, One);
92   EXPECT_NE(Full, Some);
93   EXPECT_NE(Full, Wrap);
94   EXPECT_NE(Empty, One);
95   EXPECT_NE(Empty, Some);
96   EXPECT_NE(Empty, Wrap);
97   EXPECT_NE(One, Some);
98   EXPECT_NE(One, Wrap);
99   EXPECT_NE(Some, Wrap);
100 }
101 
102 TEST_F(ConstantRangeTest, SingleElement) {
103   EXPECT_EQ(Full.getSingleElement(), static_cast<APInt *>(nullptr));
104   EXPECT_EQ(Empty.getSingleElement(), static_cast<APInt *>(nullptr));
105   EXPECT_EQ(Full.getSingleMissingElement(), static_cast<APInt *>(nullptr));
106   EXPECT_EQ(Empty.getSingleMissingElement(), static_cast<APInt *>(nullptr));
107 
108   EXPECT_EQ(*One.getSingleElement(), APInt(16, 0xa));
109   EXPECT_EQ(Some.getSingleElement(), static_cast<APInt *>(nullptr));
110   EXPECT_EQ(Wrap.getSingleElement(), static_cast<APInt *>(nullptr));
111 
112   EXPECT_EQ(One.getSingleMissingElement(), static_cast<APInt *>(nullptr));
113   EXPECT_EQ(Some.getSingleMissingElement(), static_cast<APInt *>(nullptr));
114 
115   ConstantRange OneInverse = One.inverse();
116   EXPECT_EQ(*OneInverse.getSingleMissingElement(), *One.getSingleElement());
117 
118   EXPECT_FALSE(Full.isSingleElement());
119   EXPECT_FALSE(Empty.isSingleElement());
120   EXPECT_TRUE(One.isSingleElement());
121   EXPECT_FALSE(Some.isSingleElement());
122   EXPECT_FALSE(Wrap.isSingleElement());
123 }
124 
125 TEST_F(ConstantRangeTest, GetSetSize) {
126   EXPECT_EQ(Full.getSetSize(), APInt(17, 65536));
127   EXPECT_EQ(Empty.getSetSize(), APInt(17, 0));
128   EXPECT_EQ(One.getSetSize(), APInt(17, 1));
129   EXPECT_EQ(Some.getSetSize(), APInt(17, 0xaa0));
130 
131   ConstantRange Wrap(APInt(4, 7), APInt(4, 3));
132   ConstantRange Wrap2(APInt(4, 8), APInt(4, 7));
133   EXPECT_EQ(Wrap.getSetSize(), APInt(5, 12));
134   EXPECT_EQ(Wrap2.getSetSize(), APInt(5, 15));
135 }
136 
137 TEST_F(ConstantRangeTest, GetMinsAndMaxes) {
138   EXPECT_EQ(Full.getUnsignedMax(), APInt(16, UINT16_MAX));
139   EXPECT_EQ(One.getUnsignedMax(), APInt(16, 0xa));
140   EXPECT_EQ(Some.getUnsignedMax(), APInt(16, 0xaa9));
141   EXPECT_EQ(Wrap.getUnsignedMax(), APInt(16, UINT16_MAX));
142 
143   EXPECT_EQ(Full.getUnsignedMin(), APInt(16, 0));
144   EXPECT_EQ(One.getUnsignedMin(), APInt(16, 0xa));
145   EXPECT_EQ(Some.getUnsignedMin(), APInt(16, 0xa));
146   EXPECT_EQ(Wrap.getUnsignedMin(), APInt(16, 0));
147 
148   EXPECT_EQ(Full.getSignedMax(), APInt(16, INT16_MAX));
149   EXPECT_EQ(One.getSignedMax(), APInt(16, 0xa));
150   EXPECT_EQ(Some.getSignedMax(), APInt(16, 0xaa9));
151   EXPECT_EQ(Wrap.getSignedMax(), APInt(16, INT16_MAX));
152 
153   EXPECT_EQ(Full.getSignedMin(), APInt(16, (uint64_t)INT16_MIN));
154   EXPECT_EQ(One.getSignedMin(), APInt(16, 0xa));
155   EXPECT_EQ(Some.getSignedMin(), APInt(16, 0xa));
156   EXPECT_EQ(Wrap.getSignedMin(), APInt(16, (uint64_t)INT16_MIN));
157 
158   // Found by Klee
159   EXPECT_EQ(ConstantRange(APInt(4, 7), APInt(4, 0)).getSignedMax(),
160             APInt(4, 7));
161 }
162 
163 TEST_F(ConstantRangeTest, SignWrapped) {
164   EXPECT_TRUE(Full.isSignWrappedSet());
165   EXPECT_FALSE(Empty.isSignWrappedSet());
166   EXPECT_FALSE(One.isSignWrappedSet());
167   EXPECT_FALSE(Some.isSignWrappedSet());
168   EXPECT_TRUE(Wrap.isSignWrappedSet());
169 
170   EXPECT_FALSE(ConstantRange(APInt(8, 127), APInt(8, 128)).isSignWrappedSet());
171   EXPECT_TRUE(ConstantRange(APInt(8, 127), APInt(8, 129)).isSignWrappedSet());
172   EXPECT_FALSE(ConstantRange(APInt(8, 128), APInt(8, 129)).isSignWrappedSet());
173   EXPECT_TRUE(ConstantRange(APInt(8, 10), APInt(8, 9)).isSignWrappedSet());
174   EXPECT_TRUE(ConstantRange(APInt(8, 10), APInt(8, 250)).isSignWrappedSet());
175   EXPECT_FALSE(ConstantRange(APInt(8, 250), APInt(8, 10)).isSignWrappedSet());
176   EXPECT_FALSE(ConstantRange(APInt(8, 250), APInt(8, 251)).isSignWrappedSet());
177 }
178 
179 TEST_F(ConstantRangeTest, Trunc) {
180   ConstantRange TFull = Full.truncate(10);
181   ConstantRange TEmpty = Empty.truncate(10);
182   ConstantRange TOne = One.truncate(10);
183   ConstantRange TSome = Some.truncate(10);
184   ConstantRange TWrap = Wrap.truncate(10);
185   EXPECT_TRUE(TFull.isFullSet());
186   EXPECT_TRUE(TEmpty.isEmptySet());
187   EXPECT_EQ(TOne, ConstantRange(One.getLower().trunc(10),
188                                 One.getUpper().trunc(10)));
189   EXPECT_TRUE(TSome.isFullSet());
190   EXPECT_TRUE(TWrap.isFullSet());
191 
192   // trunc([2, 5), 3->2) = [2, 1)
193   ConstantRange TwoFive(APInt(3, 2), APInt(3, 5));
194   EXPECT_EQ(TwoFive.truncate(2), ConstantRange(APInt(2, 2), APInt(2, 1)));
195 
196   // trunc([2, 6), 3->2) = full
197   ConstantRange TwoSix(APInt(3, 2), APInt(3, 6));
198   EXPECT_TRUE(TwoSix.truncate(2).isFullSet());
199 
200   // trunc([5, 7), 3->2) = [1, 3)
201   ConstantRange FiveSeven(APInt(3, 5), APInt(3, 7));
202   EXPECT_EQ(FiveSeven.truncate(2), ConstantRange(APInt(2, 1), APInt(2, 3)));
203 
204   // trunc([7, 1), 3->2) = [3, 1)
205   ConstantRange SevenOne(APInt(3, 7), APInt(3, 1));
206   EXPECT_EQ(SevenOne.truncate(2), ConstantRange(APInt(2, 3), APInt(2, 1)));
207 }
208 
209 TEST_F(ConstantRangeTest, ZExt) {
210   ConstantRange ZFull = Full.zeroExtend(20);
211   ConstantRange ZEmpty = Empty.zeroExtend(20);
212   ConstantRange ZOne = One.zeroExtend(20);
213   ConstantRange ZSome = Some.zeroExtend(20);
214   ConstantRange ZWrap = Wrap.zeroExtend(20);
215   EXPECT_EQ(ZFull, ConstantRange(APInt(20, 0), APInt(20, 0x10000)));
216   EXPECT_TRUE(ZEmpty.isEmptySet());
217   EXPECT_EQ(ZOne, ConstantRange(One.getLower().zext(20),
218                                 One.getUpper().zext(20)));
219   EXPECT_EQ(ZSome, ConstantRange(Some.getLower().zext(20),
220                                  Some.getUpper().zext(20)));
221   EXPECT_EQ(ZWrap, ConstantRange(APInt(20, 0), APInt(20, 0x10000)));
222 
223   // zext([5, 0), 3->7) = [5, 8)
224   ConstantRange FiveZero(APInt(3, 5), APInt(3, 0));
225   EXPECT_EQ(FiveZero.zeroExtend(7), ConstantRange(APInt(7, 5), APInt(7, 8)));
226 }
227 
228 TEST_F(ConstantRangeTest, SExt) {
229   ConstantRange SFull = Full.signExtend(20);
230   ConstantRange SEmpty = Empty.signExtend(20);
231   ConstantRange SOne = One.signExtend(20);
232   ConstantRange SSome = Some.signExtend(20);
233   ConstantRange SWrap = Wrap.signExtend(20);
234   EXPECT_EQ(SFull, ConstantRange(APInt(20, (uint64_t)INT16_MIN, true),
235                                  APInt(20, INT16_MAX + 1, true)));
236   EXPECT_TRUE(SEmpty.isEmptySet());
237   EXPECT_EQ(SOne, ConstantRange(One.getLower().sext(20),
238                                 One.getUpper().sext(20)));
239   EXPECT_EQ(SSome, ConstantRange(Some.getLower().sext(20),
240                                  Some.getUpper().sext(20)));
241   EXPECT_EQ(SWrap, ConstantRange(APInt(20, (uint64_t)INT16_MIN, true),
242                                  APInt(20, INT16_MAX + 1, true)));
243 
244   EXPECT_EQ(ConstantRange(APInt(8, 120), APInt(8, 140)).signExtend(16),
245             ConstantRange(APInt(16, -128), APInt(16, 128)));
246 
247   EXPECT_EQ(ConstantRange(APInt(16, 0x0200), APInt(16, 0x8000)).signExtend(19),
248             ConstantRange(APInt(19, 0x0200), APInt(19, 0x8000)));
249 }
250 
251 TEST_F(ConstantRangeTest, IntersectWith) {
252   EXPECT_EQ(Empty.intersectWith(Full), Empty);
253   EXPECT_EQ(Empty.intersectWith(Empty), Empty);
254   EXPECT_EQ(Empty.intersectWith(One), Empty);
255   EXPECT_EQ(Empty.intersectWith(Some), Empty);
256   EXPECT_EQ(Empty.intersectWith(Wrap), Empty);
257   EXPECT_EQ(Full.intersectWith(Full), Full);
258   EXPECT_EQ(Some.intersectWith(Some), Some);
259   EXPECT_EQ(Some.intersectWith(One), One);
260   EXPECT_EQ(Full.intersectWith(One), One);
261   EXPECT_EQ(Full.intersectWith(Some), Some);
262   EXPECT_EQ(Some.intersectWith(Wrap), Empty);
263   EXPECT_EQ(One.intersectWith(Wrap), Empty);
264   EXPECT_EQ(One.intersectWith(Wrap), Wrap.intersectWith(One));
265 
266   // Klee generated testcase from PR4545.
267   // The intersection of i16 [4, 2) and [6, 5) is disjoint, looking like
268   // 01..4.6789ABCDEF where the dots represent values not in the intersection.
269   ConstantRange LHS(APInt(16, 4), APInt(16, 2));
270   ConstantRange RHS(APInt(16, 6), APInt(16, 5));
271   EXPECT_TRUE(LHS.intersectWith(RHS) == LHS);
272 
273   // previous bug: intersection of [min, 3) and [2, max) should be 2
274   LHS = ConstantRange(APInt(32, -2147483646), APInt(32, 3));
275   RHS = ConstantRange(APInt(32, 2), APInt(32, 2147483646));
276   EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 2)));
277 
278   // [2, 0) /\ [4, 3) = [2, 0)
279   LHS = ConstantRange(APInt(32, 2), APInt(32, 0));
280   RHS = ConstantRange(APInt(32, 4), APInt(32, 3));
281   EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 2), APInt(32, 0)));
282 
283   // [2, 0) /\ [4, 2) = [4, 0)
284   LHS = ConstantRange(APInt(32, 2), APInt(32, 0));
285   RHS = ConstantRange(APInt(32, 4), APInt(32, 2));
286   EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 4), APInt(32, 0)));
287 
288   // [4, 2) /\ [5, 1) = [5, 1)
289   LHS = ConstantRange(APInt(32, 4), APInt(32, 2));
290   RHS = ConstantRange(APInt(32, 5), APInt(32, 1));
291   EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 5), APInt(32, 1)));
292 
293   // [2, 0) /\ [7, 4) = [7, 4)
294   LHS = ConstantRange(APInt(32, 2), APInt(32, 0));
295   RHS = ConstantRange(APInt(32, 7), APInt(32, 4));
296   EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 7), APInt(32, 4)));
297 
298   // [4, 2) /\ [1, 0) = [1, 0)
299   LHS = ConstantRange(APInt(32, 4), APInt(32, 2));
300   RHS = ConstantRange(APInt(32, 1), APInt(32, 0));
301   EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 4), APInt(32, 2)));
302 
303   // [15, 0) /\ [7, 6) = [15, 0)
304   LHS = ConstantRange(APInt(32, 15), APInt(32, 0));
305   RHS = ConstantRange(APInt(32, 7), APInt(32, 6));
306   EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 15), APInt(32, 0)));
307 }
308 
309 TEST_F(ConstantRangeTest, UnionWith) {
310   EXPECT_EQ(Wrap.unionWith(One),
311             ConstantRange(APInt(16, 0xaaa), APInt(16, 0xb)));
312   EXPECT_EQ(One.unionWith(Wrap), Wrap.unionWith(One));
313   EXPECT_EQ(Empty.unionWith(Empty), Empty);
314   EXPECT_EQ(Full.unionWith(Full), Full);
315   EXPECT_EQ(Some.unionWith(Wrap), Full);
316 
317   // PR4545
318   EXPECT_EQ(ConstantRange(APInt(16, 14), APInt(16, 1)).unionWith(
319                                     ConstantRange(APInt(16, 0), APInt(16, 8))),
320             ConstantRange(APInt(16, 14), APInt(16, 8)));
321   EXPECT_EQ(ConstantRange(APInt(16, 6), APInt(16, 4)).unionWith(
322                                     ConstantRange(APInt(16, 4), APInt(16, 0))),
323               ConstantRange(16));
324   EXPECT_EQ(ConstantRange(APInt(16, 1), APInt(16, 0)).unionWith(
325                                     ConstantRange(APInt(16, 2), APInt(16, 1))),
326               ConstantRange(16));
327 }
328 
329 TEST_F(ConstantRangeTest, SetDifference) {
330   EXPECT_EQ(Full.difference(Empty), Full);
331   EXPECT_EQ(Full.difference(Full), Empty);
332   EXPECT_EQ(Empty.difference(Empty), Empty);
333   EXPECT_EQ(Empty.difference(Full), Empty);
334 
335   ConstantRange A(APInt(16, 3), APInt(16, 7));
336   ConstantRange B(APInt(16, 5), APInt(16, 9));
337   ConstantRange C(APInt(16, 3), APInt(16, 5));
338   ConstantRange D(APInt(16, 7), APInt(16, 9));
339   ConstantRange E(APInt(16, 5), APInt(16, 4));
340   ConstantRange F(APInt(16, 7), APInt(16, 3));
341   EXPECT_EQ(A.difference(B), C);
342   EXPECT_EQ(B.difference(A), D);
343   EXPECT_EQ(E.difference(A), F);
344 }
345 
346 TEST_F(ConstantRangeTest, SubtractAPInt) {
347   EXPECT_EQ(Full.subtract(APInt(16, 4)), Full);
348   EXPECT_EQ(Empty.subtract(APInt(16, 4)), Empty);
349   EXPECT_EQ(Some.subtract(APInt(16, 4)),
350             ConstantRange(APInt(16, 0x6), APInt(16, 0xaa6)));
351   EXPECT_EQ(Wrap.subtract(APInt(16, 4)),
352             ConstantRange(APInt(16, 0xaa6), APInt(16, 0x6)));
353   EXPECT_EQ(One.subtract(APInt(16, 4)),
354             ConstantRange(APInt(16, 0x6)));
355 }
356 
357 TEST_F(ConstantRangeTest, Add) {
358   EXPECT_EQ(Full.add(APInt(16, 4)), Full);
359   EXPECT_EQ(Full.add(Full), Full);
360   EXPECT_EQ(Full.add(Empty), Empty);
361   EXPECT_EQ(Full.add(One), Full);
362   EXPECT_EQ(Full.add(Some), Full);
363   EXPECT_EQ(Full.add(Wrap), Full);
364   EXPECT_EQ(Empty.add(Empty), Empty);
365   EXPECT_EQ(Empty.add(One), Empty);
366   EXPECT_EQ(Empty.add(Some), Empty);
367   EXPECT_EQ(Empty.add(Wrap), Empty);
368   EXPECT_EQ(Empty.add(APInt(16, 4)), Empty);
369   EXPECT_EQ(Some.add(APInt(16, 4)),
370             ConstantRange(APInt(16, 0xe), APInt(16, 0xaae)));
371   EXPECT_EQ(Wrap.add(APInt(16, 4)),
372             ConstantRange(APInt(16, 0xaae), APInt(16, 0xe)));
373   EXPECT_EQ(One.add(APInt(16, 4)),
374             ConstantRange(APInt(16, 0xe)));
375 }
376 
377 TEST_F(ConstantRangeTest, AddWithNoSignedWrap) {
378   EXPECT_EQ(Empty.addWithNoSignedWrap(APInt(16, 1)), Empty);
379   EXPECT_EQ(Full.addWithNoSignedWrap(APInt(16, 1)),
380             ConstantRange(APInt(16, INT16_MIN+1), APInt(16, INT16_MIN)));
381   EXPECT_EQ(ConstantRange(APInt(8, -50), APInt(8, 50)).addWithNoSignedWrap(APInt(8, 10)),
382             ConstantRange(APInt(8, -40), APInt(8, 60)));
383   EXPECT_EQ(ConstantRange(APInt(8, -50), APInt(8, 120)).addWithNoSignedWrap(APInt(8, 10)),
384             ConstantRange(APInt(8, -40), APInt(8, INT8_MIN)));
385   EXPECT_EQ(ConstantRange(APInt(8, 120), APInt(8, -10)).addWithNoSignedWrap(APInt(8, 5)),
386             ConstantRange(APInt(8, 125), APInt(8, -5)));
387   EXPECT_EQ(ConstantRange(APInt(8, 120), APInt(8, -120)).addWithNoSignedWrap(APInt(8, 10)),
388             ConstantRange(APInt(8, INT8_MIN+10), APInt(8, -110)));
389 
390   EXPECT_EQ(Empty.addWithNoSignedWrap(APInt(16, -1)), Empty);
391   EXPECT_EQ(Full.addWithNoSignedWrap(APInt(16, -1)),
392             ConstantRange(APInt(16, INT16_MIN), APInt(16, INT16_MAX)));
393   EXPECT_EQ(ConstantRange(APInt(8, -50), APInt(8, 50)).addWithNoSignedWrap(APInt(8, -10)),
394             ConstantRange(APInt(8, -60), APInt(8, 40)));
395   EXPECT_EQ(ConstantRange(APInt(8, -120), APInt(8, 50)).addWithNoSignedWrap(APInt(8, -10)),
396             ConstantRange(APInt(8, INT8_MIN), APInt(8, 40)));
397   EXPECT_EQ(ConstantRange(APInt(8, 120), APInt(8, -120)).addWithNoSignedWrap(APInt(8, -5)),
398             ConstantRange(APInt(8, 115), APInt(8, -125)));
399   EXPECT_EQ(ConstantRange(APInt(8, 120), APInt(8, -120)).addWithNoSignedWrap(APInt(8, -10)),
400             ConstantRange(APInt(8, 110), APInt(8, INT8_MIN-10)));
401 }
402 
403 TEST_F(ConstantRangeTest, Sub) {
404   EXPECT_EQ(Full.sub(APInt(16, 4)), Full);
405   EXPECT_EQ(Full.sub(Full), Full);
406   EXPECT_EQ(Full.sub(Empty), Empty);
407   EXPECT_EQ(Full.sub(One), Full);
408   EXPECT_EQ(Full.sub(Some), Full);
409   EXPECT_EQ(Full.sub(Wrap), Full);
410   EXPECT_EQ(Empty.sub(Empty), Empty);
411   EXPECT_EQ(Empty.sub(One), Empty);
412   EXPECT_EQ(Empty.sub(Some), Empty);
413   EXPECT_EQ(Empty.sub(Wrap), Empty);
414   EXPECT_EQ(Empty.sub(APInt(16, 4)), Empty);
415   EXPECT_EQ(Some.sub(APInt(16, 4)),
416             ConstantRange(APInt(16, 0x6), APInt(16, 0xaa6)));
417   EXPECT_EQ(Some.sub(Some),
418             ConstantRange(APInt(16, 0xf561), APInt(16, 0xaa0)));
419   EXPECT_EQ(Wrap.sub(APInt(16, 4)),
420             ConstantRange(APInt(16, 0xaa6), APInt(16, 0x6)));
421   EXPECT_EQ(One.sub(APInt(16, 4)),
422             ConstantRange(APInt(16, 0x6)));
423 }
424 
425 TEST_F(ConstantRangeTest, Multiply) {
426   EXPECT_EQ(Full.multiply(Full), Full);
427   EXPECT_EQ(Full.multiply(Empty), Empty);
428   EXPECT_EQ(Full.multiply(One), Full);
429   EXPECT_EQ(Full.multiply(Some), Full);
430   EXPECT_EQ(Full.multiply(Wrap), Full);
431   EXPECT_EQ(Empty.multiply(Empty), Empty);
432   EXPECT_EQ(Empty.multiply(One), Empty);
433   EXPECT_EQ(Empty.multiply(Some), Empty);
434   EXPECT_EQ(Empty.multiply(Wrap), Empty);
435   EXPECT_EQ(One.multiply(One), ConstantRange(APInt(16, 0xa*0xa),
436                                              APInt(16, 0xa*0xa + 1)));
437   EXPECT_EQ(One.multiply(Some), ConstantRange(APInt(16, 0xa*0xa),
438                                               APInt(16, 0xa*0xaa9 + 1)));
439   EXPECT_EQ(One.multiply(Wrap), Full);
440   EXPECT_EQ(Some.multiply(Some), Full);
441   EXPECT_EQ(Some.multiply(Wrap), Full);
442   EXPECT_EQ(Wrap.multiply(Wrap), Full);
443 
444   ConstantRange Zero(APInt(16, 0));
445   EXPECT_EQ(Zero.multiply(Full), Zero);
446   EXPECT_EQ(Zero.multiply(Some), Zero);
447   EXPECT_EQ(Zero.multiply(Wrap), Zero);
448   EXPECT_EQ(Full.multiply(Zero), Zero);
449   EXPECT_EQ(Some.multiply(Zero), Zero);
450   EXPECT_EQ(Wrap.multiply(Zero), Zero);
451 
452   // http://llvm.org/PR4545
453   EXPECT_EQ(ConstantRange(APInt(4, 1), APInt(4, 6)).multiply(
454                 ConstantRange(APInt(4, 6), APInt(4, 2))),
455             ConstantRange(4, /*isFullSet=*/true));
456 
457   EXPECT_EQ(ConstantRange(APInt(8, 254), APInt(8, 0)).multiply(
458               ConstantRange(APInt(8, 252), APInt(8, 4))),
459             ConstantRange(APInt(8, 250), APInt(8, 9)));
460   EXPECT_EQ(ConstantRange(APInt(8, 254), APInt(8, 255)).multiply(
461               ConstantRange(APInt(8, 2), APInt(8, 4))),
462             ConstantRange(APInt(8, 250), APInt(8, 253)));
463 
464   // TODO: This should be return [-2, 0]
465   EXPECT_EQ(ConstantRange(APInt(8, -2)).multiply(
466               ConstantRange(APInt(8, 0), APInt(8, 2))),
467             ConstantRange(APInt(8, -2), APInt(8, 1)));
468 }
469 
470 TEST_F(ConstantRangeTest, UMax) {
471   EXPECT_EQ(Full.umax(Full), Full);
472   EXPECT_EQ(Full.umax(Empty), Empty);
473   EXPECT_EQ(Full.umax(Some), ConstantRange(APInt(16, 0xa), APInt(16, 0)));
474   EXPECT_EQ(Full.umax(Wrap), Full);
475   EXPECT_EQ(Full.umax(Some), ConstantRange(APInt(16, 0xa), APInt(16, 0)));
476   EXPECT_EQ(Empty.umax(Empty), Empty);
477   EXPECT_EQ(Empty.umax(Some), Empty);
478   EXPECT_EQ(Empty.umax(Wrap), Empty);
479   EXPECT_EQ(Empty.umax(One), Empty);
480   EXPECT_EQ(Some.umax(Some), Some);
481   EXPECT_EQ(Some.umax(Wrap), ConstantRange(APInt(16, 0xa), APInt(16, 0)));
482   EXPECT_EQ(Some.umax(One), Some);
483   // TODO: ConstantRange is currently over-conservative here.
484   EXPECT_EQ(Wrap.umax(Wrap), Full);
485   EXPECT_EQ(Wrap.umax(One), ConstantRange(APInt(16, 0xa), APInt(16, 0)));
486   EXPECT_EQ(One.umax(One), One);
487 }
488 
489 TEST_F(ConstantRangeTest, SMax) {
490   EXPECT_EQ(Full.smax(Full), Full);
491   EXPECT_EQ(Full.smax(Empty), Empty);
492   EXPECT_EQ(Full.smax(Some), ConstantRange(APInt(16, 0xa),
493                                            APInt::getSignedMinValue(16)));
494   EXPECT_EQ(Full.smax(Wrap), Full);
495   EXPECT_EQ(Full.smax(One), ConstantRange(APInt(16, 0xa),
496                                           APInt::getSignedMinValue(16)));
497   EXPECT_EQ(Empty.smax(Empty), Empty);
498   EXPECT_EQ(Empty.smax(Some), Empty);
499   EXPECT_EQ(Empty.smax(Wrap), Empty);
500   EXPECT_EQ(Empty.smax(One), Empty);
501   EXPECT_EQ(Some.smax(Some), Some);
502   EXPECT_EQ(Some.smax(Wrap), ConstantRange(APInt(16, 0xa),
503                                            APInt(16, (uint64_t)INT16_MIN)));
504   EXPECT_EQ(Some.smax(One), Some);
505   EXPECT_EQ(Wrap.smax(One), ConstantRange(APInt(16, 0xa),
506                                           APInt(16, (uint64_t)INT16_MIN)));
507   EXPECT_EQ(One.smax(One), One);
508 }
509 
510 TEST_F(ConstantRangeTest, UMin) {
511   EXPECT_EQ(Full.umin(Full), Full);
512   EXPECT_EQ(Full.umin(Empty), Empty);
513   EXPECT_EQ(Full.umin(Some), ConstantRange(APInt(16, 0), APInt(16, 0xaaa)));
514   EXPECT_EQ(Full.umin(Wrap), Full);
515   EXPECT_EQ(Empty.umin(Empty), Empty);
516   EXPECT_EQ(Empty.umin(Some), Empty);
517   EXPECT_EQ(Empty.umin(Wrap), Empty);
518   EXPECT_EQ(Empty.umin(One), Empty);
519   EXPECT_EQ(Some.umin(Some), Some);
520   EXPECT_EQ(Some.umin(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xaaa)));
521   EXPECT_EQ(Some.umin(One), One);
522   // TODO: ConstantRange is currently over-conservative here.
523   EXPECT_EQ(Wrap.umin(Wrap), Full);
524   EXPECT_EQ(Wrap.umin(One), ConstantRange(APInt(16, 0), APInt(16, 0xb)));
525   EXPECT_EQ(One.umin(One), One);
526 }
527 
528 TEST_F(ConstantRangeTest, SMin) {
529   EXPECT_EQ(Full.smin(Full), Full);
530   EXPECT_EQ(Full.smin(Empty), Empty);
531   EXPECT_EQ(Full.smin(Some), ConstantRange(APInt(16, (uint64_t)INT16_MIN),
532                                            APInt(16, 0xaaa)));
533   EXPECT_EQ(Full.smin(Wrap), Full);
534   EXPECT_EQ(Empty.smin(Empty), Empty);
535   EXPECT_EQ(Empty.smin(Some), Empty);
536   EXPECT_EQ(Empty.smin(Wrap), Empty);
537   EXPECT_EQ(Empty.smin(One), Empty);
538   EXPECT_EQ(Some.smin(Some), Some);
539   EXPECT_EQ(Some.smin(Wrap), ConstantRange(APInt(16, (uint64_t)INT16_MIN),
540                                            APInt(16, 0xaaa)));
541   EXPECT_EQ(Some.smin(One), One);
542   // TODO: ConstantRange is currently over-conservative here.
543   EXPECT_EQ(Wrap.smin(Wrap), Full);
544   EXPECT_EQ(Wrap.smin(One), ConstantRange(APInt(16, (uint64_t)INT16_MIN),
545                                           APInt(16, 0xb)));
546   EXPECT_EQ(One.smin(One), One);
547 }
548 
549 TEST_F(ConstantRangeTest, UDiv) {
550   EXPECT_EQ(Full.udiv(Full), Full);
551   EXPECT_EQ(Full.udiv(Empty), Empty);
552   EXPECT_EQ(Full.udiv(One), ConstantRange(APInt(16, 0),
553                                           APInt(16, 0xffff / 0xa + 1)));
554   EXPECT_EQ(Full.udiv(Some), ConstantRange(APInt(16, 0),
555                                            APInt(16, 0xffff / 0xa + 1)));
556   EXPECT_EQ(Full.udiv(Wrap), Full);
557   EXPECT_EQ(Empty.udiv(Empty), Empty);
558   EXPECT_EQ(Empty.udiv(One), Empty);
559   EXPECT_EQ(Empty.udiv(Some), Empty);
560   EXPECT_EQ(Empty.udiv(Wrap), Empty);
561   EXPECT_EQ(One.udiv(One), ConstantRange(APInt(16, 1)));
562   EXPECT_EQ(One.udiv(Some), ConstantRange(APInt(16, 0), APInt(16, 2)));
563   EXPECT_EQ(One.udiv(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xb)));
564   EXPECT_EQ(Some.udiv(Some), ConstantRange(APInt(16, 0), APInt(16, 0x111)));
565   EXPECT_EQ(Some.udiv(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xaaa)));
566   EXPECT_EQ(Wrap.udiv(Wrap), Full);
567 }
568 
569 TEST_F(ConstantRangeTest, Shl) {
570   EXPECT_EQ(Full.shl(Full), Full);
571   EXPECT_EQ(Full.shl(Empty), Empty);
572   EXPECT_EQ(Full.shl(One), Full);    // TODO: [0, (-1 << 0xa) + 1)
573   EXPECT_EQ(Full.shl(Some), Full);   // TODO: [0, (-1 << 0xa) + 1)
574   EXPECT_EQ(Full.shl(Wrap), Full);
575   EXPECT_EQ(Empty.shl(Empty), Empty);
576   EXPECT_EQ(Empty.shl(One), Empty);
577   EXPECT_EQ(Empty.shl(Some), Empty);
578   EXPECT_EQ(Empty.shl(Wrap), Empty);
579   EXPECT_EQ(One.shl(One), ConstantRange(APInt(16, 0xa << 0xa),
580                                         APInt(16, (0xa << 0xa) + 1)));
581   EXPECT_EQ(One.shl(Some), Full);    // TODO: [0xa << 0xa, 0)
582   EXPECT_EQ(One.shl(Wrap), Full);    // TODO: [0xa, 0xa << 14 + 1)
583   EXPECT_EQ(Some.shl(Some), Full);   // TODO: [0xa << 0xa, 0xfc01)
584   EXPECT_EQ(Some.shl(Wrap), Full);   // TODO: [0xa, 0x7ff << 0x5 + 1)
585   EXPECT_EQ(Wrap.shl(Wrap), Full);
586 }
587 
588 TEST_F(ConstantRangeTest, Lshr) {
589   EXPECT_EQ(Full.lshr(Full), Full);
590   EXPECT_EQ(Full.lshr(Empty), Empty);
591   EXPECT_EQ(Full.lshr(One), ConstantRange(APInt(16, 0),
592                                           APInt(16, (0xffff >> 0xa) + 1)));
593   EXPECT_EQ(Full.lshr(Some), ConstantRange(APInt(16, 0),
594                                            APInt(16, (0xffff >> 0xa) + 1)));
595   EXPECT_EQ(Full.lshr(Wrap), Full);
596   EXPECT_EQ(Empty.lshr(Empty), Empty);
597   EXPECT_EQ(Empty.lshr(One), Empty);
598   EXPECT_EQ(Empty.lshr(Some), Empty);
599   EXPECT_EQ(Empty.lshr(Wrap), Empty);
600   EXPECT_EQ(One.lshr(One), ConstantRange(APInt(16, 0)));
601   EXPECT_EQ(One.lshr(Some), ConstantRange(APInt(16, 0)));
602   EXPECT_EQ(One.lshr(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xb)));
603   EXPECT_EQ(Some.lshr(Some), ConstantRange(APInt(16, 0),
604                                            APInt(16, (0xaaa >> 0xa) + 1)));
605   EXPECT_EQ(Some.lshr(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xaaa)));
606   EXPECT_EQ(Wrap.lshr(Wrap), Full);
607 }
608 
609 TEST(ConstantRange, MakeAllowedICmpRegion) {
610   // PR8250
611   ConstantRange SMax = ConstantRange(APInt::getSignedMaxValue(32));
612   EXPECT_TRUE(ConstantRange::makeAllowedICmpRegion(ICmpInst::ICMP_SGT, SMax)
613                   .isEmptySet());
614 }
615 
616 TEST(ConstantRange, MakeSatisfyingICmpRegion) {
617   ConstantRange LowHalf(APInt(8, 0), APInt(8, 128));
618   ConstantRange HighHalf(APInt(8, 128), APInt(8, 0));
619   ConstantRange EmptySet(8, /* isFullSet = */ false);
620 
621   EXPECT_EQ(ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_NE, LowHalf),
622             HighHalf);
623 
624   EXPECT_EQ(
625       ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_NE, HighHalf),
626       LowHalf);
627 
628   EXPECT_TRUE(ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_EQ,
629                                                       HighHalf).isEmptySet());
630 
631   ConstantRange UnsignedSample(APInt(8, 5), APInt(8, 200));
632 
633   EXPECT_EQ(ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_ULT,
634                                                     UnsignedSample),
635             ConstantRange(APInt(8, 0), APInt(8, 5)));
636 
637   EXPECT_EQ(ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_ULE,
638                                                     UnsignedSample),
639             ConstantRange(APInt(8, 0), APInt(8, 6)));
640 
641   EXPECT_EQ(ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_UGT,
642                                                     UnsignedSample),
643             ConstantRange(APInt(8, 200), APInt(8, 0)));
644 
645   EXPECT_EQ(ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_UGE,
646                                                     UnsignedSample),
647             ConstantRange(APInt(8, 199), APInt(8, 0)));
648 
649   ConstantRange SignedSample(APInt(8, -5), APInt(8, 5));
650 
651   EXPECT_EQ(
652       ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_SLT, SignedSample),
653       ConstantRange(APInt(8, -128), APInt(8, -5)));
654 
655   EXPECT_EQ(
656       ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_SLE, SignedSample),
657       ConstantRange(APInt(8, -128), APInt(8, -4)));
658 
659   EXPECT_EQ(
660       ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_SGT, SignedSample),
661       ConstantRange(APInt(8, 5), APInt(8, -128)));
662 
663   EXPECT_EQ(
664       ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_SGE, SignedSample),
665       ConstantRange(APInt(8, 4), APInt(8, -128)));
666 }
667 
668 TEST(ConstantRange, MakeGuaranteedNoWrapRegion) {
669   const int IntMin4Bits = 8;
670   const int IntMax4Bits = 7;
671   typedef OverflowingBinaryOperator OBO;
672 
673   for (int Const : {0, -1, -2, 1, 2, IntMin4Bits, IntMax4Bits}) {
674     APInt C(4, Const, true /* = isSigned */);
675 
676     auto NUWRegion = ConstantRange::makeGuaranteedNoWrapRegion(
677         Instruction::Add, C, OBO::NoUnsignedWrap);
678 
679     EXPECT_FALSE(NUWRegion.isEmptySet());
680 
681     auto NSWRegion = ConstantRange::makeGuaranteedNoWrapRegion(
682         Instruction::Add, C, OBO::NoSignedWrap);
683 
684     EXPECT_FALSE(NSWRegion.isEmptySet());
685 
686     auto NoWrapRegion = ConstantRange::makeGuaranteedNoWrapRegion(
687         Instruction::Add, C, OBO::NoSignedWrap | OBO::NoUnsignedWrap);
688 
689     EXPECT_FALSE(NoWrapRegion.isEmptySet());
690     EXPECT_TRUE(NUWRegion.intersectWith(NSWRegion).contains(NoWrapRegion));
691 
692     for (APInt I = NUWRegion.getLower(), E = NUWRegion.getUpper(); I != E;
693          ++I) {
694       bool Overflow = false;
695       (void)I.uadd_ov(C, Overflow);
696       EXPECT_FALSE(Overflow);
697     }
698 
699     for (APInt I = NSWRegion.getLower(), E = NSWRegion.getUpper(); I != E;
700          ++I) {
701       bool Overflow = false;
702       (void)I.sadd_ov(C, Overflow);
703       EXPECT_FALSE(Overflow);
704     }
705 
706     for (APInt I = NoWrapRegion.getLower(), E = NoWrapRegion.getUpper(); I != E;
707          ++I) {
708       bool Overflow = false;
709 
710       (void)I.sadd_ov(C, Overflow);
711       EXPECT_FALSE(Overflow);
712 
713       (void)I.uadd_ov(C, Overflow);
714       EXPECT_FALSE(Overflow);
715     }
716   }
717 
718   auto NSWForAllValues = ConstantRange::makeGuaranteedNoWrapRegion(
719       Instruction::Add, ConstantRange(32, /* isFullSet = */ true),
720       OBO::NoSignedWrap);
721   EXPECT_TRUE(NSWForAllValues.isSingleElement() &&
722               NSWForAllValues.getSingleElement()->isMinValue());
723 
724   auto NUWForAllValues = ConstantRange::makeGuaranteedNoWrapRegion(
725       Instruction::Add, ConstantRange(32, /* isFullSet = */ true),
726       OBO::NoUnsignedWrap);
727   EXPECT_TRUE(NUWForAllValues.isSingleElement() &&
728               NUWForAllValues.getSingleElement()->isMinValue());
729 
730   auto NUWAndNSWForAllValues = ConstantRange::makeGuaranteedNoWrapRegion(
731       Instruction::Add, ConstantRange(32, /* isFullSet = */ true),
732       OBO::NoUnsignedWrap | OBO::NoSignedWrap);
733   EXPECT_TRUE(NUWAndNSWForAllValues.isSingleElement() &&
734               NUWAndNSWForAllValues.getSingleElement()->isMinValue());
735 
736   ConstantRange OneToFive(APInt(32, 1), APInt(32, 6));
737   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
738                 Instruction::Add, OneToFive, OBO::NoSignedWrap),
739             ConstantRange(APInt::getSignedMinValue(32),
740                           APInt::getSignedMaxValue(32) - 4));
741   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
742                 Instruction::Add, OneToFive, OBO::NoUnsignedWrap),
743             ConstantRange(APInt::getMinValue(32), APInt::getMinValue(32) - 5));
744   EXPECT_EQ(
745       ConstantRange::makeGuaranteedNoWrapRegion(
746           Instruction::Add, OneToFive, OBO::NoUnsignedWrap | OBO::NoSignedWrap),
747       ConstantRange(APInt::getMinValue(32), APInt::getSignedMaxValue(32) - 4));
748 
749   ConstantRange MinusFiveToMinusTwo(APInt(32, -5), APInt(32, -1));
750   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
751                 Instruction::Add, MinusFiveToMinusTwo, OBO::NoSignedWrap),
752             ConstantRange(APInt::getSignedMinValue(32) + 5,
753                           APInt::getSignedMinValue(32)));
754   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
755                 Instruction::Add, MinusFiveToMinusTwo, OBO::NoUnsignedWrap),
756             ConstantRange(APInt(32, 0), APInt(32, 2)));
757   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
758                 Instruction::Add, MinusFiveToMinusTwo,
759                 OBO::NoUnsignedWrap | OBO::NoSignedWrap),
760             ConstantRange(APInt(32, 0), APInt(32, 2)));
761 
762   ConstantRange MinusOneToOne(APInt(32, -1), APInt(32, 2));
763   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
764                 Instruction::Add, MinusOneToOne, OBO::NoSignedWrap),
765             ConstantRange(APInt::getSignedMinValue(32) + 1,
766                           APInt::getSignedMinValue(32) - 1));
767   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
768                 Instruction::Add, MinusOneToOne, OBO::NoUnsignedWrap),
769             ConstantRange(APInt(32, 0), APInt(32, 1)));
770   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
771                 Instruction::Add, MinusOneToOne,
772                 OBO::NoUnsignedWrap | OBO::NoSignedWrap),
773             ConstantRange(APInt(32, 0), APInt(32, 1)));
774 }
775 
776 TEST(ConstantRange, GetEquivalentICmp) {
777   APInt RHS;
778   CmpInst::Predicate Pred;
779 
780   EXPECT_TRUE(ConstantRange(APInt::getMinValue(32), APInt(32, 100))
781                   .getEquivalentICmp(Pred, RHS));
782   EXPECT_EQ(Pred, CmpInst::ICMP_ULT);
783   EXPECT_EQ(RHS, APInt(32, 100));
784 
785   EXPECT_TRUE(ConstantRange(APInt::getSignedMinValue(32), APInt(32, 100))
786                   .getEquivalentICmp(Pred, RHS));
787   EXPECT_EQ(Pred, CmpInst::ICMP_SLT);
788   EXPECT_EQ(RHS, APInt(32, 100));
789 
790   EXPECT_TRUE(ConstantRange(APInt(32, 100), APInt::getMinValue(32))
791                   .getEquivalentICmp(Pred, RHS));
792   EXPECT_EQ(Pred, CmpInst::ICMP_UGE);
793   EXPECT_EQ(RHS, APInt(32, 100));
794 
795   EXPECT_TRUE(ConstantRange(APInt(32, 100), APInt::getSignedMinValue(32))
796                   .getEquivalentICmp(Pred, RHS));
797   EXPECT_EQ(Pred, CmpInst::ICMP_SGE);
798   EXPECT_EQ(RHS, APInt(32, 100));
799 
800   EXPECT_TRUE(
801       ConstantRange(32, /*isFullSet=*/true).getEquivalentICmp(Pred, RHS));
802   EXPECT_EQ(Pred, CmpInst::ICMP_UGE);
803   EXPECT_EQ(RHS, APInt(32, 0));
804 
805   EXPECT_TRUE(
806       ConstantRange(32, /*isFullSet=*/false).getEquivalentICmp(Pred, RHS));
807   EXPECT_EQ(Pred, CmpInst::ICMP_ULT);
808   EXPECT_EQ(RHS, APInt(32, 0));
809 
810   EXPECT_FALSE(ConstantRange(APInt(32, 100), APInt(32, 200))
811                    .getEquivalentICmp(Pred, RHS));
812 
813   EXPECT_FALSE(ConstantRange(APInt::getSignedMinValue(32) - APInt(32, 100),
814                              APInt::getSignedMinValue(32) + APInt(32, 100))
815                    .getEquivalentICmp(Pred, RHS));
816 
817   EXPECT_FALSE(ConstantRange(APInt::getMinValue(32) - APInt(32, 100),
818                              APInt::getMinValue(32) + APInt(32, 100))
819                    .getEquivalentICmp(Pred, RHS));
820 
821   EXPECT_TRUE(ConstantRange(APInt(32, 100)).getEquivalentICmp(Pred, RHS));
822   EXPECT_EQ(Pred, CmpInst::ICMP_EQ);
823   EXPECT_EQ(RHS, APInt(32, 100));
824 
825   EXPECT_TRUE(
826       ConstantRange(APInt(32, 100)).inverse().getEquivalentICmp(Pred, RHS));
827   EXPECT_EQ(Pred, CmpInst::ICMP_NE);
828   EXPECT_EQ(RHS, APInt(32, 100));
829 
830   EXPECT_TRUE(
831       ConstantRange(APInt(512, 100)).inverse().getEquivalentICmp(Pred, RHS));
832   EXPECT_EQ(Pred, CmpInst::ICMP_NE);
833   EXPECT_EQ(RHS, APInt(512, 100));
834 
835   // NB!  It would be correct for the following four calls to getEquivalentICmp
836   // to return ordered predicates like CmpInst::ICMP_ULT or CmpInst::ICMP_UGT.
837   // However, that's not the case today.
838 
839   EXPECT_TRUE(ConstantRange(APInt(32, 0)).getEquivalentICmp(Pred, RHS));
840   EXPECT_EQ(Pred, CmpInst::ICMP_EQ);
841   EXPECT_EQ(RHS, APInt(32, 0));
842 
843   EXPECT_TRUE(
844       ConstantRange(APInt(32, 0)).inverse().getEquivalentICmp(Pred, RHS));
845   EXPECT_EQ(Pred, CmpInst::ICMP_NE);
846   EXPECT_EQ(RHS, APInt(32, 0));
847 
848   EXPECT_TRUE(ConstantRange(APInt(32, -1)).getEquivalentICmp(Pred, RHS));
849   EXPECT_EQ(Pred, CmpInst::ICMP_EQ);
850   EXPECT_EQ(RHS, APInt(32, -1));
851 
852   EXPECT_TRUE(
853       ConstantRange(APInt(32, -1)).inverse().getEquivalentICmp(Pred, RHS));
854   EXPECT_EQ(Pred, CmpInst::ICMP_NE);
855   EXPECT_EQ(RHS, APInt(32, -1));
856 }
857 
858 }  // anonymous namespace
859