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 }
191 
192 TEST_F(ConstantRangeTest, ZExt) {
193   ConstantRange ZFull = Full.zeroExtend(20);
194   ConstantRange ZEmpty = Empty.zeroExtend(20);
195   ConstantRange ZOne = One.zeroExtend(20);
196   ConstantRange ZSome = Some.zeroExtend(20);
197   ConstantRange ZWrap = Wrap.zeroExtend(20);
198   EXPECT_EQ(ZFull, ConstantRange(APInt(20, 0), APInt(20, 0x10000)));
199   EXPECT_TRUE(ZEmpty.isEmptySet());
200   EXPECT_EQ(ZOne, ConstantRange(One.getLower().zext(20),
201                                 One.getUpper().zext(20)));
202   EXPECT_EQ(ZSome, ConstantRange(Some.getLower().zext(20),
203                                  Some.getUpper().zext(20)));
204   EXPECT_EQ(ZWrap, ConstantRange(APInt(20, 0), APInt(20, 0x10000)));
205 
206   // zext([5, 0), 3->7) = [5, 8)
207   ConstantRange FiveZero(APInt(3, 5), APInt(3, 0));
208   EXPECT_EQ(FiveZero.zeroExtend(7), ConstantRange(APInt(7, 5), APInt(7, 8)));
209 }
210 
211 TEST_F(ConstantRangeTest, SExt) {
212   ConstantRange SFull = Full.signExtend(20);
213   ConstantRange SEmpty = Empty.signExtend(20);
214   ConstantRange SOne = One.signExtend(20);
215   ConstantRange SSome = Some.signExtend(20);
216   ConstantRange SWrap = Wrap.signExtend(20);
217   EXPECT_EQ(SFull, ConstantRange(APInt(20, (uint64_t)INT16_MIN, true),
218                                  APInt(20, INT16_MAX + 1, true)));
219   EXPECT_TRUE(SEmpty.isEmptySet());
220   EXPECT_EQ(SOne, ConstantRange(One.getLower().sext(20),
221                                 One.getUpper().sext(20)));
222   EXPECT_EQ(SSome, ConstantRange(Some.getLower().sext(20),
223                                  Some.getUpper().sext(20)));
224   EXPECT_EQ(SWrap, ConstantRange(APInt(20, (uint64_t)INT16_MIN, true),
225                                  APInt(20, INT16_MAX + 1, true)));
226 
227   EXPECT_EQ(ConstantRange(APInt(8, 120), APInt(8, 140)).signExtend(16),
228             ConstantRange(APInt(16, -128), APInt(16, 128)));
229 
230   EXPECT_EQ(ConstantRange(APInt(16, 0x0200), APInt(16, 0x8000)).signExtend(19),
231             ConstantRange(APInt(19, 0x0200), APInt(19, 0x8000)));
232 }
233 
234 TEST_F(ConstantRangeTest, IntersectWith) {
235   EXPECT_EQ(Empty.intersectWith(Full), Empty);
236   EXPECT_EQ(Empty.intersectWith(Empty), Empty);
237   EXPECT_EQ(Empty.intersectWith(One), Empty);
238   EXPECT_EQ(Empty.intersectWith(Some), Empty);
239   EXPECT_EQ(Empty.intersectWith(Wrap), Empty);
240   EXPECT_EQ(Full.intersectWith(Full), Full);
241   EXPECT_EQ(Some.intersectWith(Some), Some);
242   EXPECT_EQ(Some.intersectWith(One), One);
243   EXPECT_EQ(Full.intersectWith(One), One);
244   EXPECT_EQ(Full.intersectWith(Some), Some);
245   EXPECT_EQ(Some.intersectWith(Wrap), Empty);
246   EXPECT_EQ(One.intersectWith(Wrap), Empty);
247   EXPECT_EQ(One.intersectWith(Wrap), Wrap.intersectWith(One));
248 
249   // Klee generated testcase from PR4545.
250   // The intersection of i16 [4, 2) and [6, 5) is disjoint, looking like
251   // 01..4.6789ABCDEF where the dots represent values not in the intersection.
252   ConstantRange LHS(APInt(16, 4), APInt(16, 2));
253   ConstantRange RHS(APInt(16, 6), APInt(16, 5));
254   EXPECT_TRUE(LHS.intersectWith(RHS) == LHS);
255 
256   // previous bug: intersection of [min, 3) and [2, max) should be 2
257   LHS = ConstantRange(APInt(32, -2147483646), APInt(32, 3));
258   RHS = ConstantRange(APInt(32, 2), APInt(32, 2147483646));
259   EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 2)));
260 
261   // [2, 0) /\ [4, 3) = [2, 0)
262   LHS = ConstantRange(APInt(32, 2), APInt(32, 0));
263   RHS = ConstantRange(APInt(32, 4), APInt(32, 3));
264   EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 2), APInt(32, 0)));
265 
266   // [2, 0) /\ [4, 2) = [4, 0)
267   LHS = ConstantRange(APInt(32, 2), APInt(32, 0));
268   RHS = ConstantRange(APInt(32, 4), APInt(32, 2));
269   EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 4), APInt(32, 0)));
270 
271   // [4, 2) /\ [5, 1) = [5, 1)
272   LHS = ConstantRange(APInt(32, 4), APInt(32, 2));
273   RHS = ConstantRange(APInt(32, 5), APInt(32, 1));
274   EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 5), APInt(32, 1)));
275 
276   // [2, 0) /\ [7, 4) = [7, 4)
277   LHS = ConstantRange(APInt(32, 2), APInt(32, 0));
278   RHS = ConstantRange(APInt(32, 7), APInt(32, 4));
279   EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 7), APInt(32, 4)));
280 
281   // [4, 2) /\ [1, 0) = [1, 0)
282   LHS = ConstantRange(APInt(32, 4), APInt(32, 2));
283   RHS = ConstantRange(APInt(32, 1), APInt(32, 0));
284   EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 4), APInt(32, 2)));
285 
286   // [15, 0) /\ [7, 6) = [15, 0)
287   LHS = ConstantRange(APInt(32, 15), APInt(32, 0));
288   RHS = ConstantRange(APInt(32, 7), APInt(32, 6));
289   EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 15), APInt(32, 0)));
290 }
291 
292 TEST_F(ConstantRangeTest, UnionWith) {
293   EXPECT_EQ(Wrap.unionWith(One),
294             ConstantRange(APInt(16, 0xaaa), APInt(16, 0xb)));
295   EXPECT_EQ(One.unionWith(Wrap), Wrap.unionWith(One));
296   EXPECT_EQ(Empty.unionWith(Empty), Empty);
297   EXPECT_EQ(Full.unionWith(Full), Full);
298   EXPECT_EQ(Some.unionWith(Wrap), Full);
299 
300   // PR4545
301   EXPECT_EQ(ConstantRange(APInt(16, 14), APInt(16, 1)).unionWith(
302                                     ConstantRange(APInt(16, 0), APInt(16, 8))),
303             ConstantRange(APInt(16, 14), APInt(16, 8)));
304   EXPECT_EQ(ConstantRange(APInt(16, 6), APInt(16, 4)).unionWith(
305                                     ConstantRange(APInt(16, 4), APInt(16, 0))),
306               ConstantRange(16));
307   EXPECT_EQ(ConstantRange(APInt(16, 1), APInt(16, 0)).unionWith(
308                                     ConstantRange(APInt(16, 2), APInt(16, 1))),
309               ConstantRange(16));
310 }
311 
312 TEST_F(ConstantRangeTest, SetDifference) {
313   EXPECT_EQ(Full.difference(Empty), Full);
314   EXPECT_EQ(Full.difference(Full), Empty);
315   EXPECT_EQ(Empty.difference(Empty), Empty);
316   EXPECT_EQ(Empty.difference(Full), Empty);
317 
318   ConstantRange A(APInt(16, 3), APInt(16, 7));
319   ConstantRange B(APInt(16, 5), APInt(16, 9));
320   ConstantRange C(APInt(16, 3), APInt(16, 5));
321   ConstantRange D(APInt(16, 7), APInt(16, 9));
322   ConstantRange E(APInt(16, 5), APInt(16, 4));
323   ConstantRange F(APInt(16, 7), APInt(16, 3));
324   EXPECT_EQ(A.difference(B), C);
325   EXPECT_EQ(B.difference(A), D);
326   EXPECT_EQ(E.difference(A), F);
327 }
328 
329 TEST_F(ConstantRangeTest, SubtractAPInt) {
330   EXPECT_EQ(Full.subtract(APInt(16, 4)), Full);
331   EXPECT_EQ(Empty.subtract(APInt(16, 4)), Empty);
332   EXPECT_EQ(Some.subtract(APInt(16, 4)),
333             ConstantRange(APInt(16, 0x6), APInt(16, 0xaa6)));
334   EXPECT_EQ(Wrap.subtract(APInt(16, 4)),
335             ConstantRange(APInt(16, 0xaa6), APInt(16, 0x6)));
336   EXPECT_EQ(One.subtract(APInt(16, 4)),
337             ConstantRange(APInt(16, 0x6)));
338 }
339 
340 TEST_F(ConstantRangeTest, Add) {
341   EXPECT_EQ(Full.add(APInt(16, 4)), Full);
342   EXPECT_EQ(Full.add(Full), Full);
343   EXPECT_EQ(Full.add(Empty), Empty);
344   EXPECT_EQ(Full.add(One), Full);
345   EXPECT_EQ(Full.add(Some), Full);
346   EXPECT_EQ(Full.add(Wrap), Full);
347   EXPECT_EQ(Empty.add(Empty), Empty);
348   EXPECT_EQ(Empty.add(One), Empty);
349   EXPECT_EQ(Empty.add(Some), Empty);
350   EXPECT_EQ(Empty.add(Wrap), Empty);
351   EXPECT_EQ(Empty.add(APInt(16, 4)), Empty);
352   EXPECT_EQ(Some.add(APInt(16, 4)),
353             ConstantRange(APInt(16, 0xe), APInt(16, 0xaae)));
354   EXPECT_EQ(Wrap.add(APInt(16, 4)),
355             ConstantRange(APInt(16, 0xaae), APInt(16, 0xe)));
356   EXPECT_EQ(One.add(APInt(16, 4)),
357             ConstantRange(APInt(16, 0xe)));
358 }
359 
360 TEST_F(ConstantRangeTest, AddWithNoSignedWrap) {
361   EXPECT_EQ(Empty.addWithNoSignedWrap(APInt(16, 1)), Empty);
362   EXPECT_EQ(Full.addWithNoSignedWrap(APInt(16, 1)),
363             ConstantRange(APInt(16, INT16_MIN+1), APInt(16, INT16_MIN)));
364   EXPECT_EQ(ConstantRange(APInt(8, -50), APInt(8, 50)).addWithNoSignedWrap(APInt(8, 10)),
365             ConstantRange(APInt(8, -40), APInt(8, 60)));
366   EXPECT_EQ(ConstantRange(APInt(8, -50), APInt(8, 120)).addWithNoSignedWrap(APInt(8, 10)),
367             ConstantRange(APInt(8, -40), APInt(8, INT8_MIN)));
368   EXPECT_EQ(ConstantRange(APInt(8, 120), APInt(8, -10)).addWithNoSignedWrap(APInt(8, 5)),
369             ConstantRange(APInt(8, 125), APInt(8, -5)));
370   EXPECT_EQ(ConstantRange(APInt(8, 120), APInt(8, -120)).addWithNoSignedWrap(APInt(8, 10)),
371             ConstantRange(APInt(8, INT8_MIN+10), APInt(8, -110)));
372 
373   EXPECT_EQ(Empty.addWithNoSignedWrap(APInt(16, -1)), Empty);
374   EXPECT_EQ(Full.addWithNoSignedWrap(APInt(16, -1)),
375             ConstantRange(APInt(16, INT16_MIN), APInt(16, INT16_MAX)));
376   EXPECT_EQ(ConstantRange(APInt(8, -50), APInt(8, 50)).addWithNoSignedWrap(APInt(8, -10)),
377             ConstantRange(APInt(8, -60), APInt(8, 40)));
378   EXPECT_EQ(ConstantRange(APInt(8, -120), APInt(8, 50)).addWithNoSignedWrap(APInt(8, -10)),
379             ConstantRange(APInt(8, INT8_MIN), APInt(8, 40)));
380   EXPECT_EQ(ConstantRange(APInt(8, 120), APInt(8, -120)).addWithNoSignedWrap(APInt(8, -5)),
381             ConstantRange(APInt(8, 115), APInt(8, -125)));
382   EXPECT_EQ(ConstantRange(APInt(8, 120), APInt(8, -120)).addWithNoSignedWrap(APInt(8, -10)),
383             ConstantRange(APInt(8, 110), APInt(8, INT8_MIN-10)));
384 }
385 
386 TEST_F(ConstantRangeTest, Sub) {
387   EXPECT_EQ(Full.sub(APInt(16, 4)), Full);
388   EXPECT_EQ(Full.sub(Full), Full);
389   EXPECT_EQ(Full.sub(Empty), Empty);
390   EXPECT_EQ(Full.sub(One), Full);
391   EXPECT_EQ(Full.sub(Some), Full);
392   EXPECT_EQ(Full.sub(Wrap), Full);
393   EXPECT_EQ(Empty.sub(Empty), Empty);
394   EXPECT_EQ(Empty.sub(One), Empty);
395   EXPECT_EQ(Empty.sub(Some), Empty);
396   EXPECT_EQ(Empty.sub(Wrap), Empty);
397   EXPECT_EQ(Empty.sub(APInt(16, 4)), Empty);
398   EXPECT_EQ(Some.sub(APInt(16, 4)),
399             ConstantRange(APInt(16, 0x6), APInt(16, 0xaa6)));
400   EXPECT_EQ(Some.sub(Some),
401             ConstantRange(APInt(16, 0xf561), APInt(16, 0xaa0)));
402   EXPECT_EQ(Wrap.sub(APInt(16, 4)),
403             ConstantRange(APInt(16, 0xaa6), APInt(16, 0x6)));
404   EXPECT_EQ(One.sub(APInt(16, 4)),
405             ConstantRange(APInt(16, 0x6)));
406 }
407 
408 TEST_F(ConstantRangeTest, Multiply) {
409   EXPECT_EQ(Full.multiply(Full), Full);
410   EXPECT_EQ(Full.multiply(Empty), Empty);
411   EXPECT_EQ(Full.multiply(One), Full);
412   EXPECT_EQ(Full.multiply(Some), Full);
413   EXPECT_EQ(Full.multiply(Wrap), Full);
414   EXPECT_EQ(Empty.multiply(Empty), Empty);
415   EXPECT_EQ(Empty.multiply(One), Empty);
416   EXPECT_EQ(Empty.multiply(Some), Empty);
417   EXPECT_EQ(Empty.multiply(Wrap), Empty);
418   EXPECT_EQ(One.multiply(One), ConstantRange(APInt(16, 0xa*0xa),
419                                              APInt(16, 0xa*0xa + 1)));
420   EXPECT_EQ(One.multiply(Some), ConstantRange(APInt(16, 0xa*0xa),
421                                               APInt(16, 0xa*0xaa9 + 1)));
422   EXPECT_EQ(One.multiply(Wrap), Full);
423   EXPECT_EQ(Some.multiply(Some), Full);
424   EXPECT_EQ(Some.multiply(Wrap), Full);
425   EXPECT_EQ(Wrap.multiply(Wrap), Full);
426 
427   ConstantRange Zero(APInt(16, 0));
428   EXPECT_EQ(Zero.multiply(Full), Zero);
429   EXPECT_EQ(Zero.multiply(Some), Zero);
430   EXPECT_EQ(Zero.multiply(Wrap), Zero);
431   EXPECT_EQ(Full.multiply(Zero), Zero);
432   EXPECT_EQ(Some.multiply(Zero), Zero);
433   EXPECT_EQ(Wrap.multiply(Zero), Zero);
434 
435   // http://llvm.org/PR4545
436   EXPECT_EQ(ConstantRange(APInt(4, 1), APInt(4, 6)).multiply(
437                 ConstantRange(APInt(4, 6), APInt(4, 2))),
438             ConstantRange(4, /*isFullSet=*/true));
439 
440   EXPECT_EQ(ConstantRange(APInt(8, 254), APInt(8, 0)).multiply(
441               ConstantRange(APInt(8, 252), APInt(8, 4))),
442             ConstantRange(APInt(8, 250), APInt(8, 9)));
443   EXPECT_EQ(ConstantRange(APInt(8, 254), APInt(8, 255)).multiply(
444               ConstantRange(APInt(8, 2), APInt(8, 4))),
445             ConstantRange(APInt(8, 250), APInt(8, 253)));
446 }
447 
448 TEST_F(ConstantRangeTest, UMax) {
449   EXPECT_EQ(Full.umax(Full), Full);
450   EXPECT_EQ(Full.umax(Empty), Empty);
451   EXPECT_EQ(Full.umax(Some), ConstantRange(APInt(16, 0xa), APInt(16, 0)));
452   EXPECT_EQ(Full.umax(Wrap), Full);
453   EXPECT_EQ(Full.umax(Some), ConstantRange(APInt(16, 0xa), APInt(16, 0)));
454   EXPECT_EQ(Empty.umax(Empty), Empty);
455   EXPECT_EQ(Empty.umax(Some), Empty);
456   EXPECT_EQ(Empty.umax(Wrap), Empty);
457   EXPECT_EQ(Empty.umax(One), Empty);
458   EXPECT_EQ(Some.umax(Some), Some);
459   EXPECT_EQ(Some.umax(Wrap), ConstantRange(APInt(16, 0xa), APInt(16, 0)));
460   EXPECT_EQ(Some.umax(One), Some);
461   // TODO: ConstantRange is currently over-conservative here.
462   EXPECT_EQ(Wrap.umax(Wrap), Full);
463   EXPECT_EQ(Wrap.umax(One), ConstantRange(APInt(16, 0xa), APInt(16, 0)));
464   EXPECT_EQ(One.umax(One), One);
465 }
466 
467 TEST_F(ConstantRangeTest, SMax) {
468   EXPECT_EQ(Full.smax(Full), Full);
469   EXPECT_EQ(Full.smax(Empty), Empty);
470   EXPECT_EQ(Full.smax(Some), ConstantRange(APInt(16, 0xa),
471                                            APInt::getSignedMinValue(16)));
472   EXPECT_EQ(Full.smax(Wrap), Full);
473   EXPECT_EQ(Full.smax(One), ConstantRange(APInt(16, 0xa),
474                                           APInt::getSignedMinValue(16)));
475   EXPECT_EQ(Empty.smax(Empty), Empty);
476   EXPECT_EQ(Empty.smax(Some), Empty);
477   EXPECT_EQ(Empty.smax(Wrap), Empty);
478   EXPECT_EQ(Empty.smax(One), Empty);
479   EXPECT_EQ(Some.smax(Some), Some);
480   EXPECT_EQ(Some.smax(Wrap), ConstantRange(APInt(16, 0xa),
481                                            APInt(16, (uint64_t)INT16_MIN)));
482   EXPECT_EQ(Some.smax(One), Some);
483   EXPECT_EQ(Wrap.smax(One), ConstantRange(APInt(16, 0xa),
484                                           APInt(16, (uint64_t)INT16_MIN)));
485   EXPECT_EQ(One.smax(One), One);
486 }
487 
488 TEST_F(ConstantRangeTest, UMin) {
489   EXPECT_EQ(Full.umin(Full), Full);
490   EXPECT_EQ(Full.umin(Empty), Empty);
491   EXPECT_EQ(Full.umin(Some), ConstantRange(APInt(16, 0), APInt(16, 0xaaa)));
492   EXPECT_EQ(Full.umin(Wrap), Full);
493   EXPECT_EQ(Empty.umin(Empty), Empty);
494   EXPECT_EQ(Empty.umin(Some), Empty);
495   EXPECT_EQ(Empty.umin(Wrap), Empty);
496   EXPECT_EQ(Empty.umin(One), Empty);
497   EXPECT_EQ(Some.umin(Some), Some);
498   EXPECT_EQ(Some.umin(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xaaa)));
499   EXPECT_EQ(Some.umin(One), One);
500   // TODO: ConstantRange is currently over-conservative here.
501   EXPECT_EQ(Wrap.umin(Wrap), Full);
502   EXPECT_EQ(Wrap.umin(One), ConstantRange(APInt(16, 0), APInt(16, 0xb)));
503   EXPECT_EQ(One.umin(One), One);
504 }
505 
506 TEST_F(ConstantRangeTest, SMin) {
507   EXPECT_EQ(Full.smin(Full), Full);
508   EXPECT_EQ(Full.smin(Empty), Empty);
509   EXPECT_EQ(Full.smin(Some), ConstantRange(APInt(16, (uint64_t)INT16_MIN),
510                                            APInt(16, 0xaaa)));
511   EXPECT_EQ(Full.smin(Wrap), Full);
512   EXPECT_EQ(Empty.smin(Empty), Empty);
513   EXPECT_EQ(Empty.smin(Some), Empty);
514   EXPECT_EQ(Empty.smin(Wrap), Empty);
515   EXPECT_EQ(Empty.smin(One), Empty);
516   EXPECT_EQ(Some.smin(Some), Some);
517   EXPECT_EQ(Some.smin(Wrap), ConstantRange(APInt(16, (uint64_t)INT16_MIN),
518                                            APInt(16, 0xaaa)));
519   EXPECT_EQ(Some.smin(One), One);
520   // TODO: ConstantRange is currently over-conservative here.
521   EXPECT_EQ(Wrap.smin(Wrap), Full);
522   EXPECT_EQ(Wrap.smin(One), ConstantRange(APInt(16, (uint64_t)INT16_MIN),
523                                           APInt(16, 0xb)));
524   EXPECT_EQ(One.smin(One), One);
525 }
526 
527 TEST_F(ConstantRangeTest, UDiv) {
528   EXPECT_EQ(Full.udiv(Full), Full);
529   EXPECT_EQ(Full.udiv(Empty), Empty);
530   EXPECT_EQ(Full.udiv(One), ConstantRange(APInt(16, 0),
531                                           APInt(16, 0xffff / 0xa + 1)));
532   EXPECT_EQ(Full.udiv(Some), ConstantRange(APInt(16, 0),
533                                            APInt(16, 0xffff / 0xa + 1)));
534   EXPECT_EQ(Full.udiv(Wrap), Full);
535   EXPECT_EQ(Empty.udiv(Empty), Empty);
536   EXPECT_EQ(Empty.udiv(One), Empty);
537   EXPECT_EQ(Empty.udiv(Some), Empty);
538   EXPECT_EQ(Empty.udiv(Wrap), Empty);
539   EXPECT_EQ(One.udiv(One), ConstantRange(APInt(16, 1)));
540   EXPECT_EQ(One.udiv(Some), ConstantRange(APInt(16, 0), APInt(16, 2)));
541   EXPECT_EQ(One.udiv(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xb)));
542   EXPECT_EQ(Some.udiv(Some), ConstantRange(APInt(16, 0), APInt(16, 0x111)));
543   EXPECT_EQ(Some.udiv(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xaaa)));
544   EXPECT_EQ(Wrap.udiv(Wrap), Full);
545 }
546 
547 TEST_F(ConstantRangeTest, Shl) {
548   EXPECT_EQ(Full.shl(Full), Full);
549   EXPECT_EQ(Full.shl(Empty), Empty);
550   EXPECT_EQ(Full.shl(One), Full);    // TODO: [0, (-1 << 0xa) + 1)
551   EXPECT_EQ(Full.shl(Some), Full);   // TODO: [0, (-1 << 0xa) + 1)
552   EXPECT_EQ(Full.shl(Wrap), Full);
553   EXPECT_EQ(Empty.shl(Empty), Empty);
554   EXPECT_EQ(Empty.shl(One), Empty);
555   EXPECT_EQ(Empty.shl(Some), Empty);
556   EXPECT_EQ(Empty.shl(Wrap), Empty);
557   EXPECT_EQ(One.shl(One), ConstantRange(APInt(16, 0xa << 0xa),
558                                         APInt(16, (0xa << 0xa) + 1)));
559   EXPECT_EQ(One.shl(Some), Full);    // TODO: [0xa << 0xa, 0)
560   EXPECT_EQ(One.shl(Wrap), Full);    // TODO: [0xa, 0xa << 14 + 1)
561   EXPECT_EQ(Some.shl(Some), Full);   // TODO: [0xa << 0xa, 0xfc01)
562   EXPECT_EQ(Some.shl(Wrap), Full);   // TODO: [0xa, 0x7ff << 0x5 + 1)
563   EXPECT_EQ(Wrap.shl(Wrap), Full);
564 }
565 
566 TEST_F(ConstantRangeTest, Lshr) {
567   EXPECT_EQ(Full.lshr(Full), Full);
568   EXPECT_EQ(Full.lshr(Empty), Empty);
569   EXPECT_EQ(Full.lshr(One), ConstantRange(APInt(16, 0),
570                                           APInt(16, (0xffff >> 0xa) + 1)));
571   EXPECT_EQ(Full.lshr(Some), ConstantRange(APInt(16, 0),
572                                            APInt(16, (0xffff >> 0xa) + 1)));
573   EXPECT_EQ(Full.lshr(Wrap), Full);
574   EXPECT_EQ(Empty.lshr(Empty), Empty);
575   EXPECT_EQ(Empty.lshr(One), Empty);
576   EXPECT_EQ(Empty.lshr(Some), Empty);
577   EXPECT_EQ(Empty.lshr(Wrap), Empty);
578   EXPECT_EQ(One.lshr(One), ConstantRange(APInt(16, 0)));
579   EXPECT_EQ(One.lshr(Some), ConstantRange(APInt(16, 0)));
580   EXPECT_EQ(One.lshr(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xb)));
581   EXPECT_EQ(Some.lshr(Some), ConstantRange(APInt(16, 0),
582                                            APInt(16, (0xaaa >> 0xa) + 1)));
583   EXPECT_EQ(Some.lshr(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xaaa)));
584   EXPECT_EQ(Wrap.lshr(Wrap), Full);
585 }
586 
587 TEST(ConstantRange, MakeAllowedICmpRegion) {
588   // PR8250
589   ConstantRange SMax = ConstantRange(APInt::getSignedMaxValue(32));
590   EXPECT_TRUE(ConstantRange::makeAllowedICmpRegion(ICmpInst::ICMP_SGT, SMax)
591                   .isEmptySet());
592 }
593 
594 TEST(ConstantRange, MakeSatisfyingICmpRegion) {
595   ConstantRange LowHalf(APInt(8, 0), APInt(8, 128));
596   ConstantRange HighHalf(APInt(8, 128), APInt(8, 0));
597   ConstantRange EmptySet(8, /* isFullSet = */ false);
598 
599   EXPECT_EQ(ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_NE, LowHalf),
600             HighHalf);
601 
602   EXPECT_EQ(
603       ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_NE, HighHalf),
604       LowHalf);
605 
606   EXPECT_TRUE(ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_EQ,
607                                                       HighHalf).isEmptySet());
608 
609   ConstantRange UnsignedSample(APInt(8, 5), APInt(8, 200));
610 
611   EXPECT_EQ(ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_ULT,
612                                                     UnsignedSample),
613             ConstantRange(APInt(8, 0), APInt(8, 5)));
614 
615   EXPECT_EQ(ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_ULE,
616                                                     UnsignedSample),
617             ConstantRange(APInt(8, 0), APInt(8, 6)));
618 
619   EXPECT_EQ(ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_UGT,
620                                                     UnsignedSample),
621             ConstantRange(APInt(8, 200), APInt(8, 0)));
622 
623   EXPECT_EQ(ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_UGE,
624                                                     UnsignedSample),
625             ConstantRange(APInt(8, 199), APInt(8, 0)));
626 
627   ConstantRange SignedSample(APInt(8, -5), APInt(8, 5));
628 
629   EXPECT_EQ(
630       ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_SLT, SignedSample),
631       ConstantRange(APInt(8, -128), APInt(8, -5)));
632 
633   EXPECT_EQ(
634       ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_SLE, SignedSample),
635       ConstantRange(APInt(8, -128), APInt(8, -4)));
636 
637   EXPECT_EQ(
638       ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_SGT, SignedSample),
639       ConstantRange(APInt(8, 5), APInt(8, -128)));
640 
641   EXPECT_EQ(
642       ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_SGE, SignedSample),
643       ConstantRange(APInt(8, 4), APInt(8, -128)));
644 }
645 
646 TEST(ConstantRange, MakeGuaranteedNoWrapRegion) {
647   const int IntMin4Bits = 8;
648   const int IntMax4Bits = 7;
649   typedef OverflowingBinaryOperator OBO;
650 
651   for (int Const : {0, -1, -2, 1, 2, IntMin4Bits, IntMax4Bits}) {
652     APInt C(4, Const, true /* = isSigned */);
653 
654     auto NUWRegion = ConstantRange::makeGuaranteedNoWrapRegion(
655         Instruction::Add, C, OBO::NoUnsignedWrap);
656 
657     EXPECT_FALSE(NUWRegion.isEmptySet());
658 
659     auto NSWRegion = ConstantRange::makeGuaranteedNoWrapRegion(
660         Instruction::Add, C, OBO::NoSignedWrap);
661 
662     EXPECT_FALSE(NSWRegion.isEmptySet());
663 
664     auto NoWrapRegion = ConstantRange::makeGuaranteedNoWrapRegion(
665         Instruction::Add, C, OBO::NoSignedWrap | OBO::NoUnsignedWrap);
666 
667     EXPECT_FALSE(NoWrapRegion.isEmptySet());
668     EXPECT_TRUE(NUWRegion.intersectWith(NSWRegion).contains(NoWrapRegion));
669 
670     for (APInt I = NUWRegion.getLower(), E = NUWRegion.getUpper(); I != E;
671          ++I) {
672       bool Overflow = false;
673       I.uadd_ov(C, Overflow);
674       EXPECT_FALSE(Overflow);
675     }
676 
677     for (APInt I = NSWRegion.getLower(), E = NSWRegion.getUpper(); I != E;
678          ++I) {
679       bool Overflow = false;
680       I.sadd_ov(C, Overflow);
681       EXPECT_FALSE(Overflow);
682     }
683 
684     for (APInt I = NoWrapRegion.getLower(), E = NoWrapRegion.getUpper(); I != E;
685          ++I) {
686       bool Overflow = false;
687 
688       I.sadd_ov(C, Overflow);
689       EXPECT_FALSE(Overflow);
690 
691       I.uadd_ov(C, Overflow);
692       EXPECT_FALSE(Overflow);
693     }
694   }
695 
696   auto NSWForAllValues = ConstantRange::makeGuaranteedNoWrapRegion(
697       Instruction::Add, ConstantRange(32, /* isFullSet = */ true),
698       OBO::NoSignedWrap);
699   EXPECT_TRUE(NSWForAllValues.isSingleElement() &&
700               NSWForAllValues.getSingleElement()->isMinValue());
701 
702   auto NUWForAllValues = ConstantRange::makeGuaranteedNoWrapRegion(
703       Instruction::Add, ConstantRange(32, /* isFullSet = */ true),
704       OBO::NoUnsignedWrap);
705   EXPECT_TRUE(NUWForAllValues.isSingleElement() &&
706               NSWForAllValues.getSingleElement()->isMinValue());
707 
708   auto NUWAndNSWForAllValues = ConstantRange::makeGuaranteedNoWrapRegion(
709       Instruction::Add, ConstantRange(32, /* isFullSet = */ true),
710       OBO::NoUnsignedWrap | OBO::NoSignedWrap);
711   EXPECT_TRUE(NUWAndNSWForAllValues.isSingleElement() &&
712               NSWForAllValues.getSingleElement()->isMinValue());
713 
714   ConstantRange OneToFive(APInt(32, 1), APInt(32, 6));
715   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
716                 Instruction::Add, OneToFive, OBO::NoSignedWrap),
717             ConstantRange(APInt::getSignedMinValue(32),
718                           APInt::getSignedMaxValue(32) - 4));
719   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
720                 Instruction::Add, OneToFive, OBO::NoUnsignedWrap),
721             ConstantRange(APInt::getMinValue(32), APInt::getMinValue(32) - 5));
722   EXPECT_EQ(
723       ConstantRange::makeGuaranteedNoWrapRegion(
724           Instruction::Add, OneToFive, OBO::NoUnsignedWrap | OBO::NoSignedWrap),
725       ConstantRange(APInt::getMinValue(32), APInt::getSignedMaxValue(32) - 4));
726 
727   ConstantRange MinusFiveToMinusTwo(APInt(32, -5), APInt(32, -1));
728   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
729                 Instruction::Add, MinusFiveToMinusTwo, OBO::NoSignedWrap),
730             ConstantRange(APInt::getSignedMinValue(32) + 5,
731                           APInt::getSignedMinValue(32)));
732   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
733                 Instruction::Add, MinusFiveToMinusTwo, OBO::NoUnsignedWrap),
734             ConstantRange(APInt(32, 0), APInt(32, 2)));
735   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
736                 Instruction::Add, MinusFiveToMinusTwo,
737                 OBO::NoUnsignedWrap | OBO::NoSignedWrap),
738             ConstantRange(APInt(32, 0), APInt(32, 2)));
739 
740   ConstantRange MinusOneToOne(APInt(32, -1), APInt(32, 2));
741   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
742                 Instruction::Add, MinusOneToOne, OBO::NoSignedWrap),
743             ConstantRange(APInt::getSignedMinValue(32) + 1,
744                           APInt::getSignedMinValue(32) - 1));
745   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
746                 Instruction::Add, MinusOneToOne, OBO::NoUnsignedWrap),
747             ConstantRange(APInt(32, 0), APInt(32, 1)));
748   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
749                 Instruction::Add, MinusOneToOne,
750                 OBO::NoUnsignedWrap | OBO::NoSignedWrap),
751             ConstantRange(APInt(32, 0), APInt(32, 1)));
752 }
753 
754 TEST(ConstantRange, GetEquivalentICmp) {
755   APInt RHS;
756   CmpInst::Predicate Pred;
757 
758   EXPECT_TRUE(ConstantRange(APInt::getMinValue(32), APInt(32, 100))
759                   .getEquivalentICmp(Pred, RHS));
760   EXPECT_EQ(Pred, CmpInst::ICMP_ULT);
761   EXPECT_EQ(RHS, APInt(32, 100));
762 
763   EXPECT_TRUE(ConstantRange(APInt::getSignedMinValue(32), APInt(32, 100))
764                   .getEquivalentICmp(Pred, RHS));
765   EXPECT_EQ(Pred, CmpInst::ICMP_SLT);
766   EXPECT_EQ(RHS, APInt(32, 100));
767 
768   EXPECT_TRUE(ConstantRange(APInt(32, 100), APInt::getMinValue(32))
769                   .getEquivalentICmp(Pred, RHS));
770   EXPECT_EQ(Pred, CmpInst::ICMP_UGE);
771   EXPECT_EQ(RHS, APInt(32, 100));
772 
773   EXPECT_TRUE(ConstantRange(APInt(32, 100), APInt::getSignedMinValue(32))
774                   .getEquivalentICmp(Pred, RHS));
775   EXPECT_EQ(Pred, CmpInst::ICMP_SGE);
776   EXPECT_EQ(RHS, APInt(32, 100));
777 
778   EXPECT_TRUE(
779       ConstantRange(32, /*isFullSet=*/true).getEquivalentICmp(Pred, RHS));
780   EXPECT_EQ(Pred, CmpInst::ICMP_UGE);
781   EXPECT_EQ(RHS, APInt(32, 0));
782 
783   EXPECT_TRUE(
784       ConstantRange(32, /*isFullSet=*/false).getEquivalentICmp(Pred, RHS));
785   EXPECT_EQ(Pred, CmpInst::ICMP_ULT);
786   EXPECT_EQ(RHS, APInt(32, 0));
787 
788   EXPECT_FALSE(ConstantRange(APInt(32, 100), APInt(32, 200))
789                    .getEquivalentICmp(Pred, RHS));
790 
791   EXPECT_FALSE(ConstantRange(APInt::getSignedMinValue(32) - APInt(32, 100),
792                              APInt::getSignedMinValue(32) + APInt(32, 100))
793                    .getEquivalentICmp(Pred, RHS));
794 
795   EXPECT_FALSE(ConstantRange(APInt::getMinValue(32) - APInt(32, 100),
796                              APInt::getMinValue(32) + APInt(32, 100))
797                    .getEquivalentICmp(Pred, RHS));
798 
799   EXPECT_TRUE(ConstantRange(APInt(32, 100)).getEquivalentICmp(Pred, RHS));
800   EXPECT_EQ(Pred, CmpInst::ICMP_EQ);
801   EXPECT_EQ(RHS, APInt(32, 100));
802 
803   EXPECT_TRUE(
804       ConstantRange(APInt(32, 100)).inverse().getEquivalentICmp(Pred, RHS));
805   EXPECT_EQ(Pred, CmpInst::ICMP_NE);
806   EXPECT_EQ(RHS, APInt(32, 100));
807 
808   EXPECT_TRUE(
809       ConstantRange(APInt(512, 100)).inverse().getEquivalentICmp(Pred, RHS));
810   EXPECT_EQ(Pred, CmpInst::ICMP_NE);
811   EXPECT_EQ(RHS, APInt(512, 100));
812 
813   // NB!  It would be correct for the following four calls to getEquivalentICmp
814   // to return ordered predicates like CmpInst::ICMP_ULT or CmpInst::ICMP_UGT.
815   // However, that's not the case today.
816 
817   EXPECT_TRUE(ConstantRange(APInt(32, 0)).getEquivalentICmp(Pred, RHS));
818   EXPECT_EQ(Pred, CmpInst::ICMP_EQ);
819   EXPECT_EQ(RHS, APInt(32, 0));
820 
821   EXPECT_TRUE(
822       ConstantRange(APInt(32, 0)).inverse().getEquivalentICmp(Pred, RHS));
823   EXPECT_EQ(Pred, CmpInst::ICMP_NE);
824   EXPECT_EQ(RHS, APInt(32, 0));
825 
826   EXPECT_TRUE(ConstantRange(APInt(32, -1)).getEquivalentICmp(Pred, RHS));
827   EXPECT_EQ(Pred, CmpInst::ICMP_EQ);
828   EXPECT_EQ(RHS, APInt(32, -1));
829 
830   EXPECT_TRUE(
831       ConstantRange(APInt(32, -1)).inverse().getEquivalentICmp(Pred, RHS));
832   EXPECT_EQ(Pred, CmpInst::ICMP_NE);
833   EXPECT_EQ(RHS, APInt(32, -1));
834 }
835 
836 }  // anonymous namespace
837