1 //===- ConstantRangeTest.cpp - ConstantRange tests ------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "llvm/ADT/BitVector.h"
10 #include "llvm/IR/ConstantRange.h"
11 #include "llvm/IR/Instructions.h"
12 #include "llvm/IR/Operator.h"
13 #include "llvm/Support/KnownBits.h"
14 #include "gtest/gtest.h"
15 
16 using namespace llvm;
17 
18 namespace {
19 
20 class ConstantRangeTest : public ::testing::Test {
21 protected:
22   static ConstantRange Full;
23   static ConstantRange Empty;
24   static ConstantRange One;
25   static ConstantRange Some;
26   static ConstantRange Wrap;
27 };
28 
29 template<typename Fn>
30 static void EnumerateConstantRanges(unsigned Bits, Fn TestFn) {
31   unsigned Max = 1 << Bits;
32   for (unsigned Lo = 0; Lo < Max; Lo++) {
33     for (unsigned Hi = 0; Hi < Max; Hi++) {
34       // Enforce ConstantRange invariant.
35       if (Lo == Hi && Lo != 0 && Lo != Max - 1)
36         continue;
37 
38       ConstantRange CR(APInt(Bits, Lo), APInt(Bits, Hi));
39       TestFn(CR);
40     }
41   }
42 }
43 
44 template<typename Fn>
45 static void EnumerateTwoConstantRanges(unsigned Bits, Fn TestFn) {
46   EnumerateConstantRanges(Bits, [&](const ConstantRange &CR1) {
47     EnumerateConstantRanges(Bits, [&](const ConstantRange &CR2) {
48       TestFn(CR1, CR2);
49     });
50   });
51 }
52 
53 template<typename Fn>
54 static void ForeachNumInConstantRange(const ConstantRange &CR, Fn TestFn) {
55   if (!CR.isEmptySet()) {
56     APInt N = CR.getLower();
57     do TestFn(N);
58     while (++N != CR.getUpper());
59   }
60 }
61 
62 template<typename Fn1, typename Fn2>
63 static void TestUnsignedUnaryOpExhaustive(
64     Fn1 RangeFn, Fn2 IntFn, bool SkipSignedIntMin = false) {
65   unsigned Bits = 4;
66   EnumerateConstantRanges(Bits, [&](const ConstantRange &CR) {
67     APInt Min = APInt::getMaxValue(Bits);
68     APInt Max = APInt::getMinValue(Bits);
69     ForeachNumInConstantRange(CR, [&](const APInt &N) {
70       if (SkipSignedIntMin && N.isMinSignedValue())
71         return;
72 
73       APInt AbsN = IntFn(N);
74       if (AbsN.ult(Min))
75         Min = AbsN;
76       if (AbsN.ugt(Max))
77         Max = AbsN;
78     });
79 
80     ConstantRange ResultCR = RangeFn(CR);
81     if (Min.ugt(Max)) {
82       EXPECT_TRUE(ResultCR.isEmptySet());
83       return;
84     }
85 
86     ConstantRange Exact = ConstantRange::getNonEmpty(Min, Max + 1);
87     EXPECT_EQ(Exact, ResultCR);
88   });
89 }
90 
91 template<typename Fn1, typename Fn2>
92 static void TestUnsignedBinOpExhaustive(
93     Fn1 RangeFn, Fn2 IntFn,
94     bool SkipZeroRHS = false, bool CorrectnessOnly = false) {
95   unsigned Bits = 4;
96   EnumerateTwoConstantRanges(Bits, [&](const ConstantRange &CR1,
97                                        const ConstantRange &CR2) {
98     APInt Min = APInt::getMaxValue(Bits);
99     APInt Max = APInt::getMinValue(Bits);
100     ForeachNumInConstantRange(CR1, [&](const APInt &N1) {
101       ForeachNumInConstantRange(CR2, [&](const APInt &N2) {
102         if (SkipZeroRHS && N2 == 0)
103           return;
104 
105         APInt N = IntFn(N1, N2);
106         if (N.ult(Min))
107           Min = N;
108         if (N.ugt(Max))
109           Max = N;
110       });
111     });
112 
113     ConstantRange CR = RangeFn(CR1, CR2);
114     if (Min.ugt(Max)) {
115       EXPECT_TRUE(CR.isEmptySet());
116       return;
117     }
118 
119     ConstantRange Exact = ConstantRange::getNonEmpty(Min, Max + 1);
120     if (CorrectnessOnly) {
121       EXPECT_TRUE(CR.contains(Exact));
122     } else {
123       EXPECT_EQ(Exact, CR);
124     }
125   });
126 }
127 
128 template<typename Fn1, typename Fn2>
129 static void TestSignedBinOpExhaustive(
130     Fn1 RangeFn, Fn2 IntFn,
131     bool SkipZeroRHS = false, bool CorrectnessOnly = false) {
132   unsigned Bits = 4;
133   EnumerateTwoConstantRanges(Bits, [&](const ConstantRange &CR1,
134                                        const ConstantRange &CR2) {
135     APInt Min = APInt::getSignedMaxValue(Bits);
136     APInt Max = APInt::getSignedMinValue(Bits);
137     ForeachNumInConstantRange(CR1, [&](const APInt &N1) {
138       ForeachNumInConstantRange(CR2, [&](const APInt &N2) {
139         if (SkipZeroRHS && N2 == 0)
140           return;
141 
142         APInt N = IntFn(N1, N2);
143         if (N.slt(Min))
144           Min = N;
145         if (N.sgt(Max))
146           Max = N;
147       });
148     });
149 
150     ConstantRange CR = RangeFn(CR1, CR2);
151     if (Min.sgt(Max)) {
152       EXPECT_TRUE(CR.isEmptySet());
153       return;
154     }
155 
156     ConstantRange Exact = ConstantRange::getNonEmpty(Min, Max + 1);
157     if (CorrectnessOnly) {
158       EXPECT_TRUE(CR.contains(Exact));
159     } else {
160       EXPECT_EQ(Exact, CR);
161     }
162   });
163 }
164 
165 ConstantRange ConstantRangeTest::Full(16, true);
166 ConstantRange ConstantRangeTest::Empty(16, false);
167 ConstantRange ConstantRangeTest::One(APInt(16, 0xa));
168 ConstantRange ConstantRangeTest::Some(APInt(16, 0xa), APInt(16, 0xaaa));
169 ConstantRange ConstantRangeTest::Wrap(APInt(16, 0xaaa), APInt(16, 0xa));
170 
171 TEST_F(ConstantRangeTest, Basics) {
172   EXPECT_TRUE(Full.isFullSet());
173   EXPECT_FALSE(Full.isEmptySet());
174   EXPECT_TRUE(Full.inverse().isEmptySet());
175   EXPECT_FALSE(Full.isWrappedSet());
176   EXPECT_TRUE(Full.contains(APInt(16, 0x0)));
177   EXPECT_TRUE(Full.contains(APInt(16, 0x9)));
178   EXPECT_TRUE(Full.contains(APInt(16, 0xa)));
179   EXPECT_TRUE(Full.contains(APInt(16, 0xaa9)));
180   EXPECT_TRUE(Full.contains(APInt(16, 0xaaa)));
181 
182   EXPECT_FALSE(Empty.isFullSet());
183   EXPECT_TRUE(Empty.isEmptySet());
184   EXPECT_TRUE(Empty.inverse().isFullSet());
185   EXPECT_FALSE(Empty.isWrappedSet());
186   EXPECT_FALSE(Empty.contains(APInt(16, 0x0)));
187   EXPECT_FALSE(Empty.contains(APInt(16, 0x9)));
188   EXPECT_FALSE(Empty.contains(APInt(16, 0xa)));
189   EXPECT_FALSE(Empty.contains(APInt(16, 0xaa9)));
190   EXPECT_FALSE(Empty.contains(APInt(16, 0xaaa)));
191 
192   EXPECT_FALSE(One.isFullSet());
193   EXPECT_FALSE(One.isEmptySet());
194   EXPECT_FALSE(One.isWrappedSet());
195   EXPECT_FALSE(One.contains(APInt(16, 0x0)));
196   EXPECT_FALSE(One.contains(APInt(16, 0x9)));
197   EXPECT_TRUE(One.contains(APInt(16, 0xa)));
198   EXPECT_FALSE(One.contains(APInt(16, 0xaa9)));
199   EXPECT_FALSE(One.contains(APInt(16, 0xaaa)));
200   EXPECT_FALSE(One.inverse().contains(APInt(16, 0xa)));
201 
202   EXPECT_FALSE(Some.isFullSet());
203   EXPECT_FALSE(Some.isEmptySet());
204   EXPECT_FALSE(Some.isWrappedSet());
205   EXPECT_FALSE(Some.contains(APInt(16, 0x0)));
206   EXPECT_FALSE(Some.contains(APInt(16, 0x9)));
207   EXPECT_TRUE(Some.contains(APInt(16, 0xa)));
208   EXPECT_TRUE(Some.contains(APInt(16, 0xaa9)));
209   EXPECT_FALSE(Some.contains(APInt(16, 0xaaa)));
210 
211   EXPECT_FALSE(Wrap.isFullSet());
212   EXPECT_FALSE(Wrap.isEmptySet());
213   EXPECT_TRUE(Wrap.isWrappedSet());
214   EXPECT_TRUE(Wrap.contains(APInt(16, 0x0)));
215   EXPECT_TRUE(Wrap.contains(APInt(16, 0x9)));
216   EXPECT_FALSE(Wrap.contains(APInt(16, 0xa)));
217   EXPECT_FALSE(Wrap.contains(APInt(16, 0xaa9)));
218   EXPECT_TRUE(Wrap.contains(APInt(16, 0xaaa)));
219 }
220 
221 TEST_F(ConstantRangeTest, Equality) {
222   EXPECT_EQ(Full, Full);
223   EXPECT_EQ(Empty, Empty);
224   EXPECT_EQ(One, One);
225   EXPECT_EQ(Some, Some);
226   EXPECT_EQ(Wrap, Wrap);
227   EXPECT_NE(Full, Empty);
228   EXPECT_NE(Full, One);
229   EXPECT_NE(Full, Some);
230   EXPECT_NE(Full, Wrap);
231   EXPECT_NE(Empty, One);
232   EXPECT_NE(Empty, Some);
233   EXPECT_NE(Empty, Wrap);
234   EXPECT_NE(One, Some);
235   EXPECT_NE(One, Wrap);
236   EXPECT_NE(Some, Wrap);
237 }
238 
239 TEST_F(ConstantRangeTest, SingleElement) {
240   EXPECT_EQ(Full.getSingleElement(), static_cast<APInt *>(nullptr));
241   EXPECT_EQ(Empty.getSingleElement(), static_cast<APInt *>(nullptr));
242   EXPECT_EQ(Full.getSingleMissingElement(), static_cast<APInt *>(nullptr));
243   EXPECT_EQ(Empty.getSingleMissingElement(), static_cast<APInt *>(nullptr));
244 
245   EXPECT_EQ(*One.getSingleElement(), APInt(16, 0xa));
246   EXPECT_EQ(Some.getSingleElement(), static_cast<APInt *>(nullptr));
247   EXPECT_EQ(Wrap.getSingleElement(), static_cast<APInt *>(nullptr));
248 
249   EXPECT_EQ(One.getSingleMissingElement(), static_cast<APInt *>(nullptr));
250   EXPECT_EQ(Some.getSingleMissingElement(), static_cast<APInt *>(nullptr));
251 
252   ConstantRange OneInverse = One.inverse();
253   EXPECT_EQ(*OneInverse.getSingleMissingElement(), *One.getSingleElement());
254 
255   EXPECT_FALSE(Full.isSingleElement());
256   EXPECT_FALSE(Empty.isSingleElement());
257   EXPECT_TRUE(One.isSingleElement());
258   EXPECT_FALSE(Some.isSingleElement());
259   EXPECT_FALSE(Wrap.isSingleElement());
260 }
261 
262 TEST_F(ConstantRangeTest, GetMinsAndMaxes) {
263   EXPECT_EQ(Full.getUnsignedMax(), APInt(16, UINT16_MAX));
264   EXPECT_EQ(One.getUnsignedMax(), APInt(16, 0xa));
265   EXPECT_EQ(Some.getUnsignedMax(), APInt(16, 0xaa9));
266   EXPECT_EQ(Wrap.getUnsignedMax(), APInt(16, UINT16_MAX));
267 
268   EXPECT_EQ(Full.getUnsignedMin(), APInt(16, 0));
269   EXPECT_EQ(One.getUnsignedMin(), APInt(16, 0xa));
270   EXPECT_EQ(Some.getUnsignedMin(), APInt(16, 0xa));
271   EXPECT_EQ(Wrap.getUnsignedMin(), APInt(16, 0));
272 
273   EXPECT_EQ(Full.getSignedMax(), APInt(16, INT16_MAX));
274   EXPECT_EQ(One.getSignedMax(), APInt(16, 0xa));
275   EXPECT_EQ(Some.getSignedMax(), APInt(16, 0xaa9));
276   EXPECT_EQ(Wrap.getSignedMax(), APInt(16, INT16_MAX));
277 
278   EXPECT_EQ(Full.getSignedMin(), APInt(16, (uint64_t)INT16_MIN));
279   EXPECT_EQ(One.getSignedMin(), APInt(16, 0xa));
280   EXPECT_EQ(Some.getSignedMin(), APInt(16, 0xa));
281   EXPECT_EQ(Wrap.getSignedMin(), APInt(16, (uint64_t)INT16_MIN));
282 
283   // Found by Klee
284   EXPECT_EQ(ConstantRange(APInt(4, 7), APInt(4, 0)).getSignedMax(),
285             APInt(4, 7));
286 }
287 
288 TEST_F(ConstantRangeTest, SignWrapped) {
289   EXPECT_FALSE(Full.isSignWrappedSet());
290   EXPECT_FALSE(Empty.isSignWrappedSet());
291   EXPECT_FALSE(One.isSignWrappedSet());
292   EXPECT_FALSE(Some.isSignWrappedSet());
293   EXPECT_TRUE(Wrap.isSignWrappedSet());
294 
295   EXPECT_FALSE(ConstantRange(APInt(8, 127), APInt(8, 128)).isSignWrappedSet());
296   EXPECT_TRUE(ConstantRange(APInt(8, 127), APInt(8, 129)).isSignWrappedSet());
297   EXPECT_FALSE(ConstantRange(APInt(8, 128), APInt(8, 129)).isSignWrappedSet());
298   EXPECT_TRUE(ConstantRange(APInt(8, 10), APInt(8, 9)).isSignWrappedSet());
299   EXPECT_TRUE(ConstantRange(APInt(8, 10), APInt(8, 250)).isSignWrappedSet());
300   EXPECT_FALSE(ConstantRange(APInt(8, 250), APInt(8, 10)).isSignWrappedSet());
301   EXPECT_FALSE(ConstantRange(APInt(8, 250), APInt(8, 251)).isSignWrappedSet());
302 }
303 
304 TEST_F(ConstantRangeTest, UpperWrapped) {
305   // The behavior here is the same as for isWrappedSet() / isSignWrappedSet().
306   EXPECT_FALSE(Full.isUpperWrapped());
307   EXPECT_FALSE(Empty.isUpperWrapped());
308   EXPECT_FALSE(One.isUpperWrapped());
309   EXPECT_FALSE(Some.isUpperWrapped());
310   EXPECT_TRUE(Wrap.isUpperWrapped());
311   EXPECT_FALSE(Full.isUpperSignWrapped());
312   EXPECT_FALSE(Empty.isUpperSignWrapped());
313   EXPECT_FALSE(One.isUpperSignWrapped());
314   EXPECT_FALSE(Some.isUpperSignWrapped());
315   EXPECT_TRUE(Wrap.isUpperSignWrapped());
316 
317   // The behavior differs if Upper is the Min/SignedMin value.
318   ConstantRange CR1(APInt(8, 42), APInt::getMinValue(8));
319   EXPECT_FALSE(CR1.isWrappedSet());
320   EXPECT_TRUE(CR1.isUpperWrapped());
321 
322   ConstantRange CR2(APInt(8, 42), APInt::getSignedMinValue(8));
323   EXPECT_FALSE(CR2.isSignWrappedSet());
324   EXPECT_TRUE(CR2.isUpperSignWrapped());
325 }
326 
327 TEST_F(ConstantRangeTest, Trunc) {
328   ConstantRange TFull = Full.truncate(10);
329   ConstantRange TEmpty = Empty.truncate(10);
330   ConstantRange TOne = One.truncate(10);
331   ConstantRange TSome = Some.truncate(10);
332   ConstantRange TWrap = Wrap.truncate(10);
333   EXPECT_TRUE(TFull.isFullSet());
334   EXPECT_TRUE(TEmpty.isEmptySet());
335   EXPECT_EQ(TOne, ConstantRange(One.getLower().trunc(10),
336                                 One.getUpper().trunc(10)));
337   EXPECT_TRUE(TSome.isFullSet());
338   EXPECT_TRUE(TWrap.isFullSet());
339 
340   // trunc([2, 5), 3->2) = [2, 1)
341   ConstantRange TwoFive(APInt(3, 2), APInt(3, 5));
342   EXPECT_EQ(TwoFive.truncate(2), ConstantRange(APInt(2, 2), APInt(2, 1)));
343 
344   // trunc([2, 6), 3->2) = full
345   ConstantRange TwoSix(APInt(3, 2), APInt(3, 6));
346   EXPECT_TRUE(TwoSix.truncate(2).isFullSet());
347 
348   // trunc([5, 7), 3->2) = [1, 3)
349   ConstantRange FiveSeven(APInt(3, 5), APInt(3, 7));
350   EXPECT_EQ(FiveSeven.truncate(2), ConstantRange(APInt(2, 1), APInt(2, 3)));
351 
352   // trunc([7, 1), 3->2) = [3, 1)
353   ConstantRange SevenOne(APInt(3, 7), APInt(3, 1));
354   EXPECT_EQ(SevenOne.truncate(2), ConstantRange(APInt(2, 3), APInt(2, 1)));
355 }
356 
357 TEST_F(ConstantRangeTest, ZExt) {
358   ConstantRange ZFull = Full.zeroExtend(20);
359   ConstantRange ZEmpty = Empty.zeroExtend(20);
360   ConstantRange ZOne = One.zeroExtend(20);
361   ConstantRange ZSome = Some.zeroExtend(20);
362   ConstantRange ZWrap = Wrap.zeroExtend(20);
363   EXPECT_EQ(ZFull, ConstantRange(APInt(20, 0), APInt(20, 0x10000)));
364   EXPECT_TRUE(ZEmpty.isEmptySet());
365   EXPECT_EQ(ZOne, ConstantRange(One.getLower().zext(20),
366                                 One.getUpper().zext(20)));
367   EXPECT_EQ(ZSome, ConstantRange(Some.getLower().zext(20),
368                                  Some.getUpper().zext(20)));
369   EXPECT_EQ(ZWrap, ConstantRange(APInt(20, 0), APInt(20, 0x10000)));
370 
371   // zext([5, 0), 3->7) = [5, 8)
372   ConstantRange FiveZero(APInt(3, 5), APInt(3, 0));
373   EXPECT_EQ(FiveZero.zeroExtend(7), ConstantRange(APInt(7, 5), APInt(7, 8)));
374 }
375 
376 TEST_F(ConstantRangeTest, SExt) {
377   ConstantRange SFull = Full.signExtend(20);
378   ConstantRange SEmpty = Empty.signExtend(20);
379   ConstantRange SOne = One.signExtend(20);
380   ConstantRange SSome = Some.signExtend(20);
381   ConstantRange SWrap = Wrap.signExtend(20);
382   EXPECT_EQ(SFull, ConstantRange(APInt(20, (uint64_t)INT16_MIN, true),
383                                  APInt(20, INT16_MAX + 1, true)));
384   EXPECT_TRUE(SEmpty.isEmptySet());
385   EXPECT_EQ(SOne, ConstantRange(One.getLower().sext(20),
386                                 One.getUpper().sext(20)));
387   EXPECT_EQ(SSome, ConstantRange(Some.getLower().sext(20),
388                                  Some.getUpper().sext(20)));
389   EXPECT_EQ(SWrap, ConstantRange(APInt(20, (uint64_t)INT16_MIN, true),
390                                  APInt(20, INT16_MAX + 1, true)));
391 
392   EXPECT_EQ(ConstantRange(APInt(8, 120), APInt(8, 140)).signExtend(16),
393             ConstantRange(APInt(16, -128), APInt(16, 128)));
394 
395   EXPECT_EQ(ConstantRange(APInt(16, 0x0200), APInt(16, 0x8000)).signExtend(19),
396             ConstantRange(APInt(19, 0x0200), APInt(19, 0x8000)));
397 }
398 
399 TEST_F(ConstantRangeTest, IntersectWith) {
400   EXPECT_EQ(Empty.intersectWith(Full), Empty);
401   EXPECT_EQ(Empty.intersectWith(Empty), Empty);
402   EXPECT_EQ(Empty.intersectWith(One), Empty);
403   EXPECT_EQ(Empty.intersectWith(Some), Empty);
404   EXPECT_EQ(Empty.intersectWith(Wrap), Empty);
405   EXPECT_EQ(Full.intersectWith(Full), Full);
406   EXPECT_EQ(Some.intersectWith(Some), Some);
407   EXPECT_EQ(Some.intersectWith(One), One);
408   EXPECT_EQ(Full.intersectWith(One), One);
409   EXPECT_EQ(Full.intersectWith(Some), Some);
410   EXPECT_EQ(Some.intersectWith(Wrap), Empty);
411   EXPECT_EQ(One.intersectWith(Wrap), Empty);
412   EXPECT_EQ(One.intersectWith(Wrap), Wrap.intersectWith(One));
413 
414   // Klee generated testcase from PR4545.
415   // The intersection of i16 [4, 2) and [6, 5) is disjoint, looking like
416   // 01..4.6789ABCDEF where the dots represent values not in the intersection.
417   ConstantRange LHS(APInt(16, 4), APInt(16, 2));
418   ConstantRange RHS(APInt(16, 6), APInt(16, 5));
419   EXPECT_TRUE(LHS.intersectWith(RHS) == LHS);
420 
421   // previous bug: intersection of [min, 3) and [2, max) should be 2
422   LHS = ConstantRange(APInt(32, -2147483646), APInt(32, 3));
423   RHS = ConstantRange(APInt(32, 2), APInt(32, 2147483646));
424   EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 2)));
425 
426   // [2, 0) /\ [4, 3) = [2, 0)
427   LHS = ConstantRange(APInt(32, 2), APInt(32, 0));
428   RHS = ConstantRange(APInt(32, 4), APInt(32, 3));
429   EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 2), APInt(32, 0)));
430 
431   // [2, 0) /\ [4, 2) = [4, 0)
432   LHS = ConstantRange(APInt(32, 2), APInt(32, 0));
433   RHS = ConstantRange(APInt(32, 4), APInt(32, 2));
434   EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 4), APInt(32, 0)));
435 
436   // [4, 2) /\ [5, 1) = [5, 1)
437   LHS = ConstantRange(APInt(32, 4), APInt(32, 2));
438   RHS = ConstantRange(APInt(32, 5), APInt(32, 1));
439   EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 5), APInt(32, 1)));
440 
441   // [2, 0) /\ [7, 4) = [7, 4)
442   LHS = ConstantRange(APInt(32, 2), APInt(32, 0));
443   RHS = ConstantRange(APInt(32, 7), APInt(32, 4));
444   EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 7), APInt(32, 4)));
445 
446   // [4, 2) /\ [1, 0) = [1, 0)
447   LHS = ConstantRange(APInt(32, 4), APInt(32, 2));
448   RHS = ConstantRange(APInt(32, 1), APInt(32, 0));
449   EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 4), APInt(32, 2)));
450 
451   // [15, 0) /\ [7, 6) = [15, 0)
452   LHS = ConstantRange(APInt(32, 15), APInt(32, 0));
453   RHS = ConstantRange(APInt(32, 7), APInt(32, 6));
454   EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 15), APInt(32, 0)));
455 }
456 
457 template<typename Fn1, typename Fn2>
458 void testBinarySetOperationExhaustive(Fn1 OpFn, Fn2 InResultFn) {
459   unsigned Bits = 4;
460   EnumerateTwoConstantRanges(Bits,
461       [=](const ConstantRange &CR1, const ConstantRange &CR2) {
462         // Collect up to three contiguous unsigned ranges. The HaveInterrupt
463         // variables are used determine when we have to switch to the next
464         // range because the previous one ended.
465         APInt Lower1(Bits, 0), Upper1(Bits, 0);
466         APInt Lower2(Bits, 0), Upper2(Bits, 0);
467         APInt Lower3(Bits, 0), Upper3(Bits, 0);
468         bool HaveRange1 = false, HaveInterrupt1 = false;
469         bool HaveRange2 = false, HaveInterrupt2 = false;
470         bool HaveRange3 = false, HaveInterrupt3 = false;
471 
472         APInt Num(Bits, 0);
473         for (unsigned I = 0, Limit = 1 << Bits; I < Limit; ++I, ++Num) {
474           if (!InResultFn(CR1, CR2, Num)) {
475             if (HaveRange3)
476               HaveInterrupt3 = true;
477             else if (HaveRange2)
478               HaveInterrupt2 = true;
479             else if (HaveRange1)
480               HaveInterrupt1 = true;
481             continue;
482           }
483 
484           if (HaveRange3) {
485             Upper3 = Num;
486           } else if (HaveInterrupt2) {
487             HaveRange3 = true;
488             Lower3 = Upper3 = Num;
489           } else if (HaveRange2) {
490             Upper2 = Num;
491           } else if (HaveInterrupt1) {
492             HaveRange2 = true;
493             Lower2 = Upper2 = Num;
494           } else if (HaveRange1) {
495             Upper1 = Num;
496           } else {
497             HaveRange1 = true;
498             Lower1 = Upper1 = Num;
499           }
500         }
501 
502         (void)HaveInterrupt3;
503         assert(!HaveInterrupt3 && "Should have at most three ranges");
504 
505         ConstantRange SmallestCR = OpFn(CR1, CR2, ConstantRange::Smallest);
506         ConstantRange UnsignedCR = OpFn(CR1, CR2, ConstantRange::Unsigned);
507         ConstantRange SignedCR = OpFn(CR1, CR2, ConstantRange::Signed);
508 
509         if (!HaveRange1) {
510           EXPECT_TRUE(SmallestCR.isEmptySet());
511           EXPECT_TRUE(UnsignedCR.isEmptySet());
512           EXPECT_TRUE(SignedCR.isEmptySet());
513           return;
514         }
515 
516         if (!HaveRange2) {
517           if (Lower1 == Upper1 + 1) {
518             EXPECT_TRUE(SmallestCR.isFullSet());
519             EXPECT_TRUE(UnsignedCR.isFullSet());
520             EXPECT_TRUE(SignedCR.isFullSet());
521           } else {
522             ConstantRange Expected(Lower1, Upper1 + 1);
523             EXPECT_EQ(Expected, SmallestCR);
524             EXPECT_EQ(Expected, UnsignedCR);
525             EXPECT_EQ(Expected, SignedCR);
526           }
527           return;
528         }
529 
530         ConstantRange Variant1(Bits, /*full*/ true);
531         ConstantRange Variant2(Bits, /*full*/ true);
532         if (!HaveRange3) {
533           // Compute the two possible ways to cover two disjoint ranges.
534           if (Lower1 != Upper2 + 1)
535             Variant1 = ConstantRange(Lower1, Upper2 + 1);
536           if (Lower2 != Upper1 + 1)
537             Variant2 = ConstantRange(Lower2, Upper1 + 1);
538         } else {
539           // If we have three ranges, the first and last one have to be adjacent
540           // to the unsigned domain. It's better to think of this as having two
541           // holes, and we can construct one range using each hole.
542           assert(Lower1.isNullValue() && Upper3.isMaxValue());
543           Variant1 = ConstantRange(Lower2, Upper1 + 1);
544           Variant2 = ConstantRange(Lower3, Upper2 + 1);
545         }
546 
547         // Smallest: Smaller set, then any set.
548         if (Variant1.isSizeStrictlySmallerThan(Variant2))
549           EXPECT_EQ(Variant1, SmallestCR);
550         else if (Variant2.isSizeStrictlySmallerThan(Variant1))
551           EXPECT_EQ(Variant2, SmallestCR);
552         else
553           EXPECT_TRUE(Variant1 == SmallestCR || Variant2 == SmallestCR);
554 
555         // Unsigned: Non-wrapped set, then smaller set, then any set.
556         bool Variant1Full = Variant1.isFullSet() || Variant1.isWrappedSet();
557         bool Variant2Full = Variant2.isFullSet() || Variant2.isWrappedSet();
558         if (!Variant1Full && Variant2Full)
559           EXPECT_EQ(Variant1, UnsignedCR);
560         else if (Variant1Full && !Variant2Full)
561           EXPECT_EQ(Variant2, UnsignedCR);
562         else if (Variant1.isSizeStrictlySmallerThan(Variant2))
563           EXPECT_EQ(Variant1, UnsignedCR);
564         else if (Variant2.isSizeStrictlySmallerThan(Variant1))
565           EXPECT_EQ(Variant2, UnsignedCR);
566         else
567           EXPECT_TRUE(Variant1 == UnsignedCR || Variant2 == UnsignedCR);
568 
569         // Signed: Signed non-wrapped set, then smaller set, then any set.
570         Variant1Full = Variant1.isFullSet() || Variant1.isSignWrappedSet();
571         Variant2Full = Variant2.isFullSet() || Variant2.isSignWrappedSet();
572         if (!Variant1Full && Variant2Full)
573           EXPECT_EQ(Variant1, SignedCR);
574         else if (Variant1Full && !Variant2Full)
575           EXPECT_EQ(Variant2, SignedCR);
576         else if (Variant1.isSizeStrictlySmallerThan(Variant2))
577           EXPECT_EQ(Variant1, SignedCR);
578         else if (Variant2.isSizeStrictlySmallerThan(Variant1))
579           EXPECT_EQ(Variant2, SignedCR);
580         else
581           EXPECT_TRUE(Variant1 == SignedCR || Variant2 == SignedCR);
582       });
583 }
584 
585 TEST_F(ConstantRangeTest, IntersectWithExhaustive) {
586   testBinarySetOperationExhaustive(
587       [](const ConstantRange &CR1, const ConstantRange &CR2,
588          ConstantRange::PreferredRangeType Type) {
589         return CR1.intersectWith(CR2, Type);
590       },
591       [](const ConstantRange &CR1, const ConstantRange &CR2, const APInt &N) {
592         return CR1.contains(N) && CR2.contains(N);
593       });
594 }
595 
596 TEST_F(ConstantRangeTest, UnionWithExhaustive) {
597   testBinarySetOperationExhaustive(
598       [](const ConstantRange &CR1, const ConstantRange &CR2,
599          ConstantRange::PreferredRangeType Type) {
600         return CR1.unionWith(CR2, Type);
601       },
602       [](const ConstantRange &CR1, const ConstantRange &CR2, const APInt &N) {
603         return CR1.contains(N) || CR2.contains(N);
604       });
605 }
606 
607 TEST_F(ConstantRangeTest, UnionWith) {
608   EXPECT_EQ(Wrap.unionWith(One),
609             ConstantRange(APInt(16, 0xaaa), APInt(16, 0xb)));
610   EXPECT_EQ(One.unionWith(Wrap), Wrap.unionWith(One));
611   EXPECT_EQ(Empty.unionWith(Empty), Empty);
612   EXPECT_EQ(Full.unionWith(Full), Full);
613   EXPECT_EQ(Some.unionWith(Wrap), Full);
614 
615   // PR4545
616   EXPECT_EQ(ConstantRange(APInt(16, 14), APInt(16, 1)).unionWith(
617                                     ConstantRange(APInt(16, 0), APInt(16, 8))),
618             ConstantRange(APInt(16, 14), APInt(16, 8)));
619   EXPECT_EQ(ConstantRange(APInt(16, 6), APInt(16, 4)).unionWith(
620                                     ConstantRange(APInt(16, 4), APInt(16, 0))),
621             ConstantRange::getFull(16));
622   EXPECT_EQ(ConstantRange(APInt(16, 1), APInt(16, 0)).unionWith(
623                                     ConstantRange(APInt(16, 2), APInt(16, 1))),
624             ConstantRange::getFull(16));
625 }
626 
627 TEST_F(ConstantRangeTest, SetDifference) {
628   EXPECT_EQ(Full.difference(Empty), Full);
629   EXPECT_EQ(Full.difference(Full), Empty);
630   EXPECT_EQ(Empty.difference(Empty), Empty);
631   EXPECT_EQ(Empty.difference(Full), Empty);
632 
633   ConstantRange A(APInt(16, 3), APInt(16, 7));
634   ConstantRange B(APInt(16, 5), APInt(16, 9));
635   ConstantRange C(APInt(16, 3), APInt(16, 5));
636   ConstantRange D(APInt(16, 7), APInt(16, 9));
637   ConstantRange E(APInt(16, 5), APInt(16, 4));
638   ConstantRange F(APInt(16, 7), APInt(16, 3));
639   EXPECT_EQ(A.difference(B), C);
640   EXPECT_EQ(B.difference(A), D);
641   EXPECT_EQ(E.difference(A), F);
642 }
643 
644 TEST_F(ConstantRangeTest, getActiveBits) {
645   unsigned Bits = 4;
646   EnumerateConstantRanges(Bits, [&](const ConstantRange &CR) {
647     unsigned Exact = 0;
648     ForeachNumInConstantRange(CR, [&](const APInt &N) {
649       Exact = std::max(Exact, N.getActiveBits());
650     });
651 
652     unsigned ResultCR = CR.getActiveBits();
653     EXPECT_EQ(Exact, ResultCR);
654   });
655 }
656 TEST_F(ConstantRangeTest, losslessUnsignedTruncationZeroext) {
657   unsigned Bits = 4;
658   EnumerateConstantRanges(Bits, [&](const ConstantRange &CR) {
659     unsigned MinBitWidth = CR.getActiveBits();
660     if (MinBitWidth == 0) {
661       EXPECT_TRUE(CR.isEmptySet() || (CR.isSingleElement() &&
662                                       CR.getSingleElement()->isNullValue()));
663       return;
664     }
665     if (MinBitWidth == Bits)
666       return;
667     EXPECT_EQ(CR, CR.truncate(MinBitWidth).zeroExtend(Bits));
668   });
669 }
670 
671 TEST_F(ConstantRangeTest, getMinSignedBits) {
672   unsigned Bits = 4;
673   EnumerateConstantRanges(Bits, [&](const ConstantRange &CR) {
674     unsigned Exact = 0;
675     ForeachNumInConstantRange(CR, [&](const APInt &N) {
676       Exact = std::max(Exact, N.getMinSignedBits());
677     });
678 
679     unsigned ResultCR = CR.getMinSignedBits();
680     EXPECT_EQ(Exact, ResultCR);
681   });
682 }
683 TEST_F(ConstantRangeTest, losslessSignedTruncationSignext) {
684   unsigned Bits = 4;
685   EnumerateConstantRanges(Bits, [&](const ConstantRange &CR) {
686     unsigned MinBitWidth = CR.getMinSignedBits();
687     if (MinBitWidth == 0) {
688       EXPECT_TRUE(CR.isEmptySet());
689       return;
690     }
691     if (MinBitWidth == Bits)
692       return;
693     EXPECT_EQ(CR, CR.truncate(MinBitWidth).signExtend(Bits));
694   });
695 }
696 
697 TEST_F(ConstantRangeTest, SubtractAPInt) {
698   EXPECT_EQ(Full.subtract(APInt(16, 4)), Full);
699   EXPECT_EQ(Empty.subtract(APInt(16, 4)), Empty);
700   EXPECT_EQ(Some.subtract(APInt(16, 4)),
701             ConstantRange(APInt(16, 0x6), APInt(16, 0xaa6)));
702   EXPECT_EQ(Wrap.subtract(APInt(16, 4)),
703             ConstantRange(APInt(16, 0xaa6), APInt(16, 0x6)));
704   EXPECT_EQ(One.subtract(APInt(16, 4)),
705             ConstantRange(APInt(16, 0x6)));
706 }
707 
708 TEST_F(ConstantRangeTest, Add) {
709   EXPECT_EQ(Full.add(APInt(16, 4)), Full);
710   EXPECT_EQ(Full.add(Full), Full);
711   EXPECT_EQ(Full.add(Empty), Empty);
712   EXPECT_EQ(Full.add(One), Full);
713   EXPECT_EQ(Full.add(Some), Full);
714   EXPECT_EQ(Full.add(Wrap), Full);
715   EXPECT_EQ(Empty.add(Empty), Empty);
716   EXPECT_EQ(Empty.add(One), Empty);
717   EXPECT_EQ(Empty.add(Some), Empty);
718   EXPECT_EQ(Empty.add(Wrap), Empty);
719   EXPECT_EQ(Empty.add(APInt(16, 4)), Empty);
720   EXPECT_EQ(Some.add(APInt(16, 4)),
721             ConstantRange(APInt(16, 0xe), APInt(16, 0xaae)));
722   EXPECT_EQ(Wrap.add(APInt(16, 4)),
723             ConstantRange(APInt(16, 0xaae), APInt(16, 0xe)));
724   EXPECT_EQ(One.add(APInt(16, 4)),
725             ConstantRange(APInt(16, 0xe)));
726 }
727 
728 template <typename Fn1, typename Fn2>
729 static void TestAddWithNoSignedWrapExhaustive(Fn1 RangeFn, Fn2 IntFn) {
730   unsigned Bits = 4;
731   EnumerateTwoConstantRanges(Bits, [&](const ConstantRange &CR1,
732                                        const ConstantRange &CR2) {
733     ConstantRange CR = RangeFn(CR1, CR2);
734     APInt Min = APInt::getSignedMaxValue(Bits);
735     APInt Max = APInt::getSignedMinValue(Bits);
736     bool AllOverflow = true;
737     ForeachNumInConstantRange(CR1, [&](const APInt &N1) {
738       ForeachNumInConstantRange(CR2, [&](const APInt &N2) {
739         bool IsOverflow = false;
740         APInt N = IntFn(IsOverflow, N1, N2);
741         if (!IsOverflow) {
742           AllOverflow = false;
743           if (N.slt(Min))
744             Min = N;
745           if (N.sgt(Max))
746             Max = N;
747           EXPECT_TRUE(CR.contains(N));
748         }
749       });
750     });
751 
752     EXPECT_EQ(CR.isEmptySet(), AllOverflow);
753 
754     if (!CR1.isSignWrappedSet() && !CR2.isSignWrappedSet()) {
755       if (Min.sgt(Max)) {
756         EXPECT_TRUE(CR.isEmptySet());
757         return;
758       }
759 
760       ConstantRange Exact = ConstantRange::getNonEmpty(Min, Max + 1);
761       EXPECT_EQ(Exact, CR);
762     }
763   });
764 }
765 
766 template <typename Fn1, typename Fn2>
767 static void TestAddWithNoUnsignedWrapExhaustive(Fn1 RangeFn, Fn2 IntFn) {
768   unsigned Bits = 4;
769   EnumerateTwoConstantRanges(Bits, [&](const ConstantRange &CR1,
770                                        const ConstantRange &CR2) {
771     ConstantRange CR = RangeFn(CR1, CR2);
772     APInt Min = APInt::getMaxValue(Bits);
773     APInt Max = APInt::getMinValue(Bits);
774     bool AllOverflow = true;
775     ForeachNumInConstantRange(CR1, [&](const APInt &N1) {
776       ForeachNumInConstantRange(CR2, [&](const APInt &N2) {
777         bool IsOverflow = false;
778         APInt N = IntFn(IsOverflow, N1, N2);
779         if (!IsOverflow) {
780           AllOverflow = false;
781           if (N.ult(Min))
782             Min = N;
783           if (N.ugt(Max))
784             Max = N;
785           EXPECT_TRUE(CR.contains(N));
786         }
787       });
788     });
789 
790     EXPECT_EQ(CR.isEmptySet(), AllOverflow);
791 
792     if (!CR1.isWrappedSet() && !CR2.isWrappedSet()) {
793       if (Min.ugt(Max)) {
794         EXPECT_TRUE(CR.isEmptySet());
795         return;
796       }
797 
798       ConstantRange Exact = ConstantRange::getNonEmpty(Min, Max + 1);
799       EXPECT_EQ(Exact, CR);
800     }
801   });
802 }
803 
804 template <typename Fn1, typename Fn2, typename Fn3>
805 static void TestAddWithNoSignedUnsignedWrapExhaustive(Fn1 RangeFn,
806                                                       Fn2 IntFnSigned,
807                                                       Fn3 IntFnUnsigned) {
808   unsigned Bits = 4;
809   EnumerateTwoConstantRanges(
810       Bits, [&](const ConstantRange &CR1, const ConstantRange &CR2) {
811         ConstantRange CR = RangeFn(CR1, CR2);
812         APInt UMin = APInt::getMaxValue(Bits);
813         APInt UMax = APInt::getMinValue(Bits);
814         APInt SMin = APInt::getSignedMaxValue(Bits);
815         APInt SMax = APInt::getSignedMinValue(Bits);
816         bool AllOverflow = true;
817         ForeachNumInConstantRange(CR1, [&](const APInt &N1) {
818           ForeachNumInConstantRange(CR2, [&](const APInt &N2) {
819             bool IsOverflow = false, IsSignedOverflow = false;
820             APInt N = IntFnSigned(IsSignedOverflow, N1, N2);
821             (void) IntFnUnsigned(IsOverflow, N1, N2);
822             if (!IsSignedOverflow && !IsOverflow) {
823               AllOverflow = false;
824               if (N.slt(SMin))
825                 SMin = N;
826               if (N.sgt(SMax))
827                 SMax = N;
828               if (N.ult(UMin))
829                 UMin = N;
830               if (N.ugt(UMax))
831                 UMax = N;
832               EXPECT_TRUE(CR.contains(N));
833             }
834           });
835         });
836 
837         EXPECT_EQ(CR.isEmptySet(), AllOverflow);
838 
839         if (!CR1.isWrappedSet() && !CR2.isWrappedSet() &&
840             !CR1.isSignWrappedSet() && !CR2.isSignWrappedSet()) {
841           if (UMin.ugt(UMax) || SMin.sgt(SMax)) {
842             EXPECT_TRUE(CR.isEmptySet());
843             return;
844           }
845 
846           ConstantRange Exact =
847               ConstantRange::getNonEmpty(SMin, SMax + 1)
848                   .intersectWith(ConstantRange::getNonEmpty(UMin, UMax + 1));
849           EXPECT_EQ(Exact, CR);
850         }
851       });
852 }
853 
854 TEST_F(ConstantRangeTest, AddWithNoWrap) {
855   typedef OverflowingBinaryOperator OBO;
856   EXPECT_EQ(Empty.addWithNoWrap(Some, OBO::NoSignedWrap), Empty);
857   EXPECT_EQ(Some.addWithNoWrap(Empty, OBO::NoSignedWrap), Empty);
858   EXPECT_EQ(Full.addWithNoWrap(Full, OBO::NoSignedWrap), Full);
859   EXPECT_NE(Full.addWithNoWrap(Some, OBO::NoSignedWrap), Full);
860   EXPECT_NE(Some.addWithNoWrap(Full, OBO::NoSignedWrap), Full);
861   EXPECT_EQ(Full.addWithNoWrap(ConstantRange(APInt(16, 1), APInt(16, 2)),
862                                OBO::NoSignedWrap),
863             ConstantRange(APInt(16, INT16_MIN + 1), APInt(16, INT16_MIN)));
864   EXPECT_EQ(ConstantRange(APInt(16, 1), APInt(16, 2))
865                 .addWithNoWrap(Full, OBO::NoSignedWrap),
866             ConstantRange(APInt(16, INT16_MIN + 1), APInt(16, INT16_MIN)));
867   EXPECT_EQ(Full.addWithNoWrap(ConstantRange(APInt(16, -1), APInt(16, 0)),
868                                OBO::NoSignedWrap),
869             ConstantRange(APInt(16, INT16_MIN), APInt(16, INT16_MAX)));
870   EXPECT_EQ(ConstantRange(APInt(8, 100), APInt(8, 120))
871                 .addWithNoWrap(ConstantRange(APInt(8, 120), APInt(8, 123)),
872                                OBO::NoSignedWrap),
873             ConstantRange(8, false));
874   EXPECT_EQ(ConstantRange(APInt(8, -120), APInt(8, -100))
875                 .addWithNoWrap(ConstantRange(APInt(8, -110), APInt(8, -100)),
876                                OBO::NoSignedWrap),
877             ConstantRange(8, false));
878   EXPECT_EQ(ConstantRange(APInt(8, 0), APInt(8, 101))
879                 .addWithNoWrap(ConstantRange(APInt(8, -128), APInt(8, 28)),
880                                OBO::NoSignedWrap),
881             ConstantRange(8, true));
882   EXPECT_EQ(ConstantRange(APInt(8, 0), APInt(8, 101))
883                 .addWithNoWrap(ConstantRange(APInt(8, -120), APInt(8, 29)),
884                                OBO::NoSignedWrap),
885             ConstantRange(APInt(8, -120), APInt(8, -128)));
886   EXPECT_EQ(ConstantRange(APInt(8, -50), APInt(8, 50))
887                 .addWithNoWrap(ConstantRange(APInt(8, 10), APInt(8, 20)),
888                                OBO::NoSignedWrap),
889             ConstantRange(APInt(8, -40), APInt(8, 69)));
890   EXPECT_EQ(ConstantRange(APInt(8, 10), APInt(8, 20))
891                 .addWithNoWrap(ConstantRange(APInt(8, -50), APInt(8, 50)),
892                                OBO::NoSignedWrap),
893             ConstantRange(APInt(8, -40), APInt(8, 69)));
894   EXPECT_EQ(ConstantRange(APInt(8, 120), APInt(8, -10))
895                 .addWithNoWrap(ConstantRange(APInt(8, 5), APInt(8, 20)),
896                                OBO::NoSignedWrap),
897             ConstantRange(APInt(8, 125), APInt(8, 9)));
898   EXPECT_EQ(ConstantRange(APInt(8, 5), APInt(8, 20))
899                 .addWithNoWrap(ConstantRange(APInt(8, 120), APInt(8, -10)),
900                                OBO::NoSignedWrap),
901             ConstantRange(APInt(8, 125), APInt(8, 9)));
902 
903   TestAddWithNoSignedWrapExhaustive(
904       [](const ConstantRange &CR1, const ConstantRange &CR2) {
905         return CR1.addWithNoWrap(CR2, OBO::NoSignedWrap);
906       },
907       [](bool &IsOverflow, const APInt &N1, const APInt &N2) {
908         return N1.sadd_ov(N2, IsOverflow);
909       });
910 
911   EXPECT_EQ(Empty.addWithNoWrap(Some, OBO::NoUnsignedWrap), Empty);
912   EXPECT_EQ(Some.addWithNoWrap(Empty, OBO::NoUnsignedWrap), Empty);
913   EXPECT_EQ(Full.addWithNoWrap(Full, OBO::NoUnsignedWrap), Full);
914   EXPECT_NE(Full.addWithNoWrap(Some, OBO::NoUnsignedWrap), Full);
915   EXPECT_NE(Some.addWithNoWrap(Full, OBO::NoUnsignedWrap), Full);
916   EXPECT_EQ(Full.addWithNoWrap(ConstantRange(APInt(16, 1), APInt(16, 2)),
917                                OBO::NoUnsignedWrap),
918             ConstantRange(APInt(16, 1), APInt(16, 0)));
919   EXPECT_EQ(ConstantRange(APInt(16, 1), APInt(16, 2))
920                 .addWithNoWrap(Full, OBO::NoUnsignedWrap),
921             ConstantRange(APInt(16, 1), APInt(16, 0)));
922   EXPECT_EQ(ConstantRange(APInt(8, 200), APInt(8, 220))
923                 .addWithNoWrap(ConstantRange(APInt(8, 100), APInt(8, 123)),
924                                OBO::NoUnsignedWrap),
925             ConstantRange(8, false));
926   EXPECT_EQ(ConstantRange(APInt(8, 0), APInt(8, 101))
927                 .addWithNoWrap(ConstantRange(APInt(8, 0), APInt(8, 156)),
928                                OBO::NoUnsignedWrap),
929             ConstantRange(8, true));
930   EXPECT_EQ(ConstantRange(APInt(8, 0), APInt(8, 101))
931                 .addWithNoWrap(ConstantRange(APInt(8, 10), APInt(8, 29)),
932                                OBO::NoUnsignedWrap),
933             ConstantRange(APInt(8, 10), APInt(8, 129)));
934   EXPECT_EQ(ConstantRange(APInt(8, 20), APInt(8, 10))
935                 .addWithNoWrap(ConstantRange(APInt(8, 50), APInt(8, 200)),
936                                OBO::NoUnsignedWrap),
937             ConstantRange(APInt(8, 50), APInt(8, 0)));
938   EXPECT_EQ(ConstantRange(APInt(8, 10), APInt(8, 20))
939                 .addWithNoWrap(ConstantRange(APInt(8, 50), APInt(8, 200)),
940                                OBO::NoUnsignedWrap),
941             ConstantRange(APInt(8, 60), APInt(8, -37)));
942   EXPECT_EQ(ConstantRange(APInt(8, 20), APInt(8, -30))
943                 .addWithNoWrap(ConstantRange(APInt(8, 5), APInt(8, 20)),
944                                OBO::NoUnsignedWrap),
945             ConstantRange(APInt(8, 25), APInt(8, -11)));
946   EXPECT_EQ(ConstantRange(APInt(8, 5), APInt(8, 20))
947                 .addWithNoWrap(ConstantRange(APInt(8, 20), APInt(8, -30)),
948                                OBO::NoUnsignedWrap),
949             ConstantRange(APInt(8, 25), APInt(8, -11)));
950 
951   TestAddWithNoUnsignedWrapExhaustive(
952       [](const ConstantRange &CR1, const ConstantRange &CR2) {
953         return CR1.addWithNoWrap(CR2, OBO::NoUnsignedWrap);
954       },
955       [](bool &IsOverflow, const APInt &N1, const APInt &N2) {
956         return N1.uadd_ov(N2, IsOverflow);
957       });
958 
959   EXPECT_EQ(ConstantRange(APInt(8, 50), APInt(8, 100))
960                 .addWithNoWrap(ConstantRange(APInt(8, 20), APInt(8, 70)),
961                                OBO::NoSignedWrap),
962             ConstantRange(APInt(8, 70), APInt(8, -128)));
963   EXPECT_EQ(ConstantRange(APInt(8, 50), APInt(8, 100))
964                 .addWithNoWrap(ConstantRange(APInt(8, 20), APInt(8, 70)),
965                                OBO::NoUnsignedWrap),
966             ConstantRange(APInt(8, 70), APInt(8, 169)));
967   EXPECT_EQ(ConstantRange(APInt(8, 50), APInt(8, 100))
968                 .addWithNoWrap(ConstantRange(APInt(8, 20), APInt(8, 70)),
969                                OBO::NoUnsignedWrap | OBO::NoSignedWrap),
970             ConstantRange(APInt(8, 70), APInt(8, -128)));
971 
972   EXPECT_EQ(ConstantRange(APInt(8, -100), APInt(8, -50))
973                 .addWithNoWrap(ConstantRange(APInt(8, 20), APInt(8, 30)),
974                                OBO::NoSignedWrap),
975             ConstantRange(APInt(8, -80), APInt(8, -21)));
976   EXPECT_EQ(ConstantRange(APInt(8, -100), APInt(8, -50))
977                 .addWithNoWrap(ConstantRange(APInt(8, 20), APInt(8, 30)),
978                                OBO::NoUnsignedWrap),
979             ConstantRange(APInt(8, 176), APInt(8, 235)));
980   EXPECT_EQ(ConstantRange(APInt(8, -100), APInt(8, -50))
981                 .addWithNoWrap(ConstantRange(APInt(8, 20), APInt(8, 30)),
982                                OBO::NoUnsignedWrap | OBO::NoSignedWrap),
983             ConstantRange(APInt(8, 176), APInt(8, 235)));
984 
985   TestAddWithNoSignedUnsignedWrapExhaustive(
986       [](const ConstantRange &CR1, const ConstantRange &CR2) {
987         return CR1.addWithNoWrap(CR2, OBO::NoUnsignedWrap | OBO::NoSignedWrap);
988       },
989       [](bool &IsOverflow, const APInt &N1, const APInt &N2) {
990         return N1.sadd_ov(N2, IsOverflow);
991       },
992       [](bool &IsOverflow, const APInt &N1, const APInt &N2) {
993         return N1.uadd_ov(N2, IsOverflow);
994       });
995 }
996 
997 TEST_F(ConstantRangeTest, Sub) {
998   EXPECT_EQ(Full.sub(APInt(16, 4)), Full);
999   EXPECT_EQ(Full.sub(Full), Full);
1000   EXPECT_EQ(Full.sub(Empty), Empty);
1001   EXPECT_EQ(Full.sub(One), Full);
1002   EXPECT_EQ(Full.sub(Some), Full);
1003   EXPECT_EQ(Full.sub(Wrap), Full);
1004   EXPECT_EQ(Empty.sub(Empty), Empty);
1005   EXPECT_EQ(Empty.sub(One), Empty);
1006   EXPECT_EQ(Empty.sub(Some), Empty);
1007   EXPECT_EQ(Empty.sub(Wrap), Empty);
1008   EXPECT_EQ(Empty.sub(APInt(16, 4)), Empty);
1009   EXPECT_EQ(Some.sub(APInt(16, 4)),
1010             ConstantRange(APInt(16, 0x6), APInt(16, 0xaa6)));
1011   EXPECT_EQ(Some.sub(Some),
1012             ConstantRange(APInt(16, 0xf561), APInt(16, 0xaa0)));
1013   EXPECT_EQ(Wrap.sub(APInt(16, 4)),
1014             ConstantRange(APInt(16, 0xaa6), APInt(16, 0x6)));
1015   EXPECT_EQ(One.sub(APInt(16, 4)),
1016             ConstantRange(APInt(16, 0x6)));
1017 }
1018 
1019 TEST_F(ConstantRangeTest, SubWithNoWrap) {
1020   typedef OverflowingBinaryOperator OBO;
1021   TestAddWithNoSignedWrapExhaustive(
1022       [](const ConstantRange &CR1, const ConstantRange &CR2) {
1023         return CR1.subWithNoWrap(CR2, OBO::NoSignedWrap);
1024       },
1025       [](bool &IsOverflow, const APInt &N1, const APInt &N2) {
1026         return N1.ssub_ov(N2, IsOverflow);
1027       });
1028   TestAddWithNoUnsignedWrapExhaustive(
1029       [](const ConstantRange &CR1, const ConstantRange &CR2) {
1030         return CR1.subWithNoWrap(CR2, OBO::NoUnsignedWrap);
1031       },
1032       [](bool &IsOverflow, const APInt &N1, const APInt &N2) {
1033         return N1.usub_ov(N2, IsOverflow);
1034       });
1035   TestAddWithNoSignedUnsignedWrapExhaustive(
1036       [](const ConstantRange &CR1, const ConstantRange &CR2) {
1037         return CR1.subWithNoWrap(CR2, OBO::NoUnsignedWrap | OBO::NoSignedWrap);
1038       },
1039       [](bool &IsOverflow, const APInt &N1, const APInt &N2) {
1040         return N1.ssub_ov(N2, IsOverflow);
1041       },
1042       [](bool &IsOverflow, const APInt &N1, const APInt &N2) {
1043         return N1.usub_ov(N2, IsOverflow);
1044       });
1045 }
1046 
1047 TEST_F(ConstantRangeTest, Multiply) {
1048   EXPECT_EQ(Full.multiply(Full), Full);
1049   EXPECT_EQ(Full.multiply(Empty), Empty);
1050   EXPECT_EQ(Full.multiply(One), Full);
1051   EXPECT_EQ(Full.multiply(Some), Full);
1052   EXPECT_EQ(Full.multiply(Wrap), Full);
1053   EXPECT_EQ(Empty.multiply(Empty), Empty);
1054   EXPECT_EQ(Empty.multiply(One), Empty);
1055   EXPECT_EQ(Empty.multiply(Some), Empty);
1056   EXPECT_EQ(Empty.multiply(Wrap), Empty);
1057   EXPECT_EQ(One.multiply(One), ConstantRange(APInt(16, 0xa*0xa),
1058                                              APInt(16, 0xa*0xa + 1)));
1059   EXPECT_EQ(One.multiply(Some), ConstantRange(APInt(16, 0xa*0xa),
1060                                               APInt(16, 0xa*0xaa9 + 1)));
1061   EXPECT_EQ(One.multiply(Wrap), Full);
1062   EXPECT_EQ(Some.multiply(Some), Full);
1063   EXPECT_EQ(Some.multiply(Wrap), Full);
1064   EXPECT_EQ(Wrap.multiply(Wrap), Full);
1065 
1066   ConstantRange Zero(APInt(16, 0));
1067   EXPECT_EQ(Zero.multiply(Full), Zero);
1068   EXPECT_EQ(Zero.multiply(Some), Zero);
1069   EXPECT_EQ(Zero.multiply(Wrap), Zero);
1070   EXPECT_EQ(Full.multiply(Zero), Zero);
1071   EXPECT_EQ(Some.multiply(Zero), Zero);
1072   EXPECT_EQ(Wrap.multiply(Zero), Zero);
1073 
1074   // http://llvm.org/PR4545
1075   EXPECT_EQ(ConstantRange(APInt(4, 1), APInt(4, 6)).multiply(
1076                 ConstantRange(APInt(4, 6), APInt(4, 2))),
1077             ConstantRange(4, /*isFullSet=*/true));
1078 
1079   EXPECT_EQ(ConstantRange(APInt(8, 254), APInt(8, 0)).multiply(
1080               ConstantRange(APInt(8, 252), APInt(8, 4))),
1081             ConstantRange(APInt(8, 250), APInt(8, 9)));
1082   EXPECT_EQ(ConstantRange(APInt(8, 254), APInt(8, 255)).multiply(
1083               ConstantRange(APInt(8, 2), APInt(8, 4))),
1084             ConstantRange(APInt(8, 250), APInt(8, 253)));
1085 
1086   // TODO: This should be return [-2, 0]
1087   EXPECT_EQ(ConstantRange(APInt(8, -2)).multiply(
1088               ConstantRange(APInt(8, 0), APInt(8, 2))),
1089             ConstantRange(APInt(8, -2), APInt(8, 1)));
1090 }
1091 
1092 TEST_F(ConstantRangeTest, UMax) {
1093   EXPECT_EQ(Full.umax(Full), Full);
1094   EXPECT_EQ(Full.umax(Empty), Empty);
1095   EXPECT_EQ(Full.umax(Some), ConstantRange(APInt(16, 0xa), APInt(16, 0)));
1096   EXPECT_EQ(Full.umax(Wrap), Full);
1097   EXPECT_EQ(Full.umax(Some), ConstantRange(APInt(16, 0xa), APInt(16, 0)));
1098   EXPECT_EQ(Empty.umax(Empty), Empty);
1099   EXPECT_EQ(Empty.umax(Some), Empty);
1100   EXPECT_EQ(Empty.umax(Wrap), Empty);
1101   EXPECT_EQ(Empty.umax(One), Empty);
1102   EXPECT_EQ(Some.umax(Some), Some);
1103   EXPECT_EQ(Some.umax(Wrap), ConstantRange(APInt(16, 0xa), APInt(16, 0)));
1104   EXPECT_EQ(Some.umax(One), Some);
1105   // TODO: ConstantRange is currently over-conservative here.
1106   EXPECT_EQ(Wrap.umax(Wrap), Full);
1107   EXPECT_EQ(Wrap.umax(One), ConstantRange(APInt(16, 0xa), APInt(16, 0)));
1108   EXPECT_EQ(One.umax(One), One);
1109 }
1110 
1111 TEST_F(ConstantRangeTest, SMax) {
1112   EXPECT_EQ(Full.smax(Full), Full);
1113   EXPECT_EQ(Full.smax(Empty), Empty);
1114   EXPECT_EQ(Full.smax(Some), ConstantRange(APInt(16, 0xa),
1115                                            APInt::getSignedMinValue(16)));
1116   EXPECT_EQ(Full.smax(Wrap), Full);
1117   EXPECT_EQ(Full.smax(One), ConstantRange(APInt(16, 0xa),
1118                                           APInt::getSignedMinValue(16)));
1119   EXPECT_EQ(Empty.smax(Empty), Empty);
1120   EXPECT_EQ(Empty.smax(Some), Empty);
1121   EXPECT_EQ(Empty.smax(Wrap), Empty);
1122   EXPECT_EQ(Empty.smax(One), Empty);
1123   EXPECT_EQ(Some.smax(Some), Some);
1124   EXPECT_EQ(Some.smax(Wrap), ConstantRange(APInt(16, 0xa),
1125                                            APInt(16, (uint64_t)INT16_MIN)));
1126   EXPECT_EQ(Some.smax(One), Some);
1127   EXPECT_EQ(Wrap.smax(One), ConstantRange(APInt(16, 0xa),
1128                                           APInt(16, (uint64_t)INT16_MIN)));
1129   EXPECT_EQ(One.smax(One), One);
1130 }
1131 
1132 TEST_F(ConstantRangeTest, UMin) {
1133   EXPECT_EQ(Full.umin(Full), Full);
1134   EXPECT_EQ(Full.umin(Empty), Empty);
1135   EXPECT_EQ(Full.umin(Some), ConstantRange(APInt(16, 0), APInt(16, 0xaaa)));
1136   EXPECT_EQ(Full.umin(Wrap), Full);
1137   EXPECT_EQ(Empty.umin(Empty), Empty);
1138   EXPECT_EQ(Empty.umin(Some), Empty);
1139   EXPECT_EQ(Empty.umin(Wrap), Empty);
1140   EXPECT_EQ(Empty.umin(One), Empty);
1141   EXPECT_EQ(Some.umin(Some), Some);
1142   EXPECT_EQ(Some.umin(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xaaa)));
1143   EXPECT_EQ(Some.umin(One), One);
1144   // TODO: ConstantRange is currently over-conservative here.
1145   EXPECT_EQ(Wrap.umin(Wrap), Full);
1146   EXPECT_EQ(Wrap.umin(One), ConstantRange(APInt(16, 0), APInt(16, 0xb)));
1147   EXPECT_EQ(One.umin(One), One);
1148 }
1149 
1150 TEST_F(ConstantRangeTest, SMin) {
1151   EXPECT_EQ(Full.smin(Full), Full);
1152   EXPECT_EQ(Full.smin(Empty), Empty);
1153   EXPECT_EQ(Full.smin(Some), ConstantRange(APInt(16, (uint64_t)INT16_MIN),
1154                                            APInt(16, 0xaaa)));
1155   EXPECT_EQ(Full.smin(Wrap), Full);
1156   EXPECT_EQ(Empty.smin(Empty), Empty);
1157   EXPECT_EQ(Empty.smin(Some), Empty);
1158   EXPECT_EQ(Empty.smin(Wrap), Empty);
1159   EXPECT_EQ(Empty.smin(One), Empty);
1160   EXPECT_EQ(Some.smin(Some), Some);
1161   EXPECT_EQ(Some.smin(Wrap), ConstantRange(APInt(16, (uint64_t)INT16_MIN),
1162                                            APInt(16, 0xaaa)));
1163   EXPECT_EQ(Some.smin(One), One);
1164   // TODO: ConstantRange is currently over-conservative here.
1165   EXPECT_EQ(Wrap.smin(Wrap), Full);
1166   EXPECT_EQ(Wrap.smin(One), ConstantRange(APInt(16, (uint64_t)INT16_MIN),
1167                                           APInt(16, 0xb)));
1168   EXPECT_EQ(One.smin(One), One);
1169 }
1170 
1171 TEST_F(ConstantRangeTest, UDiv) {
1172   EXPECT_EQ(Full.udiv(Full), Full);
1173   EXPECT_EQ(Full.udiv(Empty), Empty);
1174   EXPECT_EQ(Full.udiv(One), ConstantRange(APInt(16, 0),
1175                                           APInt(16, 0xffff / 0xa + 1)));
1176   EXPECT_EQ(Full.udiv(Some), ConstantRange(APInt(16, 0),
1177                                            APInt(16, 0xffff / 0xa + 1)));
1178   EXPECT_EQ(Full.udiv(Wrap), Full);
1179   EXPECT_EQ(Empty.udiv(Empty), Empty);
1180   EXPECT_EQ(Empty.udiv(One), Empty);
1181   EXPECT_EQ(Empty.udiv(Some), Empty);
1182   EXPECT_EQ(Empty.udiv(Wrap), Empty);
1183   EXPECT_EQ(One.udiv(One), ConstantRange(APInt(16, 1)));
1184   EXPECT_EQ(One.udiv(Some), ConstantRange(APInt(16, 0), APInt(16, 2)));
1185   EXPECT_EQ(One.udiv(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xb)));
1186   EXPECT_EQ(Some.udiv(Some), ConstantRange(APInt(16, 0), APInt(16, 0x111)));
1187   EXPECT_EQ(Some.udiv(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xaaa)));
1188   EXPECT_EQ(Wrap.udiv(Wrap), Full);
1189 
1190 
1191   ConstantRange Zero(APInt(16, 0));
1192   EXPECT_EQ(Zero.udiv(One), Zero);
1193   EXPECT_EQ(Zero.udiv(Full), Zero);
1194 
1195   EXPECT_EQ(ConstantRange(APInt(16, 0), APInt(16, 99)).udiv(Full),
1196             ConstantRange(APInt(16, 0), APInt(16, 99)));
1197   EXPECT_EQ(ConstantRange(APInt(16, 10), APInt(16, 99)).udiv(Full),
1198             ConstantRange(APInt(16, 0), APInt(16, 99)));
1199 }
1200 
1201 TEST_F(ConstantRangeTest, SDiv) {
1202   unsigned Bits = 4;
1203   EnumerateTwoConstantRanges(Bits, [&](const ConstantRange &CR1,
1204                                        const ConstantRange &CR2) {
1205     // Collect possible results in a bit vector. We store the signed value plus
1206     // a bias to make it unsigned.
1207     int Bias = 1 << (Bits - 1);
1208     BitVector Results(1 << Bits);
1209     ForeachNumInConstantRange(CR1, [&](const APInt &N1) {
1210       ForeachNumInConstantRange(CR2, [&](const APInt &N2) {
1211         // Division by zero is UB.
1212         if (N2 == 0)
1213           return;
1214 
1215         // SignedMin / -1 is UB.
1216         if (N1.isMinSignedValue() && N2.isAllOnesValue())
1217           return;
1218 
1219         APInt N = N1.sdiv(N2);
1220         Results.set(N.getSExtValue() + Bias);
1221       });
1222     });
1223 
1224     ConstantRange CR = CR1.sdiv(CR2);
1225     if (Results.none()) {
1226       EXPECT_TRUE(CR.isEmptySet());
1227       return;
1228     }
1229 
1230     // If there is a non-full signed envelope, that should be the result.
1231     APInt SMin(Bits, Results.find_first() - Bias);
1232     APInt SMax(Bits, Results.find_last() - Bias);
1233     ConstantRange Envelope = ConstantRange::getNonEmpty(SMin, SMax + 1);
1234     if (!Envelope.isFullSet()) {
1235       EXPECT_EQ(Envelope, CR);
1236       return;
1237     }
1238 
1239     // If the signed envelope is a full set, try to find a smaller sign wrapped
1240     // set that is separated in negative and positive components (or one which
1241     // can also additionally contain zero).
1242     int LastNeg = Results.find_last_in(0, Bias) - Bias;
1243     int LastPos = Results.find_next(Bias) - Bias;
1244     if (Results[Bias]) {
1245       if (LastNeg == -1)
1246         ++LastNeg;
1247       else if (LastPos == 1)
1248         --LastPos;
1249     }
1250 
1251     APInt WMax(Bits, LastNeg);
1252     APInt WMin(Bits, LastPos);
1253     ConstantRange Wrapped = ConstantRange::getNonEmpty(WMin, WMax + 1);
1254     EXPECT_EQ(Wrapped, CR);
1255   });
1256 }
1257 
1258 TEST_F(ConstantRangeTest, URem) {
1259   EXPECT_EQ(Full.urem(Empty), Empty);
1260   EXPECT_EQ(Empty.urem(Full), Empty);
1261   // urem by zero is poison.
1262   EXPECT_EQ(Full.urem(ConstantRange(APInt(16, 0))), Empty);
1263   // urem by full range doesn't contain MaxValue.
1264   EXPECT_EQ(Full.urem(Full), ConstantRange(APInt(16, 0), APInt(16, 0xffff)));
1265   // urem is upper bounded by maximum RHS minus one.
1266   EXPECT_EQ(Full.urem(ConstantRange(APInt(16, 0), APInt(16, 123))),
1267             ConstantRange(APInt(16, 0), APInt(16, 122)));
1268   // urem is upper bounded by maximum LHS.
1269   EXPECT_EQ(ConstantRange(APInt(16, 0), APInt(16, 123)).urem(Full),
1270             ConstantRange(APInt(16, 0), APInt(16, 123)));
1271   // If the LHS is always lower than the RHS, the result is the LHS.
1272   EXPECT_EQ(ConstantRange(APInt(16, 10), APInt(16, 20))
1273                 .urem(ConstantRange(APInt(16, 20), APInt(16, 30))),
1274             ConstantRange(APInt(16, 10), APInt(16, 20)));
1275   // It has to be strictly lower, otherwise the top value may wrap to zero.
1276   EXPECT_EQ(ConstantRange(APInt(16, 10), APInt(16, 20))
1277                 .urem(ConstantRange(APInt(16, 19), APInt(16, 30))),
1278             ConstantRange(APInt(16, 0), APInt(16, 20)));
1279   // [12, 14] % 10 is [2, 4], but we conservatively compute [0, 9].
1280   EXPECT_EQ(ConstantRange(APInt(16, 12), APInt(16, 15))
1281                 .urem(ConstantRange(APInt(16, 10))),
1282             ConstantRange(APInt(16, 0), APInt(16, 10)));
1283 
1284   TestUnsignedBinOpExhaustive(
1285       [](const ConstantRange &CR1, const ConstantRange &CR2) {
1286         return CR1.urem(CR2);
1287       },
1288       [](const APInt &N1, const APInt &N2) {
1289         return N1.urem(N2);
1290       },
1291       /* SkipZeroRHS */ true, /* CorrectnessOnly */ true);
1292 }
1293 
1294 TEST_F(ConstantRangeTest, SRem) {
1295   EXPECT_EQ(Full.srem(Empty), Empty);
1296   EXPECT_EQ(Empty.srem(Full), Empty);
1297   // srem by zero is UB.
1298   EXPECT_EQ(Full.srem(ConstantRange(APInt(16, 0))), Empty);
1299   // srem by full range doesn't contain SignedMinValue.
1300   EXPECT_EQ(Full.srem(Full), ConstantRange(APInt::getSignedMinValue(16) + 1,
1301                                            APInt::getSignedMinValue(16)));
1302 
1303   ConstantRange PosMod(APInt(16, 10), APInt(16, 21));  // [10, 20]
1304   ConstantRange NegMod(APInt(16, -20), APInt(16, -9)); // [-20, -10]
1305   ConstantRange IntMinMod(APInt::getSignedMinValue(16));
1306 
1307   ConstantRange Expected(16, true);
1308 
1309   // srem is bounded by abs(RHS) minus one.
1310   ConstantRange PosLargeLHS(APInt(16, 0), APInt(16, 41));
1311   Expected = ConstantRange(APInt(16, 0), APInt(16, 20));
1312   EXPECT_EQ(PosLargeLHS.srem(PosMod), Expected);
1313   EXPECT_EQ(PosLargeLHS.srem(NegMod), Expected);
1314   ConstantRange NegLargeLHS(APInt(16, -40), APInt(16, 1));
1315   Expected = ConstantRange(APInt(16, -19), APInt(16, 1));
1316   EXPECT_EQ(NegLargeLHS.srem(PosMod), Expected);
1317   EXPECT_EQ(NegLargeLHS.srem(NegMod), Expected);
1318   ConstantRange PosNegLargeLHS(APInt(16, -32), APInt(16, 38));
1319   Expected = ConstantRange(APInt(16, -19), APInt(16, 20));
1320   EXPECT_EQ(PosNegLargeLHS.srem(PosMod), Expected);
1321   EXPECT_EQ(PosNegLargeLHS.srem(NegMod), Expected);
1322 
1323   // srem is bounded by LHS.
1324   ConstantRange PosLHS(APInt(16, 0), APInt(16, 16));
1325   EXPECT_EQ(PosLHS.srem(PosMod), PosLHS);
1326   EXPECT_EQ(PosLHS.srem(NegMod), PosLHS);
1327   EXPECT_EQ(PosLHS.srem(IntMinMod), PosLHS);
1328   ConstantRange NegLHS(APInt(16, -15), APInt(16, 1));
1329   EXPECT_EQ(NegLHS.srem(PosMod), NegLHS);
1330   EXPECT_EQ(NegLHS.srem(NegMod), NegLHS);
1331   EXPECT_EQ(NegLHS.srem(IntMinMod), NegLHS);
1332   ConstantRange PosNegLHS(APInt(16, -12), APInt(16, 18));
1333   EXPECT_EQ(PosNegLHS.srem(PosMod), PosNegLHS);
1334   EXPECT_EQ(PosNegLHS.srem(NegMod), PosNegLHS);
1335   EXPECT_EQ(PosNegLHS.srem(IntMinMod), PosNegLHS);
1336 
1337   // srem is LHS if it is smaller than RHS.
1338   ConstantRange PosSmallLHS(APInt(16, 3), APInt(16, 8));
1339   EXPECT_EQ(PosSmallLHS.srem(PosMod), PosSmallLHS);
1340   EXPECT_EQ(PosSmallLHS.srem(NegMod), PosSmallLHS);
1341   EXPECT_EQ(PosSmallLHS.srem(IntMinMod), PosSmallLHS);
1342   ConstantRange NegSmallLHS(APInt(16, -7), APInt(16, -2));
1343   EXPECT_EQ(NegSmallLHS.srem(PosMod), NegSmallLHS);
1344   EXPECT_EQ(NegSmallLHS.srem(NegMod), NegSmallLHS);
1345   EXPECT_EQ(NegSmallLHS.srem(IntMinMod), NegSmallLHS);
1346   ConstantRange PosNegSmallLHS(APInt(16, -3), APInt(16, 8));
1347   EXPECT_EQ(PosNegSmallLHS.srem(PosMod), PosNegSmallLHS);
1348   EXPECT_EQ(PosNegSmallLHS.srem(NegMod), PosNegSmallLHS);
1349   EXPECT_EQ(PosNegSmallLHS.srem(IntMinMod), PosNegSmallLHS);
1350 
1351   // Example of a suboptimal result:
1352   // [12, 14] srem 10 is [2, 4], but we conservatively compute [0, 9].
1353   EXPECT_EQ(ConstantRange(APInt(16, 12), APInt(16, 15))
1354                 .srem(ConstantRange(APInt(16, 10))),
1355             ConstantRange(APInt(16, 0), APInt(16, 10)));
1356 
1357   TestSignedBinOpExhaustive(
1358       [](const ConstantRange &CR1, const ConstantRange &CR2) {
1359         return CR1.srem(CR2);
1360       },
1361       [](const APInt &N1, const APInt &N2) {
1362         return N1.srem(N2);
1363       },
1364       /* SkipZeroRHS */ true, /* CorrectnessOnly */ true);
1365 }
1366 
1367 TEST_F(ConstantRangeTest, Shl) {
1368   ConstantRange Some2(APInt(16, 0xfff), APInt(16, 0x8000));
1369   ConstantRange WrapNullMax(APInt(16, 0x1), APInt(16, 0x0));
1370   EXPECT_EQ(Full.shl(Full), Full);
1371   EXPECT_EQ(Full.shl(Empty), Empty);
1372   EXPECT_EQ(Full.shl(One), Full);    // TODO: [0, (-1 << 0xa) + 1)
1373   EXPECT_EQ(Full.shl(Some), Full);   // TODO: [0, (-1 << 0xa) + 1)
1374   EXPECT_EQ(Full.shl(Wrap), Full);
1375   EXPECT_EQ(Empty.shl(Empty), Empty);
1376   EXPECT_EQ(Empty.shl(One), Empty);
1377   EXPECT_EQ(Empty.shl(Some), Empty);
1378   EXPECT_EQ(Empty.shl(Wrap), Empty);
1379   EXPECT_EQ(One.shl(One), ConstantRange(APInt(16, 0xa << 0xa),
1380                                         APInt(16, (0xa << 0xa) + 1)));
1381   EXPECT_EQ(One.shl(Some), Full);    // TODO: [0xa << 0xa, 0)
1382   EXPECT_EQ(One.shl(Wrap), Full);    // TODO: [0xa, 0xa << 14 + 1)
1383   EXPECT_EQ(Some.shl(Some), Full);   // TODO: [0xa << 0xa, 0xfc01)
1384   EXPECT_EQ(Some.shl(Wrap), Full);   // TODO: [0xa, 0x7ff << 0x5 + 1)
1385   EXPECT_EQ(Wrap.shl(Wrap), Full);
1386   EXPECT_EQ(
1387       Some2.shl(ConstantRange(APInt(16, 0x1))),
1388       ConstantRange(APInt(16, 0xfff << 0x1), APInt(16, 0x7fff << 0x1) + 1));
1389   EXPECT_EQ(One.shl(WrapNullMax), Full);
1390 }
1391 
1392 TEST_F(ConstantRangeTest, Lshr) {
1393   EXPECT_EQ(Full.lshr(Full), Full);
1394   EXPECT_EQ(Full.lshr(Empty), Empty);
1395   EXPECT_EQ(Full.lshr(One), ConstantRange(APInt(16, 0),
1396                                           APInt(16, (0xffff >> 0xa) + 1)));
1397   EXPECT_EQ(Full.lshr(Some), ConstantRange(APInt(16, 0),
1398                                            APInt(16, (0xffff >> 0xa) + 1)));
1399   EXPECT_EQ(Full.lshr(Wrap), Full);
1400   EXPECT_EQ(Empty.lshr(Empty), Empty);
1401   EXPECT_EQ(Empty.lshr(One), Empty);
1402   EXPECT_EQ(Empty.lshr(Some), Empty);
1403   EXPECT_EQ(Empty.lshr(Wrap), Empty);
1404   EXPECT_EQ(One.lshr(One), ConstantRange(APInt(16, 0)));
1405   EXPECT_EQ(One.lshr(Some), ConstantRange(APInt(16, 0)));
1406   EXPECT_EQ(One.lshr(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xb)));
1407   EXPECT_EQ(Some.lshr(Some), ConstantRange(APInt(16, 0),
1408                                            APInt(16, (0xaaa >> 0xa) + 1)));
1409   EXPECT_EQ(Some.lshr(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xaaa)));
1410   EXPECT_EQ(Wrap.lshr(Wrap), Full);
1411 }
1412 
1413 TEST_F(ConstantRangeTest, Ashr) {
1414   EXPECT_EQ(Full.ashr(Full), Full);
1415   EXPECT_EQ(Full.ashr(Empty), Empty);
1416   EXPECT_EQ(Full.ashr(One), ConstantRange(APInt(16, 0xffe0),
1417                                           APInt(16, (0x7fff >> 0xa) + 1 )));
1418   ConstantRange Small(APInt(16, 0xa), APInt(16, 0xb));
1419   EXPECT_EQ(Full.ashr(Small), ConstantRange(APInt(16, 0xffe0),
1420                                            APInt(16, (0x7fff >> 0xa) + 1 )));
1421   EXPECT_EQ(Full.ashr(Some), ConstantRange(APInt(16, 0xffe0),
1422                                            APInt(16, (0x7fff >> 0xa) + 1 )));
1423   EXPECT_EQ(Full.ashr(Wrap), Full);
1424   EXPECT_EQ(Empty.ashr(Empty), Empty);
1425   EXPECT_EQ(Empty.ashr(One), Empty);
1426   EXPECT_EQ(Empty.ashr(Some), Empty);
1427   EXPECT_EQ(Empty.ashr(Wrap), Empty);
1428   EXPECT_EQ(One.ashr(One), ConstantRange(APInt(16, 0)));
1429   EXPECT_EQ(One.ashr(Some), ConstantRange(APInt(16, 0)));
1430   EXPECT_EQ(One.ashr(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xb)));
1431   EXPECT_EQ(Some.ashr(Some), ConstantRange(APInt(16, 0),
1432                                            APInt(16, (0xaaa >> 0xa) + 1)));
1433   EXPECT_EQ(Some.ashr(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xaaa)));
1434   EXPECT_EQ(Wrap.ashr(Wrap), Full);
1435   ConstantRange Neg(APInt(16, 0xf3f0, true), APInt(16, 0xf7f8, true));
1436   EXPECT_EQ(Neg.ashr(Small), ConstantRange(APInt(16, 0xfffc, true),
1437                                            APInt(16, 0xfffe, true)));
1438 }
1439 
1440 TEST(ConstantRange, MakeAllowedICmpRegion) {
1441   // PR8250
1442   ConstantRange SMax = ConstantRange(APInt::getSignedMaxValue(32));
1443   EXPECT_TRUE(ConstantRange::makeAllowedICmpRegion(ICmpInst::ICMP_SGT, SMax)
1444                   .isEmptySet());
1445 }
1446 
1447 TEST(ConstantRange, MakeSatisfyingICmpRegion) {
1448   ConstantRange LowHalf(APInt(8, 0), APInt(8, 128));
1449   ConstantRange HighHalf(APInt(8, 128), APInt(8, 0));
1450   ConstantRange EmptySet(8, /* isFullSet = */ false);
1451 
1452   EXPECT_EQ(ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_NE, LowHalf),
1453             HighHalf);
1454 
1455   EXPECT_EQ(
1456       ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_NE, HighHalf),
1457       LowHalf);
1458 
1459   EXPECT_TRUE(ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_EQ,
1460                                                       HighHalf).isEmptySet());
1461 
1462   ConstantRange UnsignedSample(APInt(8, 5), APInt(8, 200));
1463 
1464   EXPECT_EQ(ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_ULT,
1465                                                     UnsignedSample),
1466             ConstantRange(APInt(8, 0), APInt(8, 5)));
1467 
1468   EXPECT_EQ(ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_ULE,
1469                                                     UnsignedSample),
1470             ConstantRange(APInt(8, 0), APInt(8, 6)));
1471 
1472   EXPECT_EQ(ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_UGT,
1473                                                     UnsignedSample),
1474             ConstantRange(APInt(8, 200), APInt(8, 0)));
1475 
1476   EXPECT_EQ(ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_UGE,
1477                                                     UnsignedSample),
1478             ConstantRange(APInt(8, 199), APInt(8, 0)));
1479 
1480   ConstantRange SignedSample(APInt(8, -5), APInt(8, 5));
1481 
1482   EXPECT_EQ(
1483       ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_SLT, SignedSample),
1484       ConstantRange(APInt(8, -128), APInt(8, -5)));
1485 
1486   EXPECT_EQ(
1487       ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_SLE, SignedSample),
1488       ConstantRange(APInt(8, -128), APInt(8, -4)));
1489 
1490   EXPECT_EQ(
1491       ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_SGT, SignedSample),
1492       ConstantRange(APInt(8, 5), APInt(8, -128)));
1493 
1494   EXPECT_EQ(
1495       ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_SGE, SignedSample),
1496       ConstantRange(APInt(8, 4), APInt(8, -128)));
1497 }
1498 
1499 TEST(ConstantRange, MakeGuaranteedNoWrapRegion) {
1500   const int IntMin4Bits = 8;
1501   const int IntMax4Bits = 7;
1502   typedef OverflowingBinaryOperator OBO;
1503 
1504   for (int Const : {0, -1, -2, 1, 2, IntMin4Bits, IntMax4Bits}) {
1505     APInt C(4, Const, true /* = isSigned */);
1506 
1507     auto NUWRegion = ConstantRange::makeGuaranteedNoWrapRegion(
1508         Instruction::Add, C, OBO::NoUnsignedWrap);
1509 
1510     EXPECT_FALSE(NUWRegion.isEmptySet());
1511 
1512     auto NSWRegion = ConstantRange::makeGuaranteedNoWrapRegion(
1513         Instruction::Add, C, OBO::NoSignedWrap);
1514 
1515     EXPECT_FALSE(NSWRegion.isEmptySet());
1516 
1517     for (APInt I = NUWRegion.getLower(), E = NUWRegion.getUpper(); I != E;
1518          ++I) {
1519       bool Overflow = false;
1520       (void)I.uadd_ov(C, Overflow);
1521       EXPECT_FALSE(Overflow);
1522     }
1523 
1524     for (APInt I = NSWRegion.getLower(), E = NSWRegion.getUpper(); I != E;
1525          ++I) {
1526       bool Overflow = false;
1527       (void)I.sadd_ov(C, Overflow);
1528       EXPECT_FALSE(Overflow);
1529     }
1530   }
1531 
1532   for (int Const : {0, -1, -2, 1, 2, IntMin4Bits, IntMax4Bits}) {
1533     APInt C(4, Const, true /* = isSigned */);
1534 
1535     auto NUWRegion = ConstantRange::makeGuaranteedNoWrapRegion(
1536         Instruction::Sub, C, OBO::NoUnsignedWrap);
1537 
1538     EXPECT_FALSE(NUWRegion.isEmptySet());
1539 
1540     auto NSWRegion = ConstantRange::makeGuaranteedNoWrapRegion(
1541         Instruction::Sub, C, OBO::NoSignedWrap);
1542 
1543     EXPECT_FALSE(NSWRegion.isEmptySet());
1544 
1545     for (APInt I = NUWRegion.getLower(), E = NUWRegion.getUpper(); I != E;
1546          ++I) {
1547       bool Overflow = false;
1548       (void)I.usub_ov(C, Overflow);
1549       EXPECT_FALSE(Overflow);
1550     }
1551 
1552     for (APInt I = NSWRegion.getLower(), E = NSWRegion.getUpper(); I != E;
1553          ++I) {
1554       bool Overflow = false;
1555       (void)I.ssub_ov(C, Overflow);
1556       EXPECT_FALSE(Overflow);
1557     }
1558   }
1559 
1560   auto NSWForAllValues = ConstantRange::makeGuaranteedNoWrapRegion(
1561       Instruction::Add, ConstantRange(32, /* isFullSet = */ true),
1562       OBO::NoSignedWrap);
1563   EXPECT_TRUE(NSWForAllValues.isSingleElement() &&
1564               NSWForAllValues.getSingleElement()->isMinValue());
1565 
1566   NSWForAllValues = ConstantRange::makeGuaranteedNoWrapRegion(
1567       Instruction::Sub, ConstantRange(32, /* isFullSet = */ true),
1568       OBO::NoSignedWrap);
1569   EXPECT_TRUE(NSWForAllValues.isSingleElement() &&
1570               NSWForAllValues.getSingleElement()->isMaxValue());
1571 
1572   auto NUWForAllValues = ConstantRange::makeGuaranteedNoWrapRegion(
1573       Instruction::Add, ConstantRange(32, /* isFullSet = */ true),
1574       OBO::NoUnsignedWrap);
1575   EXPECT_TRUE(NUWForAllValues.isSingleElement() &&
1576               NUWForAllValues.getSingleElement()->isMinValue());
1577 
1578   NUWForAllValues = ConstantRange::makeGuaranteedNoWrapRegion(
1579       Instruction::Sub, ConstantRange(32, /* isFullSet = */ true),
1580       OBO::NoUnsignedWrap);
1581   EXPECT_TRUE(NUWForAllValues.isSingleElement() &&
1582               NUWForAllValues.getSingleElement()->isMaxValue());
1583 
1584   EXPECT_TRUE(ConstantRange::makeGuaranteedNoWrapRegion(
1585       Instruction::Add, APInt(32, 0), OBO::NoUnsignedWrap).isFullSet());
1586   EXPECT_TRUE(ConstantRange::makeGuaranteedNoWrapRegion(
1587       Instruction::Add, APInt(32, 0), OBO::NoSignedWrap).isFullSet());
1588   EXPECT_TRUE(ConstantRange::makeGuaranteedNoWrapRegion(
1589       Instruction::Sub, APInt(32, 0), OBO::NoUnsignedWrap).isFullSet());
1590   EXPECT_TRUE(ConstantRange::makeGuaranteedNoWrapRegion(
1591       Instruction::Sub, APInt(32, 0), OBO::NoSignedWrap).isFullSet());
1592 
1593   ConstantRange OneToFive(APInt(32, 1), APInt(32, 6));
1594   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
1595                 Instruction::Add, OneToFive, OBO::NoSignedWrap),
1596             ConstantRange(APInt::getSignedMinValue(32),
1597                           APInt::getSignedMaxValue(32) - 4));
1598   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
1599                 Instruction::Add, OneToFive, OBO::NoUnsignedWrap),
1600             ConstantRange(APInt::getMinValue(32), APInt::getMinValue(32) - 5));
1601   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
1602                 Instruction::Sub, OneToFive, OBO::NoSignedWrap),
1603             ConstantRange(APInt::getSignedMinValue(32) + 5,
1604                           APInt::getSignedMinValue(32)));
1605   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
1606                 Instruction::Sub, OneToFive, OBO::NoUnsignedWrap),
1607             ConstantRange(APInt::getMinValue(32) + 5, APInt::getMinValue(32)));
1608 
1609   ConstantRange MinusFiveToMinusTwo(APInt(32, -5), APInt(32, -1));
1610   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
1611                 Instruction::Add, MinusFiveToMinusTwo, OBO::NoSignedWrap),
1612             ConstantRange(APInt::getSignedMinValue(32) + 5,
1613                           APInt::getSignedMinValue(32)));
1614   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
1615                 Instruction::Add, MinusFiveToMinusTwo, OBO::NoUnsignedWrap),
1616             ConstantRange(APInt(32, 0), APInt(32, 2)));
1617   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
1618                 Instruction::Sub, MinusFiveToMinusTwo, OBO::NoSignedWrap),
1619             ConstantRange(APInt::getSignedMinValue(32),
1620                           APInt::getSignedMaxValue(32) - 4));
1621   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
1622                 Instruction::Sub, MinusFiveToMinusTwo, OBO::NoUnsignedWrap),
1623             ConstantRange(APInt::getMaxValue(32) - 1,
1624                           APInt::getMinValue(32)));
1625 
1626   ConstantRange MinusOneToOne(APInt(32, -1), APInt(32, 2));
1627   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
1628                 Instruction::Add, MinusOneToOne, OBO::NoSignedWrap),
1629             ConstantRange(APInt::getSignedMinValue(32) + 1,
1630                           APInt::getSignedMinValue(32) - 1));
1631   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
1632                 Instruction::Add, MinusOneToOne, OBO::NoUnsignedWrap),
1633             ConstantRange(APInt(32, 0), APInt(32, 1)));
1634   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
1635                 Instruction::Sub, MinusOneToOne, OBO::NoSignedWrap),
1636             ConstantRange(APInt::getSignedMinValue(32) + 1,
1637                           APInt::getSignedMinValue(32) - 1));
1638   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
1639                 Instruction::Sub, MinusOneToOne, OBO::NoUnsignedWrap),
1640             ConstantRange(APInt::getMaxValue(32),
1641                           APInt::getMinValue(32)));
1642 
1643   ConstantRange One(APInt(32, 1), APInt(32, 2));
1644   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
1645                 Instruction::Add, One, OBO::NoSignedWrap),
1646             ConstantRange(APInt::getSignedMinValue(32),
1647                           APInt::getSignedMaxValue(32)));
1648   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
1649                 Instruction::Add, One, OBO::NoUnsignedWrap),
1650             ConstantRange(APInt::getMinValue(32), APInt::getMaxValue(32)));
1651   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
1652                 Instruction::Sub, One, OBO::NoSignedWrap),
1653             ConstantRange(APInt::getSignedMinValue(32) + 1,
1654                           APInt::getSignedMinValue(32)));
1655   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
1656                 Instruction::Sub, One, OBO::NoUnsignedWrap),
1657             ConstantRange(APInt::getMinValue(32) + 1, APInt::getMinValue(32)));
1658 
1659   ConstantRange OneLessThanBitWidth(APInt(32, 0), APInt(32, 31) + 1);
1660   ConstantRange UpToBitWidth(APInt(32, 0), APInt(32, 32) + 1);
1661   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
1662                 Instruction::Shl, UpToBitWidth, OBO::NoUnsignedWrap),
1663             ConstantRange::makeGuaranteedNoWrapRegion(
1664                 Instruction::Shl, OneLessThanBitWidth, OBO::NoUnsignedWrap));
1665   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
1666                 Instruction::Shl, UpToBitWidth, OBO::NoSignedWrap),
1667             ConstantRange::makeGuaranteedNoWrapRegion(
1668                 Instruction::Shl, OneLessThanBitWidth, OBO::NoSignedWrap));
1669   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
1670                 Instruction::Shl, UpToBitWidth, OBO::NoUnsignedWrap),
1671             ConstantRange(APInt(32, 0), APInt(32, 1) + 1));
1672   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
1673                 Instruction::Shl, UpToBitWidth, OBO::NoSignedWrap),
1674             ConstantRange(APInt(32, -1), APInt(32, 0) + 1));
1675 
1676   EXPECT_EQ(
1677       ConstantRange::makeGuaranteedNoWrapRegion(
1678           Instruction::Shl, ConstantRange::getFull(32), OBO::NoUnsignedWrap),
1679       ConstantRange::makeGuaranteedNoWrapRegion(
1680           Instruction::Shl, OneLessThanBitWidth, OBO::NoUnsignedWrap));
1681   EXPECT_EQ(
1682       ConstantRange::makeGuaranteedNoWrapRegion(
1683           Instruction::Shl, ConstantRange::getFull(32), OBO::NoSignedWrap),
1684       ConstantRange::makeGuaranteedNoWrapRegion(
1685           Instruction::Shl, OneLessThanBitWidth, OBO::NoSignedWrap));
1686 
1687   ConstantRange IllegalShAmt(APInt(32, 32), APInt(32, 0) + 1);
1688   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
1689                 Instruction::Shl, IllegalShAmt, OBO::NoUnsignedWrap),
1690             ConstantRange::getFull(32));
1691   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
1692                 Instruction::Shl, IllegalShAmt, OBO::NoSignedWrap),
1693             ConstantRange::getFull(32));
1694 
1695   EXPECT_EQ(
1696       ConstantRange::makeGuaranteedNoWrapRegion(
1697           Instruction::Shl, ConstantRange(APInt(32, -32), APInt(32, 16) + 1),
1698           OBO::NoUnsignedWrap),
1699       ConstantRange::makeGuaranteedNoWrapRegion(
1700           Instruction::Shl, ConstantRange(APInt(32, 0), APInt(32, 16) + 1),
1701           OBO::NoUnsignedWrap));
1702   EXPECT_EQ(
1703       ConstantRange::makeGuaranteedNoWrapRegion(
1704           Instruction::Shl, ConstantRange(APInt(32, -32), APInt(32, 16) + 1),
1705           OBO::NoSignedWrap),
1706       ConstantRange::makeGuaranteedNoWrapRegion(
1707           Instruction::Shl, ConstantRange(APInt(32, 0), APInt(32, 16) + 1),
1708           OBO::NoSignedWrap));
1709 
1710   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
1711                 Instruction::Shl,
1712                 ConstantRange(APInt(32, -32), APInt(32, 16) + 1),
1713                 OBO::NoUnsignedWrap),
1714             ConstantRange(APInt(32, 0), APInt(32, 65535) + 1));
1715   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
1716                 Instruction::Shl,
1717                 ConstantRange(APInt(32, -32), APInt(32, 16) + 1),
1718                 OBO::NoSignedWrap),
1719             ConstantRange(APInt(32, -32768), APInt(32, 32767) + 1));
1720 }
1721 
1722 template<typename Fn>
1723 void TestNoWrapRegionExhaustive(Instruction::BinaryOps BinOp,
1724                                 unsigned NoWrapKind, Fn OverflowFn) {
1725   unsigned Bits = 5;
1726   EnumerateConstantRanges(Bits, [&](const ConstantRange &CR) {
1727     if (CR.isEmptySet())
1728       return;
1729     if (Instruction::isShift(BinOp) && CR.getUnsignedMax().uge(Bits))
1730       return;
1731 
1732     ConstantRange NoWrap =
1733         ConstantRange::makeGuaranteedNoWrapRegion(BinOp, CR, NoWrapKind);
1734     ConstantRange Full = ConstantRange::getFull(Bits);
1735     ForeachNumInConstantRange(Full, [&](const APInt &N1) {
1736       bool NoOverflow = true;
1737       bool Overflow = true;
1738       ForeachNumInConstantRange(CR, [&](const APInt &N2) {
1739         if (OverflowFn(N1, N2))
1740           NoOverflow = false;
1741         else
1742           Overflow = false;
1743       });
1744       EXPECT_EQ(NoOverflow, NoWrap.contains(N1));
1745 
1746       // The no-wrap range is exact for single-element ranges.
1747       if (CR.isSingleElement()) {
1748         EXPECT_EQ(Overflow, !NoWrap.contains(N1));
1749       }
1750     });
1751   });
1752 }
1753 
1754 // Show that makeGuaranteedNoWrapRegion() is maximal, and for single-element
1755 // ranges also exact.
1756 TEST(ConstantRange, NoWrapRegionExhaustive) {
1757   TestNoWrapRegionExhaustive(
1758       Instruction::Add, OverflowingBinaryOperator::NoUnsignedWrap,
1759       [](const APInt &N1, const APInt &N2) {
1760         bool Overflow;
1761         (void) N1.uadd_ov(N2, Overflow);
1762         return Overflow;
1763       });
1764   TestNoWrapRegionExhaustive(
1765       Instruction::Add, OverflowingBinaryOperator::NoSignedWrap,
1766       [](const APInt &N1, const APInt &N2) {
1767         bool Overflow;
1768         (void) N1.sadd_ov(N2, Overflow);
1769         return Overflow;
1770       });
1771   TestNoWrapRegionExhaustive(
1772       Instruction::Sub, OverflowingBinaryOperator::NoUnsignedWrap,
1773       [](const APInt &N1, const APInt &N2) {
1774         bool Overflow;
1775         (void) N1.usub_ov(N2, Overflow);
1776         return Overflow;
1777       });
1778   TestNoWrapRegionExhaustive(
1779       Instruction::Sub, OverflowingBinaryOperator::NoSignedWrap,
1780       [](const APInt &N1, const APInt &N2) {
1781         bool Overflow;
1782         (void) N1.ssub_ov(N2, Overflow);
1783         return Overflow;
1784       });
1785   TestNoWrapRegionExhaustive(
1786       Instruction::Mul, OverflowingBinaryOperator::NoUnsignedWrap,
1787       [](const APInt &N1, const APInt &N2) {
1788         bool Overflow;
1789         (void) N1.umul_ov(N2, Overflow);
1790         return Overflow;
1791       });
1792   TestNoWrapRegionExhaustive(
1793       Instruction::Mul, OverflowingBinaryOperator::NoSignedWrap,
1794       [](const APInt &N1, const APInt &N2) {
1795         bool Overflow;
1796         (void) N1.smul_ov(N2, Overflow);
1797         return Overflow;
1798       });
1799   TestNoWrapRegionExhaustive(Instruction::Shl,
1800                              OverflowingBinaryOperator::NoUnsignedWrap,
1801                              [](const APInt &N1, const APInt &N2) {
1802                                bool Overflow;
1803                                (void)N1.ushl_ov(N2, Overflow);
1804                                return Overflow;
1805                              });
1806   TestNoWrapRegionExhaustive(Instruction::Shl,
1807                              OverflowingBinaryOperator::NoSignedWrap,
1808                              [](const APInt &N1, const APInt &N2) {
1809                                bool Overflow;
1810                                (void)N1.sshl_ov(N2, Overflow);
1811                                return Overflow;
1812                              });
1813 }
1814 
1815 TEST(ConstantRange, GetEquivalentICmp) {
1816   APInt RHS;
1817   CmpInst::Predicate Pred;
1818 
1819   EXPECT_TRUE(ConstantRange(APInt::getMinValue(32), APInt(32, 100))
1820                   .getEquivalentICmp(Pred, RHS));
1821   EXPECT_EQ(Pred, CmpInst::ICMP_ULT);
1822   EXPECT_EQ(RHS, APInt(32, 100));
1823 
1824   EXPECT_TRUE(ConstantRange(APInt::getSignedMinValue(32), APInt(32, 100))
1825                   .getEquivalentICmp(Pred, RHS));
1826   EXPECT_EQ(Pred, CmpInst::ICMP_SLT);
1827   EXPECT_EQ(RHS, APInt(32, 100));
1828 
1829   EXPECT_TRUE(ConstantRange(APInt(32, 100), APInt::getMinValue(32))
1830                   .getEquivalentICmp(Pred, RHS));
1831   EXPECT_EQ(Pred, CmpInst::ICMP_UGE);
1832   EXPECT_EQ(RHS, APInt(32, 100));
1833 
1834   EXPECT_TRUE(ConstantRange(APInt(32, 100), APInt::getSignedMinValue(32))
1835                   .getEquivalentICmp(Pred, RHS));
1836   EXPECT_EQ(Pred, CmpInst::ICMP_SGE);
1837   EXPECT_EQ(RHS, APInt(32, 100));
1838 
1839   EXPECT_TRUE(
1840       ConstantRange(32, /*isFullSet=*/true).getEquivalentICmp(Pred, RHS));
1841   EXPECT_EQ(Pred, CmpInst::ICMP_UGE);
1842   EXPECT_EQ(RHS, APInt(32, 0));
1843 
1844   EXPECT_TRUE(
1845       ConstantRange(32, /*isFullSet=*/false).getEquivalentICmp(Pred, RHS));
1846   EXPECT_EQ(Pred, CmpInst::ICMP_ULT);
1847   EXPECT_EQ(RHS, APInt(32, 0));
1848 
1849   EXPECT_FALSE(ConstantRange(APInt(32, 100), APInt(32, 200))
1850                    .getEquivalentICmp(Pred, RHS));
1851 
1852   EXPECT_FALSE(ConstantRange(APInt::getSignedMinValue(32) - APInt(32, 100),
1853                              APInt::getSignedMinValue(32) + APInt(32, 100))
1854                    .getEquivalentICmp(Pred, RHS));
1855 
1856   EXPECT_FALSE(ConstantRange(APInt::getMinValue(32) - APInt(32, 100),
1857                              APInt::getMinValue(32) + APInt(32, 100))
1858                    .getEquivalentICmp(Pred, RHS));
1859 
1860   EXPECT_TRUE(ConstantRange(APInt(32, 100)).getEquivalentICmp(Pred, RHS));
1861   EXPECT_EQ(Pred, CmpInst::ICMP_EQ);
1862   EXPECT_EQ(RHS, APInt(32, 100));
1863 
1864   EXPECT_TRUE(
1865       ConstantRange(APInt(32, 100)).inverse().getEquivalentICmp(Pred, RHS));
1866   EXPECT_EQ(Pred, CmpInst::ICMP_NE);
1867   EXPECT_EQ(RHS, APInt(32, 100));
1868 
1869   EXPECT_TRUE(
1870       ConstantRange(APInt(512, 100)).inverse().getEquivalentICmp(Pred, RHS));
1871   EXPECT_EQ(Pred, CmpInst::ICMP_NE);
1872   EXPECT_EQ(RHS, APInt(512, 100));
1873 
1874   // NB!  It would be correct for the following four calls to getEquivalentICmp
1875   // to return ordered predicates like CmpInst::ICMP_ULT or CmpInst::ICMP_UGT.
1876   // However, that's not the case today.
1877 
1878   EXPECT_TRUE(ConstantRange(APInt(32, 0)).getEquivalentICmp(Pred, RHS));
1879   EXPECT_EQ(Pred, CmpInst::ICMP_EQ);
1880   EXPECT_EQ(RHS, APInt(32, 0));
1881 
1882   EXPECT_TRUE(
1883       ConstantRange(APInt(32, 0)).inverse().getEquivalentICmp(Pred, RHS));
1884   EXPECT_EQ(Pred, CmpInst::ICMP_NE);
1885   EXPECT_EQ(RHS, APInt(32, 0));
1886 
1887   EXPECT_TRUE(ConstantRange(APInt(32, -1)).getEquivalentICmp(Pred, RHS));
1888   EXPECT_EQ(Pred, CmpInst::ICMP_EQ);
1889   EXPECT_EQ(RHS, APInt(32, -1));
1890 
1891   EXPECT_TRUE(
1892       ConstantRange(APInt(32, -1)).inverse().getEquivalentICmp(Pred, RHS));
1893   EXPECT_EQ(Pred, CmpInst::ICMP_NE);
1894   EXPECT_EQ(RHS, APInt(32, -1));
1895 }
1896 
1897 #define EXPECT_MAY_OVERFLOW(op) \
1898   EXPECT_EQ(ConstantRange::OverflowResult::MayOverflow, (op))
1899 #define EXPECT_ALWAYS_OVERFLOWS_LOW(op) \
1900   EXPECT_EQ(ConstantRange::OverflowResult::AlwaysOverflowsLow, (op))
1901 #define EXPECT_ALWAYS_OVERFLOWS_HIGH(op) \
1902   EXPECT_EQ(ConstantRange::OverflowResult::AlwaysOverflowsHigh, (op))
1903 #define EXPECT_NEVER_OVERFLOWS(op) \
1904   EXPECT_EQ(ConstantRange::OverflowResult::NeverOverflows, (op))
1905 
1906 TEST_F(ConstantRangeTest, UnsignedAddOverflow) {
1907   // Ill-defined - may overflow is a conservative result.
1908   EXPECT_MAY_OVERFLOW(Some.unsignedAddMayOverflow(Empty));
1909   EXPECT_MAY_OVERFLOW(Empty.unsignedAddMayOverflow(Some));
1910 
1911   // Never overflow despite one full/wrap set.
1912   ConstantRange Zero(APInt::getNullValue(16));
1913   EXPECT_NEVER_OVERFLOWS(Full.unsignedAddMayOverflow(Zero));
1914   EXPECT_NEVER_OVERFLOWS(Wrap.unsignedAddMayOverflow(Zero));
1915   EXPECT_NEVER_OVERFLOWS(Zero.unsignedAddMayOverflow(Full));
1916   EXPECT_NEVER_OVERFLOWS(Zero.unsignedAddMayOverflow(Wrap));
1917 
1918   // But usually full/wrap always may overflow.
1919   EXPECT_MAY_OVERFLOW(Full.unsignedAddMayOverflow(One));
1920   EXPECT_MAY_OVERFLOW(Wrap.unsignedAddMayOverflow(One));
1921   EXPECT_MAY_OVERFLOW(One.unsignedAddMayOverflow(Full));
1922   EXPECT_MAY_OVERFLOW(One.unsignedAddMayOverflow(Wrap));
1923 
1924   ConstantRange A(APInt(16, 0xfd00), APInt(16, 0xfe00));
1925   ConstantRange B1(APInt(16, 0x0100), APInt(16, 0x0201));
1926   ConstantRange B2(APInt(16, 0x0100), APInt(16, 0x0202));
1927   EXPECT_NEVER_OVERFLOWS(A.unsignedAddMayOverflow(B1));
1928   EXPECT_MAY_OVERFLOW(A.unsignedAddMayOverflow(B2));
1929   EXPECT_NEVER_OVERFLOWS(B1.unsignedAddMayOverflow(A));
1930   EXPECT_MAY_OVERFLOW(B2.unsignedAddMayOverflow(A));
1931 
1932   ConstantRange C1(APInt(16, 0x0299), APInt(16, 0x0400));
1933   ConstantRange C2(APInt(16, 0x0300), APInt(16, 0x0400));
1934   EXPECT_MAY_OVERFLOW(A.unsignedAddMayOverflow(C1));
1935   EXPECT_ALWAYS_OVERFLOWS_HIGH(A.unsignedAddMayOverflow(C2));
1936   EXPECT_MAY_OVERFLOW(C1.unsignedAddMayOverflow(A));
1937   EXPECT_ALWAYS_OVERFLOWS_HIGH(C2.unsignedAddMayOverflow(A));
1938 }
1939 
1940 TEST_F(ConstantRangeTest, UnsignedSubOverflow) {
1941   // Ill-defined - may overflow is a conservative result.
1942   EXPECT_MAY_OVERFLOW(Some.unsignedSubMayOverflow(Empty));
1943   EXPECT_MAY_OVERFLOW(Empty.unsignedSubMayOverflow(Some));
1944 
1945   // Never overflow despite one full/wrap set.
1946   ConstantRange Zero(APInt::getNullValue(16));
1947   ConstantRange Max(APInt::getAllOnesValue(16));
1948   EXPECT_NEVER_OVERFLOWS(Full.unsignedSubMayOverflow(Zero));
1949   EXPECT_NEVER_OVERFLOWS(Wrap.unsignedSubMayOverflow(Zero));
1950   EXPECT_NEVER_OVERFLOWS(Max.unsignedSubMayOverflow(Full));
1951   EXPECT_NEVER_OVERFLOWS(Max.unsignedSubMayOverflow(Wrap));
1952 
1953   // But usually full/wrap always may overflow.
1954   EXPECT_MAY_OVERFLOW(Full.unsignedSubMayOverflow(One));
1955   EXPECT_MAY_OVERFLOW(Wrap.unsignedSubMayOverflow(One));
1956   EXPECT_MAY_OVERFLOW(One.unsignedSubMayOverflow(Full));
1957   EXPECT_MAY_OVERFLOW(One.unsignedSubMayOverflow(Wrap));
1958 
1959   ConstantRange A(APInt(16, 0x0000), APInt(16, 0x0100));
1960   ConstantRange B(APInt(16, 0x0100), APInt(16, 0x0200));
1961   EXPECT_NEVER_OVERFLOWS(B.unsignedSubMayOverflow(A));
1962   EXPECT_ALWAYS_OVERFLOWS_LOW(A.unsignedSubMayOverflow(B));
1963 
1964   ConstantRange A1(APInt(16, 0x0000), APInt(16, 0x0101));
1965   ConstantRange B1(APInt(16, 0x0100), APInt(16, 0x0201));
1966   EXPECT_NEVER_OVERFLOWS(B1.unsignedSubMayOverflow(A1));
1967   EXPECT_MAY_OVERFLOW(A1.unsignedSubMayOverflow(B1));
1968 
1969   ConstantRange A2(APInt(16, 0x0000), APInt(16, 0x0102));
1970   ConstantRange B2(APInt(16, 0x0100), APInt(16, 0x0202));
1971   EXPECT_MAY_OVERFLOW(B2.unsignedSubMayOverflow(A2));
1972   EXPECT_MAY_OVERFLOW(A2.unsignedSubMayOverflow(B2));
1973 }
1974 
1975 TEST_F(ConstantRangeTest, SignedAddOverflow) {
1976   // Ill-defined - may overflow is a conservative result.
1977   EXPECT_MAY_OVERFLOW(Some.signedAddMayOverflow(Empty));
1978   EXPECT_MAY_OVERFLOW(Empty.signedAddMayOverflow(Some));
1979 
1980   // Never overflow despite one full/wrap set.
1981   ConstantRange Zero(APInt::getNullValue(16));
1982   EXPECT_NEVER_OVERFLOWS(Full.signedAddMayOverflow(Zero));
1983   EXPECT_NEVER_OVERFLOWS(Wrap.signedAddMayOverflow(Zero));
1984   EXPECT_NEVER_OVERFLOWS(Zero.signedAddMayOverflow(Full));
1985   EXPECT_NEVER_OVERFLOWS(Zero.signedAddMayOverflow(Wrap));
1986 
1987   // But usually full/wrap always may overflow.
1988   EXPECT_MAY_OVERFLOW(Full.signedAddMayOverflow(One));
1989   EXPECT_MAY_OVERFLOW(Wrap.signedAddMayOverflow(One));
1990   EXPECT_MAY_OVERFLOW(One.signedAddMayOverflow(Full));
1991   EXPECT_MAY_OVERFLOW(One.signedAddMayOverflow(Wrap));
1992 
1993   ConstantRange A(APInt(16, 0x7d00), APInt(16, 0x7e00));
1994   ConstantRange B1(APInt(16, 0x0100), APInt(16, 0x0201));
1995   ConstantRange B2(APInt(16, 0x0100), APInt(16, 0x0202));
1996   EXPECT_NEVER_OVERFLOWS(A.signedAddMayOverflow(B1));
1997   EXPECT_MAY_OVERFLOW(A.signedAddMayOverflow(B2));
1998   ConstantRange B3(APInt(16, 0x8000), APInt(16, 0x0201));
1999   ConstantRange B4(APInt(16, 0x8000), APInt(16, 0x0202));
2000   EXPECT_NEVER_OVERFLOWS(A.signedAddMayOverflow(B3));
2001   EXPECT_MAY_OVERFLOW(A.signedAddMayOverflow(B4));
2002   ConstantRange B5(APInt(16, 0x0299), APInt(16, 0x0400));
2003   ConstantRange B6(APInt(16, 0x0300), APInt(16, 0x0400));
2004   EXPECT_MAY_OVERFLOW(A.signedAddMayOverflow(B5));
2005   EXPECT_ALWAYS_OVERFLOWS_HIGH(A.signedAddMayOverflow(B6));
2006 
2007   ConstantRange C(APInt(16, 0x8200), APInt(16, 0x8300));
2008   ConstantRange D1(APInt(16, 0xfe00), APInt(16, 0xff00));
2009   ConstantRange D2(APInt(16, 0xfd99), APInt(16, 0xff00));
2010   EXPECT_NEVER_OVERFLOWS(C.signedAddMayOverflow(D1));
2011   EXPECT_MAY_OVERFLOW(C.signedAddMayOverflow(D2));
2012   ConstantRange D3(APInt(16, 0xfe00), APInt(16, 0x8000));
2013   ConstantRange D4(APInt(16, 0xfd99), APInt(16, 0x8000));
2014   EXPECT_NEVER_OVERFLOWS(C.signedAddMayOverflow(D3));
2015   EXPECT_MAY_OVERFLOW(C.signedAddMayOverflow(D4));
2016   ConstantRange D5(APInt(16, 0xfc00), APInt(16, 0xfd02));
2017   ConstantRange D6(APInt(16, 0xfc00), APInt(16, 0xfd01));
2018   EXPECT_MAY_OVERFLOW(C.signedAddMayOverflow(D5));
2019   EXPECT_ALWAYS_OVERFLOWS_LOW(C.signedAddMayOverflow(D6));
2020 
2021   ConstantRange E(APInt(16, 0xff00), APInt(16, 0x0100));
2022   EXPECT_NEVER_OVERFLOWS(E.signedAddMayOverflow(E));
2023   ConstantRange F(APInt(16, 0xf000), APInt(16, 0x7000));
2024   EXPECT_MAY_OVERFLOW(F.signedAddMayOverflow(F));
2025 }
2026 
2027 TEST_F(ConstantRangeTest, SignedSubOverflow) {
2028   // Ill-defined - may overflow is a conservative result.
2029   EXPECT_MAY_OVERFLOW(Some.signedSubMayOverflow(Empty));
2030   EXPECT_MAY_OVERFLOW(Empty.signedSubMayOverflow(Some));
2031 
2032   // Never overflow despite one full/wrap set.
2033   ConstantRange Zero(APInt::getNullValue(16));
2034   EXPECT_NEVER_OVERFLOWS(Full.signedSubMayOverflow(Zero));
2035   EXPECT_NEVER_OVERFLOWS(Wrap.signedSubMayOverflow(Zero));
2036 
2037   // But usually full/wrap always may overflow.
2038   EXPECT_MAY_OVERFLOW(Full.signedSubMayOverflow(One));
2039   EXPECT_MAY_OVERFLOW(Wrap.signedSubMayOverflow(One));
2040   EXPECT_MAY_OVERFLOW(One.signedSubMayOverflow(Full));
2041   EXPECT_MAY_OVERFLOW(One.signedSubMayOverflow(Wrap));
2042 
2043   ConstantRange A(APInt(16, 0x7d00), APInt(16, 0x7e00));
2044   ConstantRange B1(APInt(16, 0xfe00), APInt(16, 0xff00));
2045   ConstantRange B2(APInt(16, 0xfd99), APInt(16, 0xff00));
2046   EXPECT_NEVER_OVERFLOWS(A.signedSubMayOverflow(B1));
2047   EXPECT_MAY_OVERFLOW(A.signedSubMayOverflow(B2));
2048   ConstantRange B3(APInt(16, 0xfc00), APInt(16, 0xfd02));
2049   ConstantRange B4(APInt(16, 0xfc00), APInt(16, 0xfd01));
2050   EXPECT_MAY_OVERFLOW(A.signedSubMayOverflow(B3));
2051   EXPECT_ALWAYS_OVERFLOWS_HIGH(A.signedSubMayOverflow(B4));
2052 
2053   ConstantRange C(APInt(16, 0x8200), APInt(16, 0x8300));
2054   ConstantRange D1(APInt(16, 0x0100), APInt(16, 0x0201));
2055   ConstantRange D2(APInt(16, 0x0100), APInt(16, 0x0202));
2056   EXPECT_NEVER_OVERFLOWS(C.signedSubMayOverflow(D1));
2057   EXPECT_MAY_OVERFLOW(C.signedSubMayOverflow(D2));
2058   ConstantRange D3(APInt(16, 0x0299), APInt(16, 0x0400));
2059   ConstantRange D4(APInt(16, 0x0300), APInt(16, 0x0400));
2060   EXPECT_MAY_OVERFLOW(C.signedSubMayOverflow(D3));
2061   EXPECT_ALWAYS_OVERFLOWS_LOW(C.signedSubMayOverflow(D4));
2062 
2063   ConstantRange E(APInt(16, 0xff00), APInt(16, 0x0100));
2064   EXPECT_NEVER_OVERFLOWS(E.signedSubMayOverflow(E));
2065   ConstantRange F(APInt(16, 0xf000), APInt(16, 0x7001));
2066   EXPECT_MAY_OVERFLOW(F.signedSubMayOverflow(F));
2067 }
2068 
2069 template<typename Fn1, typename Fn2>
2070 static void TestOverflowExhaustive(Fn1 OverflowFn, Fn2 MayOverflowFn) {
2071   // Constant range overflow checks are tested exhaustively on 4-bit numbers.
2072   unsigned Bits = 4;
2073   EnumerateTwoConstantRanges(Bits, [=](const ConstantRange &CR1,
2074                                        const ConstantRange &CR2) {
2075     // Loop over all N1 in CR1 and N2 in CR2 and check whether any of the
2076     // operations have overflow / have no overflow.
2077     bool RangeHasOverflowLow = false;
2078     bool RangeHasOverflowHigh = false;
2079     bool RangeHasNoOverflow = false;
2080     ForeachNumInConstantRange(CR1, [&](const APInt &N1) {
2081       ForeachNumInConstantRange(CR2, [&](const APInt &N2) {
2082         bool IsOverflowHigh;
2083         if (!OverflowFn(IsOverflowHigh, N1, N2)) {
2084           RangeHasNoOverflow = true;
2085           return;
2086         }
2087 
2088         if (IsOverflowHigh)
2089           RangeHasOverflowHigh = true;
2090         else
2091           RangeHasOverflowLow = true;
2092       });
2093     });
2094 
2095     ConstantRange::OverflowResult OR = MayOverflowFn(CR1, CR2);
2096     switch (OR) {
2097     case ConstantRange::OverflowResult::AlwaysOverflowsLow:
2098       EXPECT_TRUE(RangeHasOverflowLow);
2099       EXPECT_FALSE(RangeHasOverflowHigh);
2100       EXPECT_FALSE(RangeHasNoOverflow);
2101       break;
2102     case ConstantRange::OverflowResult::AlwaysOverflowsHigh:
2103       EXPECT_TRUE(RangeHasOverflowHigh);
2104       EXPECT_FALSE(RangeHasOverflowLow);
2105       EXPECT_FALSE(RangeHasNoOverflow);
2106       break;
2107     case ConstantRange::OverflowResult::NeverOverflows:
2108       EXPECT_FALSE(RangeHasOverflowLow);
2109       EXPECT_FALSE(RangeHasOverflowHigh);
2110       EXPECT_TRUE(RangeHasNoOverflow);
2111       break;
2112     case ConstantRange::OverflowResult::MayOverflow:
2113       // We return MayOverflow for empty sets as a conservative result,
2114       // but of course neither the RangeHasOverflow nor the
2115       // RangeHasNoOverflow flags will be set.
2116       if (CR1.isEmptySet() || CR2.isEmptySet())
2117         break;
2118 
2119       EXPECT_TRUE(RangeHasOverflowLow || RangeHasOverflowHigh);
2120       EXPECT_TRUE(RangeHasNoOverflow);
2121       break;
2122     }
2123   });
2124 }
2125 
2126 TEST_F(ConstantRangeTest, UnsignedAddOverflowExhaustive) {
2127   TestOverflowExhaustive(
2128       [](bool &IsOverflowHigh, const APInt &N1, const APInt &N2) {
2129         bool Overflow;
2130         (void) N1.uadd_ov(N2, Overflow);
2131         IsOverflowHigh = true;
2132         return Overflow;
2133       },
2134       [](const ConstantRange &CR1, const ConstantRange &CR2) {
2135         return CR1.unsignedAddMayOverflow(CR2);
2136       });
2137 }
2138 
2139 TEST_F(ConstantRangeTest, UnsignedSubOverflowExhaustive) {
2140   TestOverflowExhaustive(
2141       [](bool &IsOverflowHigh, const APInt &N1, const APInt &N2) {
2142         bool Overflow;
2143         (void) N1.usub_ov(N2, Overflow);
2144         IsOverflowHigh = false;
2145         return Overflow;
2146       },
2147       [](const ConstantRange &CR1, const ConstantRange &CR2) {
2148         return CR1.unsignedSubMayOverflow(CR2);
2149       });
2150 }
2151 
2152 TEST_F(ConstantRangeTest, UnsignedMulOverflowExhaustive) {
2153   TestOverflowExhaustive(
2154       [](bool &IsOverflowHigh, const APInt &N1, const APInt &N2) {
2155         bool Overflow;
2156         (void) N1.umul_ov(N2, Overflow);
2157         IsOverflowHigh = true;
2158         return Overflow;
2159       },
2160       [](const ConstantRange &CR1, const ConstantRange &CR2) {
2161         return CR1.unsignedMulMayOverflow(CR2);
2162       });
2163 }
2164 
2165 TEST_F(ConstantRangeTest, SignedAddOverflowExhaustive) {
2166   TestOverflowExhaustive(
2167       [](bool &IsOverflowHigh, const APInt &N1, const APInt &N2) {
2168         bool Overflow;
2169         (void) N1.sadd_ov(N2, Overflow);
2170         IsOverflowHigh = N1.isNonNegative();
2171         return Overflow;
2172       },
2173       [](const ConstantRange &CR1, const ConstantRange &CR2) {
2174         return CR1.signedAddMayOverflow(CR2);
2175       });
2176 }
2177 
2178 TEST_F(ConstantRangeTest, SignedSubOverflowExhaustive) {
2179   TestOverflowExhaustive(
2180       [](bool &IsOverflowHigh, const APInt &N1, const APInt &N2) {
2181         bool Overflow;
2182         (void) N1.ssub_ov(N2, Overflow);
2183         IsOverflowHigh = N1.isNonNegative();
2184         return Overflow;
2185       },
2186       [](const ConstantRange &CR1, const ConstantRange &CR2) {
2187         return CR1.signedSubMayOverflow(CR2);
2188       });
2189 }
2190 
2191 TEST_F(ConstantRangeTest, FromKnownBits) {
2192   KnownBits Unknown(16);
2193   EXPECT_EQ(Full, ConstantRange::fromKnownBits(Unknown, /*signed*/false));
2194   EXPECT_EQ(Full, ConstantRange::fromKnownBits(Unknown, /*signed*/true));
2195 
2196   // .10..01. -> unsigned 01000010 (66)  to 11011011 (219)
2197   //          -> signed   11000010 (194) to 01011011 (91)
2198   KnownBits Known(8);
2199   Known.Zero = 36;
2200   Known.One = 66;
2201   ConstantRange Unsigned(APInt(8, 66), APInt(8, 219 + 1));
2202   ConstantRange Signed(APInt(8, 194), APInt(8, 91 + 1));
2203   EXPECT_EQ(Unsigned, ConstantRange::fromKnownBits(Known, /*signed*/false));
2204   EXPECT_EQ(Signed, ConstantRange::fromKnownBits(Known, /*signed*/true));
2205 
2206   // 1.10.10. -> 10100100 (164) to 11101101 (237)
2207   Known.Zero = 18;
2208   Known.One = 164;
2209   ConstantRange CR1(APInt(8, 164), APInt(8, 237 + 1));
2210   EXPECT_EQ(CR1, ConstantRange::fromKnownBits(Known, /*signed*/false));
2211   EXPECT_EQ(CR1, ConstantRange::fromKnownBits(Known, /*signed*/true));
2212 
2213   // 01.0.1.0 -> 01000100 (68) to 01101110 (110)
2214   Known.Zero = 145;
2215   Known.One = 68;
2216   ConstantRange CR2(APInt(8, 68), APInt(8, 110 + 1));
2217   EXPECT_EQ(CR2, ConstantRange::fromKnownBits(Known, /*signed*/false));
2218   EXPECT_EQ(CR2, ConstantRange::fromKnownBits(Known, /*signed*/true));
2219 }
2220 
2221 TEST_F(ConstantRangeTest, FromKnownBitsExhaustive) {
2222   unsigned Bits = 4;
2223   unsigned Max = 1 << Bits;
2224   KnownBits Known(Bits);
2225   for (unsigned Zero = 0; Zero < Max; ++Zero) {
2226     for (unsigned One = 0; One < Max; ++One) {
2227       Known.Zero = Zero;
2228       Known.One = One;
2229       if (Known.hasConflict() || Known.isUnknown())
2230         continue;
2231 
2232       APInt MinUnsigned = APInt::getMaxValue(Bits);
2233       APInt MaxUnsigned = APInt::getMinValue(Bits);
2234       APInt MinSigned = APInt::getSignedMaxValue(Bits);
2235       APInt MaxSigned = APInt::getSignedMinValue(Bits);
2236       for (unsigned N = 0; N < Max; ++N) {
2237         APInt Num(Bits, N);
2238         if ((Num & Known.Zero) != 0 || (~Num & Known.One) != 0)
2239           continue;
2240 
2241         if (Num.ult(MinUnsigned)) MinUnsigned = Num;
2242         if (Num.ugt(MaxUnsigned)) MaxUnsigned = Num;
2243         if (Num.slt(MinSigned)) MinSigned = Num;
2244         if (Num.sgt(MaxSigned)) MaxSigned = Num;
2245       }
2246 
2247       ConstantRange UnsignedCR(MinUnsigned, MaxUnsigned + 1);
2248       ConstantRange SignedCR(MinSigned, MaxSigned + 1);
2249       EXPECT_EQ(UnsignedCR, ConstantRange::fromKnownBits(Known, false));
2250       EXPECT_EQ(SignedCR, ConstantRange::fromKnownBits(Known, true));
2251     }
2252   }
2253 }
2254 
2255 TEST_F(ConstantRangeTest, Negative) {
2256   // All elements in an empty set (of which there are none) are both negative
2257   // and non-negative. Empty & full sets checked explicitly for clarity, but
2258   // they are also covered by the exhaustive test below.
2259   EXPECT_TRUE(Empty.isAllNegative());
2260   EXPECT_TRUE(Empty.isAllNonNegative());
2261   EXPECT_FALSE(Full.isAllNegative());
2262   EXPECT_FALSE(Full.isAllNonNegative());
2263 
2264   unsigned Bits = 4;
2265   EnumerateConstantRanges(Bits, [](const ConstantRange &CR) {
2266     bool AllNegative = true;
2267     bool AllNonNegative = true;
2268     ForeachNumInConstantRange(CR, [&](const APInt &N) {
2269       if (!N.isNegative())
2270         AllNegative = false;
2271       if (!N.isNonNegative())
2272         AllNonNegative = false;
2273     });
2274     assert((CR.isEmptySet() || !AllNegative || !AllNonNegative) &&
2275            "Only empty set can be both all negative and all non-negative");
2276 
2277     EXPECT_EQ(AllNegative, CR.isAllNegative());
2278     EXPECT_EQ(AllNonNegative, CR.isAllNonNegative());
2279   });
2280 }
2281 
2282 TEST_F(ConstantRangeTest, UAddSat) {
2283   TestUnsignedBinOpExhaustive(
2284       [](const ConstantRange &CR1, const ConstantRange &CR2) {
2285         return CR1.uadd_sat(CR2);
2286       },
2287       [](const APInt &N1, const APInt &N2) {
2288         return N1.uadd_sat(N2);
2289       });
2290 }
2291 
2292 TEST_F(ConstantRangeTest, USubSat) {
2293   TestUnsignedBinOpExhaustive(
2294       [](const ConstantRange &CR1, const ConstantRange &CR2) {
2295         return CR1.usub_sat(CR2);
2296       },
2297       [](const APInt &N1, const APInt &N2) {
2298         return N1.usub_sat(N2);
2299       });
2300 }
2301 
2302 TEST_F(ConstantRangeTest, UMulSat) {
2303   TestUnsignedBinOpExhaustive(
2304       [](const ConstantRange &CR1, const ConstantRange &CR2) {
2305         return CR1.umul_sat(CR2);
2306       },
2307       [](const APInt &N1, const APInt &N2) { return N1.umul_sat(N2); });
2308 }
2309 
2310 TEST_F(ConstantRangeTest, UShlSat) {
2311   TestUnsignedBinOpExhaustive(
2312       [](const ConstantRange &CR1, const ConstantRange &CR2) {
2313         return CR1.ushl_sat(CR2);
2314       },
2315       [](const APInt &N1, const APInt &N2) { return N1.ushl_sat(N2); });
2316 }
2317 
2318 TEST_F(ConstantRangeTest, SAddSat) {
2319   TestSignedBinOpExhaustive(
2320       [](const ConstantRange &CR1, const ConstantRange &CR2) {
2321         return CR1.sadd_sat(CR2);
2322       },
2323       [](const APInt &N1, const APInt &N2) {
2324         return N1.sadd_sat(N2);
2325       });
2326 }
2327 
2328 TEST_F(ConstantRangeTest, SSubSat) {
2329   TestSignedBinOpExhaustive(
2330       [](const ConstantRange &CR1, const ConstantRange &CR2) {
2331         return CR1.ssub_sat(CR2);
2332       },
2333       [](const APInt &N1, const APInt &N2) {
2334         return N1.ssub_sat(N2);
2335       });
2336 }
2337 
2338 TEST_F(ConstantRangeTest, SMulSat) {
2339   TestSignedBinOpExhaustive(
2340       [](const ConstantRange &CR1, const ConstantRange &CR2) {
2341         return CR1.smul_sat(CR2);
2342       },
2343       [](const APInt &N1, const APInt &N2) { return N1.smul_sat(N2); });
2344 }
2345 
2346 TEST_F(ConstantRangeTest, SShlSat) {
2347   TestSignedBinOpExhaustive(
2348       [](const ConstantRange &CR1, const ConstantRange &CR2) {
2349         return CR1.sshl_sat(CR2);
2350       },
2351       [](const APInt &N1, const APInt &N2) { return N1.sshl_sat(N2); });
2352 }
2353 
2354 TEST_F(ConstantRangeTest, Abs) {
2355   // We're working with unsigned integers here, because it makes the signed
2356   // min case non-wrapping.
2357   TestUnsignedUnaryOpExhaustive(
2358       [](const ConstantRange &CR) { return CR.abs(); },
2359       [](const APInt &N) { return N.abs(); });
2360 
2361   TestUnsignedUnaryOpExhaustive(
2362       [](const ConstantRange &CR) { return CR.abs(/*IntMinIsPoison=*/true); },
2363       [](const APInt &N) { return N.abs(); },
2364       /*SkipSignedIntMin=*/true);
2365 }
2366 
2367 TEST_F(ConstantRangeTest, castOps) {
2368   ConstantRange A(APInt(16, 66), APInt(16, 128));
2369   ConstantRange FpToI8 = A.castOp(Instruction::FPToSI, 8);
2370   EXPECT_EQ(8u, FpToI8.getBitWidth());
2371   EXPECT_TRUE(FpToI8.isFullSet());
2372 
2373   ConstantRange FpToI16 = A.castOp(Instruction::FPToSI, 16);
2374   EXPECT_EQ(16u, FpToI16.getBitWidth());
2375   EXPECT_EQ(A, FpToI16);
2376 
2377   ConstantRange FPExtToDouble = A.castOp(Instruction::FPExt, 64);
2378   EXPECT_EQ(64u, FPExtToDouble.getBitWidth());
2379   EXPECT_TRUE(FPExtToDouble.isFullSet());
2380 
2381   ConstantRange PtrToInt = A.castOp(Instruction::PtrToInt, 64);
2382   EXPECT_EQ(64u, PtrToInt.getBitWidth());
2383   EXPECT_TRUE(PtrToInt.isFullSet());
2384 
2385   ConstantRange IntToPtr = A.castOp(Instruction::IntToPtr, 64);
2386   EXPECT_EQ(64u, IntToPtr.getBitWidth());
2387   EXPECT_TRUE(IntToPtr.isFullSet());
2388 }
2389 
2390 TEST_F(ConstantRangeTest, binaryXor) {
2391   // Single element ranges.
2392   ConstantRange R16(APInt(8, 16));
2393   ConstantRange R20(APInt(8, 20));
2394   EXPECT_EQ(*R16.binaryXor(R16).getSingleElement(), APInt(8, 0));
2395   EXPECT_EQ(*R16.binaryXor(R20).getSingleElement(), APInt(8, 16 ^ 20));
2396 
2397   // Ranges with more than a single element. Handled conservatively for now.
2398   ConstantRange R16_35(APInt(8, 16), APInt(8, 35));
2399   ConstantRange R0_99(APInt(8, 0), APInt(8, 99));
2400   EXPECT_TRUE(R16_35.binaryXor(R16_35).isFullSet());
2401   EXPECT_TRUE(R16_35.binaryXor(R0_99).isFullSet());
2402   EXPECT_TRUE(R0_99.binaryXor(R16_35).isFullSet());
2403 }
2404 
2405 TEST_F(ConstantRangeTest, binaryNot) {
2406   TestUnsignedUnaryOpExhaustive(
2407       [](const ConstantRange &CR) { return CR.binaryNot(); },
2408       [](const APInt &N) { return ~N; });
2409   TestUnsignedUnaryOpExhaustive(
2410       [](const ConstantRange &CR) {
2411         return CR.binaryXor(
2412             ConstantRange(APInt::getAllOnesValue(CR.getBitWidth())));
2413       },
2414       [](const APInt &N) { return ~N; });
2415   TestUnsignedUnaryOpExhaustive(
2416       [](const ConstantRange &CR) {
2417         return ConstantRange(APInt::getAllOnesValue(CR.getBitWidth()))
2418             .binaryXor(CR);
2419       },
2420       [](const APInt &N) { return ~N; });
2421 }
2422 
2423 }  // anonymous namespace
2424