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, SubtractAPInt) {
645   EXPECT_EQ(Full.subtract(APInt(16, 4)), Full);
646   EXPECT_EQ(Empty.subtract(APInt(16, 4)), Empty);
647   EXPECT_EQ(Some.subtract(APInt(16, 4)),
648             ConstantRange(APInt(16, 0x6), APInt(16, 0xaa6)));
649   EXPECT_EQ(Wrap.subtract(APInt(16, 4)),
650             ConstantRange(APInt(16, 0xaa6), APInt(16, 0x6)));
651   EXPECT_EQ(One.subtract(APInt(16, 4)),
652             ConstantRange(APInt(16, 0x6)));
653 }
654 
655 TEST_F(ConstantRangeTest, Add) {
656   EXPECT_EQ(Full.add(APInt(16, 4)), Full);
657   EXPECT_EQ(Full.add(Full), Full);
658   EXPECT_EQ(Full.add(Empty), Empty);
659   EXPECT_EQ(Full.add(One), Full);
660   EXPECT_EQ(Full.add(Some), Full);
661   EXPECT_EQ(Full.add(Wrap), Full);
662   EXPECT_EQ(Empty.add(Empty), Empty);
663   EXPECT_EQ(Empty.add(One), Empty);
664   EXPECT_EQ(Empty.add(Some), Empty);
665   EXPECT_EQ(Empty.add(Wrap), Empty);
666   EXPECT_EQ(Empty.add(APInt(16, 4)), Empty);
667   EXPECT_EQ(Some.add(APInt(16, 4)),
668             ConstantRange(APInt(16, 0xe), APInt(16, 0xaae)));
669   EXPECT_EQ(Wrap.add(APInt(16, 4)),
670             ConstantRange(APInt(16, 0xaae), APInt(16, 0xe)));
671   EXPECT_EQ(One.add(APInt(16, 4)),
672             ConstantRange(APInt(16, 0xe)));
673 }
674 
675 template <typename Fn1, typename Fn2>
676 static void TestAddWithNoSignedWrapExhaustive(Fn1 RangeFn, Fn2 IntFn) {
677   unsigned Bits = 4;
678   EnumerateTwoConstantRanges(Bits, [&](const ConstantRange &CR1,
679                                        const ConstantRange &CR2) {
680     ConstantRange CR = RangeFn(CR1, CR2);
681     APInt Min = APInt::getSignedMaxValue(Bits);
682     APInt Max = APInt::getSignedMinValue(Bits);
683     bool AllOverflow = true;
684     ForeachNumInConstantRange(CR1, [&](const APInt &N1) {
685       ForeachNumInConstantRange(CR2, [&](const APInt &N2) {
686         bool IsOverflow = false;
687         APInt N = IntFn(IsOverflow, N1, N2);
688         if (!IsOverflow) {
689           AllOverflow = false;
690           if (N.slt(Min))
691             Min = N;
692           if (N.sgt(Max))
693             Max = N;
694           EXPECT_TRUE(CR.contains(N));
695         }
696       });
697     });
698 
699     EXPECT_EQ(CR.isEmptySet(), AllOverflow);
700 
701     if (!CR1.isSignWrappedSet() && !CR2.isSignWrappedSet()) {
702       if (Min.sgt(Max)) {
703         EXPECT_TRUE(CR.isEmptySet());
704         return;
705       }
706 
707       ConstantRange Exact = ConstantRange::getNonEmpty(Min, Max + 1);
708       EXPECT_EQ(Exact, CR);
709     }
710   });
711 }
712 
713 template <typename Fn1, typename Fn2>
714 static void TestAddWithNoUnsignedWrapExhaustive(Fn1 RangeFn, Fn2 IntFn) {
715   unsigned Bits = 4;
716   EnumerateTwoConstantRanges(Bits, [&](const ConstantRange &CR1,
717                                        const ConstantRange &CR2) {
718     ConstantRange CR = RangeFn(CR1, CR2);
719     APInt Min = APInt::getMaxValue(Bits);
720     APInt Max = APInt::getMinValue(Bits);
721     bool AllOverflow = true;
722     ForeachNumInConstantRange(CR1, [&](const APInt &N1) {
723       ForeachNumInConstantRange(CR2, [&](const APInt &N2) {
724         bool IsOverflow = false;
725         APInt N = IntFn(IsOverflow, N1, N2);
726         if (!IsOverflow) {
727           AllOverflow = false;
728           if (N.ult(Min))
729             Min = N;
730           if (N.ugt(Max))
731             Max = N;
732           EXPECT_TRUE(CR.contains(N));
733         }
734       });
735     });
736 
737     EXPECT_EQ(CR.isEmptySet(), AllOverflow);
738 
739     if (!CR1.isWrappedSet() && !CR2.isWrappedSet()) {
740       if (Min.ugt(Max)) {
741         EXPECT_TRUE(CR.isEmptySet());
742         return;
743       }
744 
745       ConstantRange Exact = ConstantRange::getNonEmpty(Min, Max + 1);
746       EXPECT_EQ(Exact, CR);
747     }
748   });
749 }
750 
751 template <typename Fn1, typename Fn2, typename Fn3>
752 static void TestAddWithNoSignedUnsignedWrapExhaustive(Fn1 RangeFn,
753                                                       Fn2 IntFnSigned,
754                                                       Fn3 IntFnUnsigned) {
755   unsigned Bits = 4;
756   EnumerateTwoConstantRanges(
757       Bits, [&](const ConstantRange &CR1, const ConstantRange &CR2) {
758         ConstantRange CR = RangeFn(CR1, CR2);
759         APInt UMin = APInt::getMaxValue(Bits);
760         APInt UMax = APInt::getMinValue(Bits);
761         APInt SMin = APInt::getSignedMaxValue(Bits);
762         APInt SMax = APInt::getSignedMinValue(Bits);
763         bool AllOverflow = true;
764         ForeachNumInConstantRange(CR1, [&](const APInt &N1) {
765           ForeachNumInConstantRange(CR2, [&](const APInt &N2) {
766             bool IsOverflow = false, IsSignedOverflow = false;
767             APInt N = IntFnSigned(IsSignedOverflow, N1, N2);
768             (void) IntFnUnsigned(IsOverflow, N1, N2);
769             if (!IsSignedOverflow && !IsOverflow) {
770               AllOverflow = false;
771               if (N.slt(SMin))
772                 SMin = N;
773               if (N.sgt(SMax))
774                 SMax = N;
775               if (N.ult(UMin))
776                 UMin = N;
777               if (N.ugt(UMax))
778                 UMax = N;
779               EXPECT_TRUE(CR.contains(N));
780             }
781           });
782         });
783 
784         EXPECT_EQ(CR.isEmptySet(), AllOverflow);
785 
786         if (!CR1.isWrappedSet() && !CR2.isWrappedSet() &&
787             !CR1.isSignWrappedSet() && !CR2.isSignWrappedSet()) {
788           if (UMin.ugt(UMax) || SMin.sgt(SMax)) {
789             EXPECT_TRUE(CR.isEmptySet());
790             return;
791           }
792 
793           ConstantRange Exact =
794               ConstantRange::getNonEmpty(SMin, SMax + 1)
795                   .intersectWith(ConstantRange::getNonEmpty(UMin, UMax + 1));
796           EXPECT_EQ(Exact, CR);
797         }
798       });
799 }
800 
801 TEST_F(ConstantRangeTest, AddWithNoWrap) {
802   typedef OverflowingBinaryOperator OBO;
803   EXPECT_EQ(Empty.addWithNoWrap(Some, OBO::NoSignedWrap), Empty);
804   EXPECT_EQ(Some.addWithNoWrap(Empty, OBO::NoSignedWrap), Empty);
805   EXPECT_EQ(Full.addWithNoWrap(Full, OBO::NoSignedWrap), Full);
806   EXPECT_NE(Full.addWithNoWrap(Some, OBO::NoSignedWrap), Full);
807   EXPECT_NE(Some.addWithNoWrap(Full, OBO::NoSignedWrap), Full);
808   EXPECT_EQ(Full.addWithNoWrap(ConstantRange(APInt(16, 1), APInt(16, 2)),
809                                OBO::NoSignedWrap),
810             ConstantRange(APInt(16, INT16_MIN + 1), APInt(16, INT16_MIN)));
811   EXPECT_EQ(ConstantRange(APInt(16, 1), APInt(16, 2))
812                 .addWithNoWrap(Full, OBO::NoSignedWrap),
813             ConstantRange(APInt(16, INT16_MIN + 1), APInt(16, INT16_MIN)));
814   EXPECT_EQ(Full.addWithNoWrap(ConstantRange(APInt(16, -1), APInt(16, 0)),
815                                OBO::NoSignedWrap),
816             ConstantRange(APInt(16, INT16_MIN), APInt(16, INT16_MAX)));
817   EXPECT_EQ(ConstantRange(APInt(8, 100), APInt(8, 120))
818                 .addWithNoWrap(ConstantRange(APInt(8, 120), APInt(8, 123)),
819                                OBO::NoSignedWrap),
820             ConstantRange(8, false));
821   EXPECT_EQ(ConstantRange(APInt(8, -120), APInt(8, -100))
822                 .addWithNoWrap(ConstantRange(APInt(8, -110), APInt(8, -100)),
823                                OBO::NoSignedWrap),
824             ConstantRange(8, false));
825   EXPECT_EQ(ConstantRange(APInt(8, 0), APInt(8, 101))
826                 .addWithNoWrap(ConstantRange(APInt(8, -128), APInt(8, 28)),
827                                OBO::NoSignedWrap),
828             ConstantRange(8, true));
829   EXPECT_EQ(ConstantRange(APInt(8, 0), APInt(8, 101))
830                 .addWithNoWrap(ConstantRange(APInt(8, -120), APInt(8, 29)),
831                                OBO::NoSignedWrap),
832             ConstantRange(APInt(8, -120), APInt(8, -128)));
833   EXPECT_EQ(ConstantRange(APInt(8, -50), APInt(8, 50))
834                 .addWithNoWrap(ConstantRange(APInt(8, 10), APInt(8, 20)),
835                                OBO::NoSignedWrap),
836             ConstantRange(APInt(8, -40), APInt(8, 69)));
837   EXPECT_EQ(ConstantRange(APInt(8, 10), APInt(8, 20))
838                 .addWithNoWrap(ConstantRange(APInt(8, -50), APInt(8, 50)),
839                                OBO::NoSignedWrap),
840             ConstantRange(APInt(8, -40), APInt(8, 69)));
841   EXPECT_EQ(ConstantRange(APInt(8, 120), APInt(8, -10))
842                 .addWithNoWrap(ConstantRange(APInt(8, 5), APInt(8, 20)),
843                                OBO::NoSignedWrap),
844             ConstantRange(APInt(8, 125), APInt(8, 9)));
845   EXPECT_EQ(ConstantRange(APInt(8, 5), APInt(8, 20))
846                 .addWithNoWrap(ConstantRange(APInt(8, 120), APInt(8, -10)),
847                                OBO::NoSignedWrap),
848             ConstantRange(APInt(8, 125), APInt(8, 9)));
849 
850   TestAddWithNoSignedWrapExhaustive(
851       [](const ConstantRange &CR1, const ConstantRange &CR2) {
852         return CR1.addWithNoWrap(CR2, OBO::NoSignedWrap);
853       },
854       [](bool &IsOverflow, const APInt &N1, const APInt &N2) {
855         return N1.sadd_ov(N2, IsOverflow);
856       });
857 
858   EXPECT_EQ(Empty.addWithNoWrap(Some, OBO::NoUnsignedWrap), Empty);
859   EXPECT_EQ(Some.addWithNoWrap(Empty, OBO::NoUnsignedWrap), Empty);
860   EXPECT_EQ(Full.addWithNoWrap(Full, OBO::NoUnsignedWrap), Full);
861   EXPECT_NE(Full.addWithNoWrap(Some, OBO::NoUnsignedWrap), Full);
862   EXPECT_NE(Some.addWithNoWrap(Full, OBO::NoUnsignedWrap), Full);
863   EXPECT_EQ(Full.addWithNoWrap(ConstantRange(APInt(16, 1), APInt(16, 2)),
864                                OBO::NoUnsignedWrap),
865             ConstantRange(APInt(16, 1), APInt(16, 0)));
866   EXPECT_EQ(ConstantRange(APInt(16, 1), APInt(16, 2))
867                 .addWithNoWrap(Full, OBO::NoUnsignedWrap),
868             ConstantRange(APInt(16, 1), APInt(16, 0)));
869   EXPECT_EQ(ConstantRange(APInt(8, 200), APInt(8, 220))
870                 .addWithNoWrap(ConstantRange(APInt(8, 100), APInt(8, 123)),
871                                OBO::NoUnsignedWrap),
872             ConstantRange(8, false));
873   EXPECT_EQ(ConstantRange(APInt(8, 0), APInt(8, 101))
874                 .addWithNoWrap(ConstantRange(APInt(8, 0), APInt(8, 156)),
875                                OBO::NoUnsignedWrap),
876             ConstantRange(8, true));
877   EXPECT_EQ(ConstantRange(APInt(8, 0), APInt(8, 101))
878                 .addWithNoWrap(ConstantRange(APInt(8, 10), APInt(8, 29)),
879                                OBO::NoUnsignedWrap),
880             ConstantRange(APInt(8, 10), APInt(8, 129)));
881   EXPECT_EQ(ConstantRange(APInt(8, 20), APInt(8, 10))
882                 .addWithNoWrap(ConstantRange(APInt(8, 50), APInt(8, 200)),
883                                OBO::NoUnsignedWrap),
884             ConstantRange(APInt(8, 50), APInt(8, 0)));
885   EXPECT_EQ(ConstantRange(APInt(8, 10), APInt(8, 20))
886                 .addWithNoWrap(ConstantRange(APInt(8, 50), APInt(8, 200)),
887                                OBO::NoUnsignedWrap),
888             ConstantRange(APInt(8, 60), APInt(8, -37)));
889   EXPECT_EQ(ConstantRange(APInt(8, 20), APInt(8, -30))
890                 .addWithNoWrap(ConstantRange(APInt(8, 5), APInt(8, 20)),
891                                OBO::NoUnsignedWrap),
892             ConstantRange(APInt(8, 25), APInt(8, -11)));
893   EXPECT_EQ(ConstantRange(APInt(8, 5), APInt(8, 20))
894                 .addWithNoWrap(ConstantRange(APInt(8, 20), APInt(8, -30)),
895                                OBO::NoUnsignedWrap),
896             ConstantRange(APInt(8, 25), APInt(8, -11)));
897 
898   TestAddWithNoUnsignedWrapExhaustive(
899       [](const ConstantRange &CR1, const ConstantRange &CR2) {
900         return CR1.addWithNoWrap(CR2, OBO::NoUnsignedWrap);
901       },
902       [](bool &IsOverflow, const APInt &N1, const APInt &N2) {
903         return N1.uadd_ov(N2, IsOverflow);
904       });
905 
906   EXPECT_EQ(ConstantRange(APInt(8, 50), APInt(8, 100))
907                 .addWithNoWrap(ConstantRange(APInt(8, 20), APInt(8, 70)),
908                                OBO::NoSignedWrap),
909             ConstantRange(APInt(8, 70), APInt(8, -128)));
910   EXPECT_EQ(ConstantRange(APInt(8, 50), APInt(8, 100))
911                 .addWithNoWrap(ConstantRange(APInt(8, 20), APInt(8, 70)),
912                                OBO::NoUnsignedWrap),
913             ConstantRange(APInt(8, 70), APInt(8, 169)));
914   EXPECT_EQ(ConstantRange(APInt(8, 50), APInt(8, 100))
915                 .addWithNoWrap(ConstantRange(APInt(8, 20), APInt(8, 70)),
916                                OBO::NoUnsignedWrap | OBO::NoSignedWrap),
917             ConstantRange(APInt(8, 70), APInt(8, -128)));
918 
919   EXPECT_EQ(ConstantRange(APInt(8, -100), APInt(8, -50))
920                 .addWithNoWrap(ConstantRange(APInt(8, 20), APInt(8, 30)),
921                                OBO::NoSignedWrap),
922             ConstantRange(APInt(8, -80), APInt(8, -21)));
923   EXPECT_EQ(ConstantRange(APInt(8, -100), APInt(8, -50))
924                 .addWithNoWrap(ConstantRange(APInt(8, 20), APInt(8, 30)),
925                                OBO::NoUnsignedWrap),
926             ConstantRange(APInt(8, 176), APInt(8, 235)));
927   EXPECT_EQ(ConstantRange(APInt(8, -100), APInt(8, -50))
928                 .addWithNoWrap(ConstantRange(APInt(8, 20), APInt(8, 30)),
929                                OBO::NoUnsignedWrap | OBO::NoSignedWrap),
930             ConstantRange(APInt(8, 176), APInt(8, 235)));
931 
932   TestAddWithNoSignedUnsignedWrapExhaustive(
933       [](const ConstantRange &CR1, const ConstantRange &CR2) {
934         return CR1.addWithNoWrap(CR2, OBO::NoUnsignedWrap | OBO::NoSignedWrap);
935       },
936       [](bool &IsOverflow, const APInt &N1, const APInt &N2) {
937         return N1.sadd_ov(N2, IsOverflow);
938       },
939       [](bool &IsOverflow, const APInt &N1, const APInt &N2) {
940         return N1.uadd_ov(N2, IsOverflow);
941       });
942 }
943 
944 TEST_F(ConstantRangeTest, Sub) {
945   EXPECT_EQ(Full.sub(APInt(16, 4)), Full);
946   EXPECT_EQ(Full.sub(Full), Full);
947   EXPECT_EQ(Full.sub(Empty), Empty);
948   EXPECT_EQ(Full.sub(One), Full);
949   EXPECT_EQ(Full.sub(Some), Full);
950   EXPECT_EQ(Full.sub(Wrap), Full);
951   EXPECT_EQ(Empty.sub(Empty), Empty);
952   EXPECT_EQ(Empty.sub(One), Empty);
953   EXPECT_EQ(Empty.sub(Some), Empty);
954   EXPECT_EQ(Empty.sub(Wrap), Empty);
955   EXPECT_EQ(Empty.sub(APInt(16, 4)), Empty);
956   EXPECT_EQ(Some.sub(APInt(16, 4)),
957             ConstantRange(APInt(16, 0x6), APInt(16, 0xaa6)));
958   EXPECT_EQ(Some.sub(Some),
959             ConstantRange(APInt(16, 0xf561), APInt(16, 0xaa0)));
960   EXPECT_EQ(Wrap.sub(APInt(16, 4)),
961             ConstantRange(APInt(16, 0xaa6), APInt(16, 0x6)));
962   EXPECT_EQ(One.sub(APInt(16, 4)),
963             ConstantRange(APInt(16, 0x6)));
964 }
965 
966 TEST_F(ConstantRangeTest, SubWithNoWrap) {
967   typedef OverflowingBinaryOperator OBO;
968   TestAddWithNoSignedWrapExhaustive(
969       [](const ConstantRange &CR1, const ConstantRange &CR2) {
970         return CR1.subWithNoWrap(CR2, OBO::NoSignedWrap);
971       },
972       [](bool &IsOverflow, const APInt &N1, const APInt &N2) {
973         return N1.ssub_ov(N2, IsOverflow);
974       });
975   TestAddWithNoUnsignedWrapExhaustive(
976       [](const ConstantRange &CR1, const ConstantRange &CR2) {
977         return CR1.subWithNoWrap(CR2, OBO::NoUnsignedWrap);
978       },
979       [](bool &IsOverflow, const APInt &N1, const APInt &N2) {
980         return N1.usub_ov(N2, IsOverflow);
981       });
982   TestAddWithNoSignedUnsignedWrapExhaustive(
983       [](const ConstantRange &CR1, const ConstantRange &CR2) {
984         return CR1.subWithNoWrap(CR2, OBO::NoUnsignedWrap | OBO::NoSignedWrap);
985       },
986       [](bool &IsOverflow, const APInt &N1, const APInt &N2) {
987         return N1.ssub_ov(N2, IsOverflow);
988       },
989       [](bool &IsOverflow, const APInt &N1, const APInt &N2) {
990         return N1.usub_ov(N2, IsOverflow);
991       });
992 }
993 
994 TEST_F(ConstantRangeTest, Multiply) {
995   EXPECT_EQ(Full.multiply(Full), Full);
996   EXPECT_EQ(Full.multiply(Empty), Empty);
997   EXPECT_EQ(Full.multiply(One), Full);
998   EXPECT_EQ(Full.multiply(Some), Full);
999   EXPECT_EQ(Full.multiply(Wrap), Full);
1000   EXPECT_EQ(Empty.multiply(Empty), Empty);
1001   EXPECT_EQ(Empty.multiply(One), Empty);
1002   EXPECT_EQ(Empty.multiply(Some), Empty);
1003   EXPECT_EQ(Empty.multiply(Wrap), Empty);
1004   EXPECT_EQ(One.multiply(One), ConstantRange(APInt(16, 0xa*0xa),
1005                                              APInt(16, 0xa*0xa + 1)));
1006   EXPECT_EQ(One.multiply(Some), ConstantRange(APInt(16, 0xa*0xa),
1007                                               APInt(16, 0xa*0xaa9 + 1)));
1008   EXPECT_EQ(One.multiply(Wrap), Full);
1009   EXPECT_EQ(Some.multiply(Some), Full);
1010   EXPECT_EQ(Some.multiply(Wrap), Full);
1011   EXPECT_EQ(Wrap.multiply(Wrap), Full);
1012 
1013   ConstantRange Zero(APInt(16, 0));
1014   EXPECT_EQ(Zero.multiply(Full), Zero);
1015   EXPECT_EQ(Zero.multiply(Some), Zero);
1016   EXPECT_EQ(Zero.multiply(Wrap), Zero);
1017   EXPECT_EQ(Full.multiply(Zero), Zero);
1018   EXPECT_EQ(Some.multiply(Zero), Zero);
1019   EXPECT_EQ(Wrap.multiply(Zero), Zero);
1020 
1021   // http://llvm.org/PR4545
1022   EXPECT_EQ(ConstantRange(APInt(4, 1), APInt(4, 6)).multiply(
1023                 ConstantRange(APInt(4, 6), APInt(4, 2))),
1024             ConstantRange(4, /*isFullSet=*/true));
1025 
1026   EXPECT_EQ(ConstantRange(APInt(8, 254), APInt(8, 0)).multiply(
1027               ConstantRange(APInt(8, 252), APInt(8, 4))),
1028             ConstantRange(APInt(8, 250), APInt(8, 9)));
1029   EXPECT_EQ(ConstantRange(APInt(8, 254), APInt(8, 255)).multiply(
1030               ConstantRange(APInt(8, 2), APInt(8, 4))),
1031             ConstantRange(APInt(8, 250), APInt(8, 253)));
1032 
1033   // TODO: This should be return [-2, 0]
1034   EXPECT_EQ(ConstantRange(APInt(8, -2)).multiply(
1035               ConstantRange(APInt(8, 0), APInt(8, 2))),
1036             ConstantRange(APInt(8, -2), APInt(8, 1)));
1037 }
1038 
1039 TEST_F(ConstantRangeTest, UMax) {
1040   EXPECT_EQ(Full.umax(Full), Full);
1041   EXPECT_EQ(Full.umax(Empty), Empty);
1042   EXPECT_EQ(Full.umax(Some), ConstantRange(APInt(16, 0xa), APInt(16, 0)));
1043   EXPECT_EQ(Full.umax(Wrap), Full);
1044   EXPECT_EQ(Full.umax(Some), ConstantRange(APInt(16, 0xa), APInt(16, 0)));
1045   EXPECT_EQ(Empty.umax(Empty), Empty);
1046   EXPECT_EQ(Empty.umax(Some), Empty);
1047   EXPECT_EQ(Empty.umax(Wrap), Empty);
1048   EXPECT_EQ(Empty.umax(One), Empty);
1049   EXPECT_EQ(Some.umax(Some), Some);
1050   EXPECT_EQ(Some.umax(Wrap), ConstantRange(APInt(16, 0xa), APInt(16, 0)));
1051   EXPECT_EQ(Some.umax(One), Some);
1052   // TODO: ConstantRange is currently over-conservative here.
1053   EXPECT_EQ(Wrap.umax(Wrap), Full);
1054   EXPECT_EQ(Wrap.umax(One), ConstantRange(APInt(16, 0xa), APInt(16, 0)));
1055   EXPECT_EQ(One.umax(One), One);
1056 }
1057 
1058 TEST_F(ConstantRangeTest, SMax) {
1059   EXPECT_EQ(Full.smax(Full), Full);
1060   EXPECT_EQ(Full.smax(Empty), Empty);
1061   EXPECT_EQ(Full.smax(Some), ConstantRange(APInt(16, 0xa),
1062                                            APInt::getSignedMinValue(16)));
1063   EXPECT_EQ(Full.smax(Wrap), Full);
1064   EXPECT_EQ(Full.smax(One), ConstantRange(APInt(16, 0xa),
1065                                           APInt::getSignedMinValue(16)));
1066   EXPECT_EQ(Empty.smax(Empty), Empty);
1067   EXPECT_EQ(Empty.smax(Some), Empty);
1068   EXPECT_EQ(Empty.smax(Wrap), Empty);
1069   EXPECT_EQ(Empty.smax(One), Empty);
1070   EXPECT_EQ(Some.smax(Some), Some);
1071   EXPECT_EQ(Some.smax(Wrap), ConstantRange(APInt(16, 0xa),
1072                                            APInt(16, (uint64_t)INT16_MIN)));
1073   EXPECT_EQ(Some.smax(One), Some);
1074   EXPECT_EQ(Wrap.smax(One), ConstantRange(APInt(16, 0xa),
1075                                           APInt(16, (uint64_t)INT16_MIN)));
1076   EXPECT_EQ(One.smax(One), One);
1077 }
1078 
1079 TEST_F(ConstantRangeTest, UMin) {
1080   EXPECT_EQ(Full.umin(Full), Full);
1081   EXPECT_EQ(Full.umin(Empty), Empty);
1082   EXPECT_EQ(Full.umin(Some), ConstantRange(APInt(16, 0), APInt(16, 0xaaa)));
1083   EXPECT_EQ(Full.umin(Wrap), Full);
1084   EXPECT_EQ(Empty.umin(Empty), Empty);
1085   EXPECT_EQ(Empty.umin(Some), Empty);
1086   EXPECT_EQ(Empty.umin(Wrap), Empty);
1087   EXPECT_EQ(Empty.umin(One), Empty);
1088   EXPECT_EQ(Some.umin(Some), Some);
1089   EXPECT_EQ(Some.umin(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xaaa)));
1090   EXPECT_EQ(Some.umin(One), One);
1091   // TODO: ConstantRange is currently over-conservative here.
1092   EXPECT_EQ(Wrap.umin(Wrap), Full);
1093   EXPECT_EQ(Wrap.umin(One), ConstantRange(APInt(16, 0), APInt(16, 0xb)));
1094   EXPECT_EQ(One.umin(One), One);
1095 }
1096 
1097 TEST_F(ConstantRangeTest, SMin) {
1098   EXPECT_EQ(Full.smin(Full), Full);
1099   EXPECT_EQ(Full.smin(Empty), Empty);
1100   EXPECT_EQ(Full.smin(Some), ConstantRange(APInt(16, (uint64_t)INT16_MIN),
1101                                            APInt(16, 0xaaa)));
1102   EXPECT_EQ(Full.smin(Wrap), Full);
1103   EXPECT_EQ(Empty.smin(Empty), Empty);
1104   EXPECT_EQ(Empty.smin(Some), Empty);
1105   EXPECT_EQ(Empty.smin(Wrap), Empty);
1106   EXPECT_EQ(Empty.smin(One), Empty);
1107   EXPECT_EQ(Some.smin(Some), Some);
1108   EXPECT_EQ(Some.smin(Wrap), ConstantRange(APInt(16, (uint64_t)INT16_MIN),
1109                                            APInt(16, 0xaaa)));
1110   EXPECT_EQ(Some.smin(One), One);
1111   // TODO: ConstantRange is currently over-conservative here.
1112   EXPECT_EQ(Wrap.smin(Wrap), Full);
1113   EXPECT_EQ(Wrap.smin(One), ConstantRange(APInt(16, (uint64_t)INT16_MIN),
1114                                           APInt(16, 0xb)));
1115   EXPECT_EQ(One.smin(One), One);
1116 }
1117 
1118 TEST_F(ConstantRangeTest, UDiv) {
1119   EXPECT_EQ(Full.udiv(Full), Full);
1120   EXPECT_EQ(Full.udiv(Empty), Empty);
1121   EXPECT_EQ(Full.udiv(One), ConstantRange(APInt(16, 0),
1122                                           APInt(16, 0xffff / 0xa + 1)));
1123   EXPECT_EQ(Full.udiv(Some), ConstantRange(APInt(16, 0),
1124                                            APInt(16, 0xffff / 0xa + 1)));
1125   EXPECT_EQ(Full.udiv(Wrap), Full);
1126   EXPECT_EQ(Empty.udiv(Empty), Empty);
1127   EXPECT_EQ(Empty.udiv(One), Empty);
1128   EXPECT_EQ(Empty.udiv(Some), Empty);
1129   EXPECT_EQ(Empty.udiv(Wrap), Empty);
1130   EXPECT_EQ(One.udiv(One), ConstantRange(APInt(16, 1)));
1131   EXPECT_EQ(One.udiv(Some), ConstantRange(APInt(16, 0), APInt(16, 2)));
1132   EXPECT_EQ(One.udiv(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xb)));
1133   EXPECT_EQ(Some.udiv(Some), ConstantRange(APInt(16, 0), APInt(16, 0x111)));
1134   EXPECT_EQ(Some.udiv(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xaaa)));
1135   EXPECT_EQ(Wrap.udiv(Wrap), Full);
1136 
1137 
1138   ConstantRange Zero(APInt(16, 0));
1139   EXPECT_EQ(Zero.udiv(One), Zero);
1140   EXPECT_EQ(Zero.udiv(Full), Zero);
1141 
1142   EXPECT_EQ(ConstantRange(APInt(16, 0), APInt(16, 99)).udiv(Full),
1143             ConstantRange(APInt(16, 0), APInt(16, 99)));
1144   EXPECT_EQ(ConstantRange(APInt(16, 10), APInt(16, 99)).udiv(Full),
1145             ConstantRange(APInt(16, 0), APInt(16, 99)));
1146 }
1147 
1148 TEST_F(ConstantRangeTest, SDiv) {
1149   unsigned Bits = 4;
1150   EnumerateTwoConstantRanges(Bits, [&](const ConstantRange &CR1,
1151                                        const ConstantRange &CR2) {
1152     // Collect possible results in a bit vector. We store the signed value plus
1153     // a bias to make it unsigned.
1154     int Bias = 1 << (Bits - 1);
1155     BitVector Results(1 << Bits);
1156     ForeachNumInConstantRange(CR1, [&](const APInt &N1) {
1157       ForeachNumInConstantRange(CR2, [&](const APInt &N2) {
1158         // Division by zero is UB.
1159         if (N2 == 0)
1160           return;
1161 
1162         // SignedMin / -1 is UB.
1163         if (N1.isMinSignedValue() && N2.isAllOnesValue())
1164           return;
1165 
1166         APInt N = N1.sdiv(N2);
1167         Results.set(N.getSExtValue() + Bias);
1168       });
1169     });
1170 
1171     ConstantRange CR = CR1.sdiv(CR2);
1172     if (Results.none()) {
1173       EXPECT_TRUE(CR.isEmptySet());
1174       return;
1175     }
1176 
1177     // If there is a non-full signed envelope, that should be the result.
1178     APInt SMin(Bits, Results.find_first() - Bias);
1179     APInt SMax(Bits, Results.find_last() - Bias);
1180     ConstantRange Envelope = ConstantRange::getNonEmpty(SMin, SMax + 1);
1181     if (!Envelope.isFullSet()) {
1182       EXPECT_EQ(Envelope, CR);
1183       return;
1184     }
1185 
1186     // If the signed envelope is a full set, try to find a smaller sign wrapped
1187     // set that is separated in negative and positive components (or one which
1188     // can also additionally contain zero).
1189     int LastNeg = Results.find_last_in(0, Bias) - Bias;
1190     int LastPos = Results.find_next(Bias) - Bias;
1191     if (Results[Bias]) {
1192       if (LastNeg == -1)
1193         ++LastNeg;
1194       else if (LastPos == 1)
1195         --LastPos;
1196     }
1197 
1198     APInt WMax(Bits, LastNeg);
1199     APInt WMin(Bits, LastPos);
1200     ConstantRange Wrapped = ConstantRange::getNonEmpty(WMin, WMax + 1);
1201     EXPECT_EQ(Wrapped, CR);
1202   });
1203 }
1204 
1205 TEST_F(ConstantRangeTest, URem) {
1206   EXPECT_EQ(Full.urem(Empty), Empty);
1207   EXPECT_EQ(Empty.urem(Full), Empty);
1208   // urem by zero is poison.
1209   EXPECT_EQ(Full.urem(ConstantRange(APInt(16, 0))), Empty);
1210   // urem by full range doesn't contain MaxValue.
1211   EXPECT_EQ(Full.urem(Full), ConstantRange(APInt(16, 0), APInt(16, 0xffff)));
1212   // urem is upper bounded by maximum RHS minus one.
1213   EXPECT_EQ(Full.urem(ConstantRange(APInt(16, 0), APInt(16, 123))),
1214             ConstantRange(APInt(16, 0), APInt(16, 122)));
1215   // urem is upper bounded by maximum LHS.
1216   EXPECT_EQ(ConstantRange(APInt(16, 0), APInt(16, 123)).urem(Full),
1217             ConstantRange(APInt(16, 0), APInt(16, 123)));
1218   // If the LHS is always lower than the RHS, the result is the LHS.
1219   EXPECT_EQ(ConstantRange(APInt(16, 10), APInt(16, 20))
1220                 .urem(ConstantRange(APInt(16, 20), APInt(16, 30))),
1221             ConstantRange(APInt(16, 10), APInt(16, 20)));
1222   // It has to be strictly lower, otherwise the top value may wrap to zero.
1223   EXPECT_EQ(ConstantRange(APInt(16, 10), APInt(16, 20))
1224                 .urem(ConstantRange(APInt(16, 19), APInt(16, 30))),
1225             ConstantRange(APInt(16, 0), APInt(16, 20)));
1226   // [12, 14] % 10 is [2, 4], but we conservatively compute [0, 9].
1227   EXPECT_EQ(ConstantRange(APInt(16, 12), APInt(16, 15))
1228                 .urem(ConstantRange(APInt(16, 10))),
1229             ConstantRange(APInt(16, 0), APInt(16, 10)));
1230 
1231   TestUnsignedBinOpExhaustive(
1232       [](const ConstantRange &CR1, const ConstantRange &CR2) {
1233         return CR1.urem(CR2);
1234       },
1235       [](const APInt &N1, const APInt &N2) {
1236         return N1.urem(N2);
1237       },
1238       /* SkipZeroRHS */ true, /* CorrectnessOnly */ true);
1239 }
1240 
1241 TEST_F(ConstantRangeTest, SRem) {
1242   EXPECT_EQ(Full.srem(Empty), Empty);
1243   EXPECT_EQ(Empty.srem(Full), Empty);
1244   // srem by zero is UB.
1245   EXPECT_EQ(Full.srem(ConstantRange(APInt(16, 0))), Empty);
1246   // srem by full range doesn't contain SignedMinValue.
1247   EXPECT_EQ(Full.srem(Full), ConstantRange(APInt::getSignedMinValue(16) + 1,
1248                                            APInt::getSignedMinValue(16)));
1249 
1250   ConstantRange PosMod(APInt(16, 10), APInt(16, 21));  // [10, 20]
1251   ConstantRange NegMod(APInt(16, -20), APInt(16, -9)); // [-20, -10]
1252   ConstantRange IntMinMod(APInt::getSignedMinValue(16));
1253 
1254   ConstantRange Expected(16, true);
1255 
1256   // srem is bounded by abs(RHS) minus one.
1257   ConstantRange PosLargeLHS(APInt(16, 0), APInt(16, 41));
1258   Expected = ConstantRange(APInt(16, 0), APInt(16, 20));
1259   EXPECT_EQ(PosLargeLHS.srem(PosMod), Expected);
1260   EXPECT_EQ(PosLargeLHS.srem(NegMod), Expected);
1261   ConstantRange NegLargeLHS(APInt(16, -40), APInt(16, 1));
1262   Expected = ConstantRange(APInt(16, -19), APInt(16, 1));
1263   EXPECT_EQ(NegLargeLHS.srem(PosMod), Expected);
1264   EXPECT_EQ(NegLargeLHS.srem(NegMod), Expected);
1265   ConstantRange PosNegLargeLHS(APInt(16, -32), APInt(16, 38));
1266   Expected = ConstantRange(APInt(16, -19), APInt(16, 20));
1267   EXPECT_EQ(PosNegLargeLHS.srem(PosMod), Expected);
1268   EXPECT_EQ(PosNegLargeLHS.srem(NegMod), Expected);
1269 
1270   // srem is bounded by LHS.
1271   ConstantRange PosLHS(APInt(16, 0), APInt(16, 16));
1272   EXPECT_EQ(PosLHS.srem(PosMod), PosLHS);
1273   EXPECT_EQ(PosLHS.srem(NegMod), PosLHS);
1274   EXPECT_EQ(PosLHS.srem(IntMinMod), PosLHS);
1275   ConstantRange NegLHS(APInt(16, -15), APInt(16, 1));
1276   EXPECT_EQ(NegLHS.srem(PosMod), NegLHS);
1277   EXPECT_EQ(NegLHS.srem(NegMod), NegLHS);
1278   EXPECT_EQ(NegLHS.srem(IntMinMod), NegLHS);
1279   ConstantRange PosNegLHS(APInt(16, -12), APInt(16, 18));
1280   EXPECT_EQ(PosNegLHS.srem(PosMod), PosNegLHS);
1281   EXPECT_EQ(PosNegLHS.srem(NegMod), PosNegLHS);
1282   EXPECT_EQ(PosNegLHS.srem(IntMinMod), PosNegLHS);
1283 
1284   // srem is LHS if it is smaller than RHS.
1285   ConstantRange PosSmallLHS(APInt(16, 3), APInt(16, 8));
1286   EXPECT_EQ(PosSmallLHS.srem(PosMod), PosSmallLHS);
1287   EXPECT_EQ(PosSmallLHS.srem(NegMod), PosSmallLHS);
1288   EXPECT_EQ(PosSmallLHS.srem(IntMinMod), PosSmallLHS);
1289   ConstantRange NegSmallLHS(APInt(16, -7), APInt(16, -2));
1290   EXPECT_EQ(NegSmallLHS.srem(PosMod), NegSmallLHS);
1291   EXPECT_EQ(NegSmallLHS.srem(NegMod), NegSmallLHS);
1292   EXPECT_EQ(NegSmallLHS.srem(IntMinMod), NegSmallLHS);
1293   ConstantRange PosNegSmallLHS(APInt(16, -3), APInt(16, 8));
1294   EXPECT_EQ(PosNegSmallLHS.srem(PosMod), PosNegSmallLHS);
1295   EXPECT_EQ(PosNegSmallLHS.srem(NegMod), PosNegSmallLHS);
1296   EXPECT_EQ(PosNegSmallLHS.srem(IntMinMod), PosNegSmallLHS);
1297 
1298   // Example of a suboptimal result:
1299   // [12, 14] srem 10 is [2, 4], but we conservatively compute [0, 9].
1300   EXPECT_EQ(ConstantRange(APInt(16, 12), APInt(16, 15))
1301                 .srem(ConstantRange(APInt(16, 10))),
1302             ConstantRange(APInt(16, 0), APInt(16, 10)));
1303 
1304   TestSignedBinOpExhaustive(
1305       [](const ConstantRange &CR1, const ConstantRange &CR2) {
1306         return CR1.srem(CR2);
1307       },
1308       [](const APInt &N1, const APInt &N2) {
1309         return N1.srem(N2);
1310       },
1311       /* SkipZeroRHS */ true, /* CorrectnessOnly */ true);
1312 }
1313 
1314 TEST_F(ConstantRangeTest, Shl) {
1315   ConstantRange Some2(APInt(16, 0xfff), APInt(16, 0x8000));
1316   ConstantRange WrapNullMax(APInt(16, 0x1), APInt(16, 0x0));
1317   EXPECT_EQ(Full.shl(Full), Full);
1318   EXPECT_EQ(Full.shl(Empty), Empty);
1319   EXPECT_EQ(Full.shl(One), Full);    // TODO: [0, (-1 << 0xa) + 1)
1320   EXPECT_EQ(Full.shl(Some), Full);   // TODO: [0, (-1 << 0xa) + 1)
1321   EXPECT_EQ(Full.shl(Wrap), Full);
1322   EXPECT_EQ(Empty.shl(Empty), Empty);
1323   EXPECT_EQ(Empty.shl(One), Empty);
1324   EXPECT_EQ(Empty.shl(Some), Empty);
1325   EXPECT_EQ(Empty.shl(Wrap), Empty);
1326   EXPECT_EQ(One.shl(One), ConstantRange(APInt(16, 0xa << 0xa),
1327                                         APInt(16, (0xa << 0xa) + 1)));
1328   EXPECT_EQ(One.shl(Some), Full);    // TODO: [0xa << 0xa, 0)
1329   EXPECT_EQ(One.shl(Wrap), Full);    // TODO: [0xa, 0xa << 14 + 1)
1330   EXPECT_EQ(Some.shl(Some), Full);   // TODO: [0xa << 0xa, 0xfc01)
1331   EXPECT_EQ(Some.shl(Wrap), Full);   // TODO: [0xa, 0x7ff << 0x5 + 1)
1332   EXPECT_EQ(Wrap.shl(Wrap), Full);
1333   EXPECT_EQ(
1334       Some2.shl(ConstantRange(APInt(16, 0x1))),
1335       ConstantRange(APInt(16, 0xfff << 0x1), APInt(16, 0x7fff << 0x1) + 1));
1336   EXPECT_EQ(One.shl(WrapNullMax), Full);
1337 }
1338 
1339 TEST_F(ConstantRangeTest, Lshr) {
1340   EXPECT_EQ(Full.lshr(Full), Full);
1341   EXPECT_EQ(Full.lshr(Empty), Empty);
1342   EXPECT_EQ(Full.lshr(One), ConstantRange(APInt(16, 0),
1343                                           APInt(16, (0xffff >> 0xa) + 1)));
1344   EXPECT_EQ(Full.lshr(Some), ConstantRange(APInt(16, 0),
1345                                            APInt(16, (0xffff >> 0xa) + 1)));
1346   EXPECT_EQ(Full.lshr(Wrap), Full);
1347   EXPECT_EQ(Empty.lshr(Empty), Empty);
1348   EXPECT_EQ(Empty.lshr(One), Empty);
1349   EXPECT_EQ(Empty.lshr(Some), Empty);
1350   EXPECT_EQ(Empty.lshr(Wrap), Empty);
1351   EXPECT_EQ(One.lshr(One), ConstantRange(APInt(16, 0)));
1352   EXPECT_EQ(One.lshr(Some), ConstantRange(APInt(16, 0)));
1353   EXPECT_EQ(One.lshr(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xb)));
1354   EXPECT_EQ(Some.lshr(Some), ConstantRange(APInt(16, 0),
1355                                            APInt(16, (0xaaa >> 0xa) + 1)));
1356   EXPECT_EQ(Some.lshr(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xaaa)));
1357   EXPECT_EQ(Wrap.lshr(Wrap), Full);
1358 }
1359 
1360 TEST_F(ConstantRangeTest, Ashr) {
1361   EXPECT_EQ(Full.ashr(Full), Full);
1362   EXPECT_EQ(Full.ashr(Empty), Empty);
1363   EXPECT_EQ(Full.ashr(One), ConstantRange(APInt(16, 0xffe0),
1364                                           APInt(16, (0x7fff >> 0xa) + 1 )));
1365   ConstantRange Small(APInt(16, 0xa), APInt(16, 0xb));
1366   EXPECT_EQ(Full.ashr(Small), ConstantRange(APInt(16, 0xffe0),
1367                                            APInt(16, (0x7fff >> 0xa) + 1 )));
1368   EXPECT_EQ(Full.ashr(Some), ConstantRange(APInt(16, 0xffe0),
1369                                            APInt(16, (0x7fff >> 0xa) + 1 )));
1370   EXPECT_EQ(Full.ashr(Wrap), Full);
1371   EXPECT_EQ(Empty.ashr(Empty), Empty);
1372   EXPECT_EQ(Empty.ashr(One), Empty);
1373   EXPECT_EQ(Empty.ashr(Some), Empty);
1374   EXPECT_EQ(Empty.ashr(Wrap), Empty);
1375   EXPECT_EQ(One.ashr(One), ConstantRange(APInt(16, 0)));
1376   EXPECT_EQ(One.ashr(Some), ConstantRange(APInt(16, 0)));
1377   EXPECT_EQ(One.ashr(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xb)));
1378   EXPECT_EQ(Some.ashr(Some), ConstantRange(APInt(16, 0),
1379                                            APInt(16, (0xaaa >> 0xa) + 1)));
1380   EXPECT_EQ(Some.ashr(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xaaa)));
1381   EXPECT_EQ(Wrap.ashr(Wrap), Full);
1382   ConstantRange Neg(APInt(16, 0xf3f0, true), APInt(16, 0xf7f8, true));
1383   EXPECT_EQ(Neg.ashr(Small), ConstantRange(APInt(16, 0xfffc, true),
1384                                            APInt(16, 0xfffe, true)));
1385 }
1386 
1387 TEST(ConstantRange, MakeAllowedICmpRegion) {
1388   // PR8250
1389   ConstantRange SMax = ConstantRange(APInt::getSignedMaxValue(32));
1390   EXPECT_TRUE(ConstantRange::makeAllowedICmpRegion(ICmpInst::ICMP_SGT, SMax)
1391                   .isEmptySet());
1392 }
1393 
1394 TEST(ConstantRange, MakeSatisfyingICmpRegion) {
1395   ConstantRange LowHalf(APInt(8, 0), APInt(8, 128));
1396   ConstantRange HighHalf(APInt(8, 128), APInt(8, 0));
1397   ConstantRange EmptySet(8, /* isFullSet = */ false);
1398 
1399   EXPECT_EQ(ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_NE, LowHalf),
1400             HighHalf);
1401 
1402   EXPECT_EQ(
1403       ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_NE, HighHalf),
1404       LowHalf);
1405 
1406   EXPECT_TRUE(ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_EQ,
1407                                                       HighHalf).isEmptySet());
1408 
1409   ConstantRange UnsignedSample(APInt(8, 5), APInt(8, 200));
1410 
1411   EXPECT_EQ(ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_ULT,
1412                                                     UnsignedSample),
1413             ConstantRange(APInt(8, 0), APInt(8, 5)));
1414 
1415   EXPECT_EQ(ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_ULE,
1416                                                     UnsignedSample),
1417             ConstantRange(APInt(8, 0), APInt(8, 6)));
1418 
1419   EXPECT_EQ(ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_UGT,
1420                                                     UnsignedSample),
1421             ConstantRange(APInt(8, 200), APInt(8, 0)));
1422 
1423   EXPECT_EQ(ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_UGE,
1424                                                     UnsignedSample),
1425             ConstantRange(APInt(8, 199), APInt(8, 0)));
1426 
1427   ConstantRange SignedSample(APInt(8, -5), APInt(8, 5));
1428 
1429   EXPECT_EQ(
1430       ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_SLT, SignedSample),
1431       ConstantRange(APInt(8, -128), APInt(8, -5)));
1432 
1433   EXPECT_EQ(
1434       ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_SLE, SignedSample),
1435       ConstantRange(APInt(8, -128), APInt(8, -4)));
1436 
1437   EXPECT_EQ(
1438       ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_SGT, SignedSample),
1439       ConstantRange(APInt(8, 5), APInt(8, -128)));
1440 
1441   EXPECT_EQ(
1442       ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_SGE, SignedSample),
1443       ConstantRange(APInt(8, 4), APInt(8, -128)));
1444 }
1445 
1446 TEST(ConstantRange, MakeGuaranteedNoWrapRegion) {
1447   const int IntMin4Bits = 8;
1448   const int IntMax4Bits = 7;
1449   typedef OverflowingBinaryOperator OBO;
1450 
1451   for (int Const : {0, -1, -2, 1, 2, IntMin4Bits, IntMax4Bits}) {
1452     APInt C(4, Const, true /* = isSigned */);
1453 
1454     auto NUWRegion = ConstantRange::makeGuaranteedNoWrapRegion(
1455         Instruction::Add, C, OBO::NoUnsignedWrap);
1456 
1457     EXPECT_FALSE(NUWRegion.isEmptySet());
1458 
1459     auto NSWRegion = ConstantRange::makeGuaranteedNoWrapRegion(
1460         Instruction::Add, C, OBO::NoSignedWrap);
1461 
1462     EXPECT_FALSE(NSWRegion.isEmptySet());
1463 
1464     for (APInt I = NUWRegion.getLower(), E = NUWRegion.getUpper(); I != E;
1465          ++I) {
1466       bool Overflow = false;
1467       (void)I.uadd_ov(C, Overflow);
1468       EXPECT_FALSE(Overflow);
1469     }
1470 
1471     for (APInt I = NSWRegion.getLower(), E = NSWRegion.getUpper(); I != E;
1472          ++I) {
1473       bool Overflow = false;
1474       (void)I.sadd_ov(C, Overflow);
1475       EXPECT_FALSE(Overflow);
1476     }
1477   }
1478 
1479   for (int Const : {0, -1, -2, 1, 2, IntMin4Bits, IntMax4Bits}) {
1480     APInt C(4, Const, true /* = isSigned */);
1481 
1482     auto NUWRegion = ConstantRange::makeGuaranteedNoWrapRegion(
1483         Instruction::Sub, C, OBO::NoUnsignedWrap);
1484 
1485     EXPECT_FALSE(NUWRegion.isEmptySet());
1486 
1487     auto NSWRegion = ConstantRange::makeGuaranteedNoWrapRegion(
1488         Instruction::Sub, C, OBO::NoSignedWrap);
1489 
1490     EXPECT_FALSE(NSWRegion.isEmptySet());
1491 
1492     for (APInt I = NUWRegion.getLower(), E = NUWRegion.getUpper(); I != E;
1493          ++I) {
1494       bool Overflow = false;
1495       (void)I.usub_ov(C, Overflow);
1496       EXPECT_FALSE(Overflow);
1497     }
1498 
1499     for (APInt I = NSWRegion.getLower(), E = NSWRegion.getUpper(); I != E;
1500          ++I) {
1501       bool Overflow = false;
1502       (void)I.ssub_ov(C, Overflow);
1503       EXPECT_FALSE(Overflow);
1504     }
1505   }
1506 
1507   auto NSWForAllValues = ConstantRange::makeGuaranteedNoWrapRegion(
1508       Instruction::Add, ConstantRange(32, /* isFullSet = */ true),
1509       OBO::NoSignedWrap);
1510   EXPECT_TRUE(NSWForAllValues.isSingleElement() &&
1511               NSWForAllValues.getSingleElement()->isMinValue());
1512 
1513   NSWForAllValues = ConstantRange::makeGuaranteedNoWrapRegion(
1514       Instruction::Sub, ConstantRange(32, /* isFullSet = */ true),
1515       OBO::NoSignedWrap);
1516   EXPECT_TRUE(NSWForAllValues.isSingleElement() &&
1517               NSWForAllValues.getSingleElement()->isMaxValue());
1518 
1519   auto NUWForAllValues = ConstantRange::makeGuaranteedNoWrapRegion(
1520       Instruction::Add, ConstantRange(32, /* isFullSet = */ true),
1521       OBO::NoUnsignedWrap);
1522   EXPECT_TRUE(NUWForAllValues.isSingleElement() &&
1523               NUWForAllValues.getSingleElement()->isMinValue());
1524 
1525   NUWForAllValues = ConstantRange::makeGuaranteedNoWrapRegion(
1526       Instruction::Sub, ConstantRange(32, /* isFullSet = */ true),
1527       OBO::NoUnsignedWrap);
1528   EXPECT_TRUE(NUWForAllValues.isSingleElement() &&
1529               NUWForAllValues.getSingleElement()->isMaxValue());
1530 
1531   EXPECT_TRUE(ConstantRange::makeGuaranteedNoWrapRegion(
1532       Instruction::Add, APInt(32, 0), OBO::NoUnsignedWrap).isFullSet());
1533   EXPECT_TRUE(ConstantRange::makeGuaranteedNoWrapRegion(
1534       Instruction::Add, APInt(32, 0), OBO::NoSignedWrap).isFullSet());
1535   EXPECT_TRUE(ConstantRange::makeGuaranteedNoWrapRegion(
1536       Instruction::Sub, APInt(32, 0), OBO::NoUnsignedWrap).isFullSet());
1537   EXPECT_TRUE(ConstantRange::makeGuaranteedNoWrapRegion(
1538       Instruction::Sub, APInt(32, 0), OBO::NoSignedWrap).isFullSet());
1539 
1540   ConstantRange OneToFive(APInt(32, 1), APInt(32, 6));
1541   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
1542                 Instruction::Add, OneToFive, OBO::NoSignedWrap),
1543             ConstantRange(APInt::getSignedMinValue(32),
1544                           APInt::getSignedMaxValue(32) - 4));
1545   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
1546                 Instruction::Add, OneToFive, OBO::NoUnsignedWrap),
1547             ConstantRange(APInt::getMinValue(32), APInt::getMinValue(32) - 5));
1548   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
1549                 Instruction::Sub, OneToFive, OBO::NoSignedWrap),
1550             ConstantRange(APInt::getSignedMinValue(32) + 5,
1551                           APInt::getSignedMinValue(32)));
1552   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
1553                 Instruction::Sub, OneToFive, OBO::NoUnsignedWrap),
1554             ConstantRange(APInt::getMinValue(32) + 5, APInt::getMinValue(32)));
1555 
1556   ConstantRange MinusFiveToMinusTwo(APInt(32, -5), APInt(32, -1));
1557   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
1558                 Instruction::Add, MinusFiveToMinusTwo, OBO::NoSignedWrap),
1559             ConstantRange(APInt::getSignedMinValue(32) + 5,
1560                           APInt::getSignedMinValue(32)));
1561   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
1562                 Instruction::Add, MinusFiveToMinusTwo, OBO::NoUnsignedWrap),
1563             ConstantRange(APInt(32, 0), APInt(32, 2)));
1564   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
1565                 Instruction::Sub, MinusFiveToMinusTwo, OBO::NoSignedWrap),
1566             ConstantRange(APInt::getSignedMinValue(32),
1567                           APInt::getSignedMaxValue(32) - 4));
1568   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
1569                 Instruction::Sub, MinusFiveToMinusTwo, OBO::NoUnsignedWrap),
1570             ConstantRange(APInt::getMaxValue(32) - 1,
1571                           APInt::getMinValue(32)));
1572 
1573   ConstantRange MinusOneToOne(APInt(32, -1), APInt(32, 2));
1574   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
1575                 Instruction::Add, MinusOneToOne, OBO::NoSignedWrap),
1576             ConstantRange(APInt::getSignedMinValue(32) + 1,
1577                           APInt::getSignedMinValue(32) - 1));
1578   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
1579                 Instruction::Add, MinusOneToOne, OBO::NoUnsignedWrap),
1580             ConstantRange(APInt(32, 0), APInt(32, 1)));
1581   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
1582                 Instruction::Sub, MinusOneToOne, OBO::NoSignedWrap),
1583             ConstantRange(APInt::getSignedMinValue(32) + 1,
1584                           APInt::getSignedMinValue(32) - 1));
1585   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
1586                 Instruction::Sub, MinusOneToOne, OBO::NoUnsignedWrap),
1587             ConstantRange(APInt::getMaxValue(32),
1588                           APInt::getMinValue(32)));
1589 
1590   ConstantRange One(APInt(32, 1), APInt(32, 2));
1591   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
1592                 Instruction::Add, One, OBO::NoSignedWrap),
1593             ConstantRange(APInt::getSignedMinValue(32),
1594                           APInt::getSignedMaxValue(32)));
1595   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
1596                 Instruction::Add, One, OBO::NoUnsignedWrap),
1597             ConstantRange(APInt::getMinValue(32), APInt::getMaxValue(32)));
1598   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
1599                 Instruction::Sub, One, OBO::NoSignedWrap),
1600             ConstantRange(APInt::getSignedMinValue(32) + 1,
1601                           APInt::getSignedMinValue(32)));
1602   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
1603                 Instruction::Sub, One, OBO::NoUnsignedWrap),
1604             ConstantRange(APInt::getMinValue(32) + 1, APInt::getMinValue(32)));
1605 
1606   ConstantRange OneLessThanBitWidth(APInt(32, 0), APInt(32, 31) + 1);
1607   ConstantRange UpToBitWidth(APInt(32, 0), APInt(32, 32) + 1);
1608   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
1609                 Instruction::Shl, UpToBitWidth, OBO::NoUnsignedWrap),
1610             ConstantRange::makeGuaranteedNoWrapRegion(
1611                 Instruction::Shl, OneLessThanBitWidth, OBO::NoUnsignedWrap));
1612   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
1613                 Instruction::Shl, UpToBitWidth, OBO::NoSignedWrap),
1614             ConstantRange::makeGuaranteedNoWrapRegion(
1615                 Instruction::Shl, OneLessThanBitWidth, OBO::NoSignedWrap));
1616   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
1617                 Instruction::Shl, UpToBitWidth, OBO::NoUnsignedWrap),
1618             ConstantRange(APInt(32, 0), APInt(32, 1) + 1));
1619   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
1620                 Instruction::Shl, UpToBitWidth, OBO::NoSignedWrap),
1621             ConstantRange(APInt(32, -1), APInt(32, 0) + 1));
1622 
1623   EXPECT_EQ(
1624       ConstantRange::makeGuaranteedNoWrapRegion(
1625           Instruction::Shl, ConstantRange::getFull(32), OBO::NoUnsignedWrap),
1626       ConstantRange::makeGuaranteedNoWrapRegion(
1627           Instruction::Shl, OneLessThanBitWidth, OBO::NoUnsignedWrap));
1628   EXPECT_EQ(
1629       ConstantRange::makeGuaranteedNoWrapRegion(
1630           Instruction::Shl, ConstantRange::getFull(32), OBO::NoSignedWrap),
1631       ConstantRange::makeGuaranteedNoWrapRegion(
1632           Instruction::Shl, OneLessThanBitWidth, OBO::NoSignedWrap));
1633 
1634   ConstantRange IllegalShAmt(APInt(32, 32), APInt(32, 0) + 1);
1635   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
1636                 Instruction::Shl, IllegalShAmt, OBO::NoUnsignedWrap),
1637             ConstantRange::getFull(32));
1638   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
1639                 Instruction::Shl, IllegalShAmt, OBO::NoSignedWrap),
1640             ConstantRange::getFull(32));
1641 
1642   EXPECT_EQ(
1643       ConstantRange::makeGuaranteedNoWrapRegion(
1644           Instruction::Shl, ConstantRange(APInt(32, -32), APInt(32, 16) + 1),
1645           OBO::NoUnsignedWrap),
1646       ConstantRange::makeGuaranteedNoWrapRegion(
1647           Instruction::Shl, ConstantRange(APInt(32, 0), APInt(32, 16) + 1),
1648           OBO::NoUnsignedWrap));
1649   EXPECT_EQ(
1650       ConstantRange::makeGuaranteedNoWrapRegion(
1651           Instruction::Shl, ConstantRange(APInt(32, -32), APInt(32, 16) + 1),
1652           OBO::NoSignedWrap),
1653       ConstantRange::makeGuaranteedNoWrapRegion(
1654           Instruction::Shl, ConstantRange(APInt(32, 0), APInt(32, 16) + 1),
1655           OBO::NoSignedWrap));
1656 
1657   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
1658                 Instruction::Shl,
1659                 ConstantRange(APInt(32, -32), APInt(32, 16) + 1),
1660                 OBO::NoUnsignedWrap),
1661             ConstantRange(APInt(32, 0), APInt(32, 65535) + 1));
1662   EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
1663                 Instruction::Shl,
1664                 ConstantRange(APInt(32, -32), APInt(32, 16) + 1),
1665                 OBO::NoSignedWrap),
1666             ConstantRange(APInt(32, -32768), APInt(32, 32767) + 1));
1667 }
1668 
1669 template<typename Fn>
1670 void TestNoWrapRegionExhaustive(Instruction::BinaryOps BinOp,
1671                                 unsigned NoWrapKind, Fn OverflowFn) {
1672   unsigned Bits = 5;
1673   EnumerateConstantRanges(Bits, [&](const ConstantRange &CR) {
1674     if (CR.isEmptySet())
1675       return;
1676     if (Instruction::isShift(BinOp) && CR.getUnsignedMax().uge(Bits))
1677       return;
1678 
1679     ConstantRange NoWrap =
1680         ConstantRange::makeGuaranteedNoWrapRegion(BinOp, CR, NoWrapKind);
1681     ConstantRange Full = ConstantRange::getFull(Bits);
1682     ForeachNumInConstantRange(Full, [&](const APInt &N1) {
1683       bool NoOverflow = true;
1684       bool Overflow = true;
1685       ForeachNumInConstantRange(CR, [&](const APInt &N2) {
1686         if (OverflowFn(N1, N2))
1687           NoOverflow = false;
1688         else
1689           Overflow = false;
1690       });
1691       EXPECT_EQ(NoOverflow, NoWrap.contains(N1));
1692 
1693       // The no-wrap range is exact for single-element ranges.
1694       if (CR.isSingleElement()) {
1695         EXPECT_EQ(Overflow, !NoWrap.contains(N1));
1696       }
1697     });
1698   });
1699 }
1700 
1701 // Show that makeGuaranteedNoWrapRegion() is maximal, and for single-element
1702 // ranges also exact.
1703 TEST(ConstantRange, NoWrapRegionExhaustive) {
1704   TestNoWrapRegionExhaustive(
1705       Instruction::Add, OverflowingBinaryOperator::NoUnsignedWrap,
1706       [](const APInt &N1, const APInt &N2) {
1707         bool Overflow;
1708         (void) N1.uadd_ov(N2, Overflow);
1709         return Overflow;
1710       });
1711   TestNoWrapRegionExhaustive(
1712       Instruction::Add, OverflowingBinaryOperator::NoSignedWrap,
1713       [](const APInt &N1, const APInt &N2) {
1714         bool Overflow;
1715         (void) N1.sadd_ov(N2, Overflow);
1716         return Overflow;
1717       });
1718   TestNoWrapRegionExhaustive(
1719       Instruction::Sub, OverflowingBinaryOperator::NoUnsignedWrap,
1720       [](const APInt &N1, const APInt &N2) {
1721         bool Overflow;
1722         (void) N1.usub_ov(N2, Overflow);
1723         return Overflow;
1724       });
1725   TestNoWrapRegionExhaustive(
1726       Instruction::Sub, OverflowingBinaryOperator::NoSignedWrap,
1727       [](const APInt &N1, const APInt &N2) {
1728         bool Overflow;
1729         (void) N1.ssub_ov(N2, Overflow);
1730         return Overflow;
1731       });
1732   TestNoWrapRegionExhaustive(
1733       Instruction::Mul, OverflowingBinaryOperator::NoUnsignedWrap,
1734       [](const APInt &N1, const APInt &N2) {
1735         bool Overflow;
1736         (void) N1.umul_ov(N2, Overflow);
1737         return Overflow;
1738       });
1739   TestNoWrapRegionExhaustive(
1740       Instruction::Mul, OverflowingBinaryOperator::NoSignedWrap,
1741       [](const APInt &N1, const APInt &N2) {
1742         bool Overflow;
1743         (void) N1.smul_ov(N2, Overflow);
1744         return Overflow;
1745       });
1746   TestNoWrapRegionExhaustive(Instruction::Shl,
1747                              OverflowingBinaryOperator::NoUnsignedWrap,
1748                              [](const APInt &N1, const APInt &N2) {
1749                                bool Overflow;
1750                                (void)N1.ushl_ov(N2, Overflow);
1751                                return Overflow;
1752                              });
1753   TestNoWrapRegionExhaustive(Instruction::Shl,
1754                              OverflowingBinaryOperator::NoSignedWrap,
1755                              [](const APInt &N1, const APInt &N2) {
1756                                bool Overflow;
1757                                (void)N1.sshl_ov(N2, Overflow);
1758                                return Overflow;
1759                              });
1760 }
1761 
1762 TEST(ConstantRange, GetEquivalentICmp) {
1763   APInt RHS;
1764   CmpInst::Predicate Pred;
1765 
1766   EXPECT_TRUE(ConstantRange(APInt::getMinValue(32), APInt(32, 100))
1767                   .getEquivalentICmp(Pred, RHS));
1768   EXPECT_EQ(Pred, CmpInst::ICMP_ULT);
1769   EXPECT_EQ(RHS, APInt(32, 100));
1770 
1771   EXPECT_TRUE(ConstantRange(APInt::getSignedMinValue(32), APInt(32, 100))
1772                   .getEquivalentICmp(Pred, RHS));
1773   EXPECT_EQ(Pred, CmpInst::ICMP_SLT);
1774   EXPECT_EQ(RHS, APInt(32, 100));
1775 
1776   EXPECT_TRUE(ConstantRange(APInt(32, 100), APInt::getMinValue(32))
1777                   .getEquivalentICmp(Pred, RHS));
1778   EXPECT_EQ(Pred, CmpInst::ICMP_UGE);
1779   EXPECT_EQ(RHS, APInt(32, 100));
1780 
1781   EXPECT_TRUE(ConstantRange(APInt(32, 100), APInt::getSignedMinValue(32))
1782                   .getEquivalentICmp(Pred, RHS));
1783   EXPECT_EQ(Pred, CmpInst::ICMP_SGE);
1784   EXPECT_EQ(RHS, APInt(32, 100));
1785 
1786   EXPECT_TRUE(
1787       ConstantRange(32, /*isFullSet=*/true).getEquivalentICmp(Pred, RHS));
1788   EXPECT_EQ(Pred, CmpInst::ICMP_UGE);
1789   EXPECT_EQ(RHS, APInt(32, 0));
1790 
1791   EXPECT_TRUE(
1792       ConstantRange(32, /*isFullSet=*/false).getEquivalentICmp(Pred, RHS));
1793   EXPECT_EQ(Pred, CmpInst::ICMP_ULT);
1794   EXPECT_EQ(RHS, APInt(32, 0));
1795 
1796   EXPECT_FALSE(ConstantRange(APInt(32, 100), APInt(32, 200))
1797                    .getEquivalentICmp(Pred, RHS));
1798 
1799   EXPECT_FALSE(ConstantRange(APInt::getSignedMinValue(32) - APInt(32, 100),
1800                              APInt::getSignedMinValue(32) + APInt(32, 100))
1801                    .getEquivalentICmp(Pred, RHS));
1802 
1803   EXPECT_FALSE(ConstantRange(APInt::getMinValue(32) - APInt(32, 100),
1804                              APInt::getMinValue(32) + APInt(32, 100))
1805                    .getEquivalentICmp(Pred, RHS));
1806 
1807   EXPECT_TRUE(ConstantRange(APInt(32, 100)).getEquivalentICmp(Pred, RHS));
1808   EXPECT_EQ(Pred, CmpInst::ICMP_EQ);
1809   EXPECT_EQ(RHS, APInt(32, 100));
1810 
1811   EXPECT_TRUE(
1812       ConstantRange(APInt(32, 100)).inverse().getEquivalentICmp(Pred, RHS));
1813   EXPECT_EQ(Pred, CmpInst::ICMP_NE);
1814   EXPECT_EQ(RHS, APInt(32, 100));
1815 
1816   EXPECT_TRUE(
1817       ConstantRange(APInt(512, 100)).inverse().getEquivalentICmp(Pred, RHS));
1818   EXPECT_EQ(Pred, CmpInst::ICMP_NE);
1819   EXPECT_EQ(RHS, APInt(512, 100));
1820 
1821   // NB!  It would be correct for the following four calls to getEquivalentICmp
1822   // to return ordered predicates like CmpInst::ICMP_ULT or CmpInst::ICMP_UGT.
1823   // However, that's not the case today.
1824 
1825   EXPECT_TRUE(ConstantRange(APInt(32, 0)).getEquivalentICmp(Pred, RHS));
1826   EXPECT_EQ(Pred, CmpInst::ICMP_EQ);
1827   EXPECT_EQ(RHS, APInt(32, 0));
1828 
1829   EXPECT_TRUE(
1830       ConstantRange(APInt(32, 0)).inverse().getEquivalentICmp(Pred, RHS));
1831   EXPECT_EQ(Pred, CmpInst::ICMP_NE);
1832   EXPECT_EQ(RHS, APInt(32, 0));
1833 
1834   EXPECT_TRUE(ConstantRange(APInt(32, -1)).getEquivalentICmp(Pred, RHS));
1835   EXPECT_EQ(Pred, CmpInst::ICMP_EQ);
1836   EXPECT_EQ(RHS, APInt(32, -1));
1837 
1838   EXPECT_TRUE(
1839       ConstantRange(APInt(32, -1)).inverse().getEquivalentICmp(Pred, RHS));
1840   EXPECT_EQ(Pred, CmpInst::ICMP_NE);
1841   EXPECT_EQ(RHS, APInt(32, -1));
1842 }
1843 
1844 #define EXPECT_MAY_OVERFLOW(op) \
1845   EXPECT_EQ(ConstantRange::OverflowResult::MayOverflow, (op))
1846 #define EXPECT_ALWAYS_OVERFLOWS_LOW(op) \
1847   EXPECT_EQ(ConstantRange::OverflowResult::AlwaysOverflowsLow, (op))
1848 #define EXPECT_ALWAYS_OVERFLOWS_HIGH(op) \
1849   EXPECT_EQ(ConstantRange::OverflowResult::AlwaysOverflowsHigh, (op))
1850 #define EXPECT_NEVER_OVERFLOWS(op) \
1851   EXPECT_EQ(ConstantRange::OverflowResult::NeverOverflows, (op))
1852 
1853 TEST_F(ConstantRangeTest, UnsignedAddOverflow) {
1854   // Ill-defined - may overflow is a conservative result.
1855   EXPECT_MAY_OVERFLOW(Some.unsignedAddMayOverflow(Empty));
1856   EXPECT_MAY_OVERFLOW(Empty.unsignedAddMayOverflow(Some));
1857 
1858   // Never overflow despite one full/wrap set.
1859   ConstantRange Zero(APInt::getNullValue(16));
1860   EXPECT_NEVER_OVERFLOWS(Full.unsignedAddMayOverflow(Zero));
1861   EXPECT_NEVER_OVERFLOWS(Wrap.unsignedAddMayOverflow(Zero));
1862   EXPECT_NEVER_OVERFLOWS(Zero.unsignedAddMayOverflow(Full));
1863   EXPECT_NEVER_OVERFLOWS(Zero.unsignedAddMayOverflow(Wrap));
1864 
1865   // But usually full/wrap always may overflow.
1866   EXPECT_MAY_OVERFLOW(Full.unsignedAddMayOverflow(One));
1867   EXPECT_MAY_OVERFLOW(Wrap.unsignedAddMayOverflow(One));
1868   EXPECT_MAY_OVERFLOW(One.unsignedAddMayOverflow(Full));
1869   EXPECT_MAY_OVERFLOW(One.unsignedAddMayOverflow(Wrap));
1870 
1871   ConstantRange A(APInt(16, 0xfd00), APInt(16, 0xfe00));
1872   ConstantRange B1(APInt(16, 0x0100), APInt(16, 0x0201));
1873   ConstantRange B2(APInt(16, 0x0100), APInt(16, 0x0202));
1874   EXPECT_NEVER_OVERFLOWS(A.unsignedAddMayOverflow(B1));
1875   EXPECT_MAY_OVERFLOW(A.unsignedAddMayOverflow(B2));
1876   EXPECT_NEVER_OVERFLOWS(B1.unsignedAddMayOverflow(A));
1877   EXPECT_MAY_OVERFLOW(B2.unsignedAddMayOverflow(A));
1878 
1879   ConstantRange C1(APInt(16, 0x0299), APInt(16, 0x0400));
1880   ConstantRange C2(APInt(16, 0x0300), APInt(16, 0x0400));
1881   EXPECT_MAY_OVERFLOW(A.unsignedAddMayOverflow(C1));
1882   EXPECT_ALWAYS_OVERFLOWS_HIGH(A.unsignedAddMayOverflow(C2));
1883   EXPECT_MAY_OVERFLOW(C1.unsignedAddMayOverflow(A));
1884   EXPECT_ALWAYS_OVERFLOWS_HIGH(C2.unsignedAddMayOverflow(A));
1885 }
1886 
1887 TEST_F(ConstantRangeTest, UnsignedSubOverflow) {
1888   // Ill-defined - may overflow is a conservative result.
1889   EXPECT_MAY_OVERFLOW(Some.unsignedSubMayOverflow(Empty));
1890   EXPECT_MAY_OVERFLOW(Empty.unsignedSubMayOverflow(Some));
1891 
1892   // Never overflow despite one full/wrap set.
1893   ConstantRange Zero(APInt::getNullValue(16));
1894   ConstantRange Max(APInt::getAllOnesValue(16));
1895   EXPECT_NEVER_OVERFLOWS(Full.unsignedSubMayOverflow(Zero));
1896   EXPECT_NEVER_OVERFLOWS(Wrap.unsignedSubMayOverflow(Zero));
1897   EXPECT_NEVER_OVERFLOWS(Max.unsignedSubMayOverflow(Full));
1898   EXPECT_NEVER_OVERFLOWS(Max.unsignedSubMayOverflow(Wrap));
1899 
1900   // But usually full/wrap always may overflow.
1901   EXPECT_MAY_OVERFLOW(Full.unsignedSubMayOverflow(One));
1902   EXPECT_MAY_OVERFLOW(Wrap.unsignedSubMayOverflow(One));
1903   EXPECT_MAY_OVERFLOW(One.unsignedSubMayOverflow(Full));
1904   EXPECT_MAY_OVERFLOW(One.unsignedSubMayOverflow(Wrap));
1905 
1906   ConstantRange A(APInt(16, 0x0000), APInt(16, 0x0100));
1907   ConstantRange B(APInt(16, 0x0100), APInt(16, 0x0200));
1908   EXPECT_NEVER_OVERFLOWS(B.unsignedSubMayOverflow(A));
1909   EXPECT_ALWAYS_OVERFLOWS_LOW(A.unsignedSubMayOverflow(B));
1910 
1911   ConstantRange A1(APInt(16, 0x0000), APInt(16, 0x0101));
1912   ConstantRange B1(APInt(16, 0x0100), APInt(16, 0x0201));
1913   EXPECT_NEVER_OVERFLOWS(B1.unsignedSubMayOverflow(A1));
1914   EXPECT_MAY_OVERFLOW(A1.unsignedSubMayOverflow(B1));
1915 
1916   ConstantRange A2(APInt(16, 0x0000), APInt(16, 0x0102));
1917   ConstantRange B2(APInt(16, 0x0100), APInt(16, 0x0202));
1918   EXPECT_MAY_OVERFLOW(B2.unsignedSubMayOverflow(A2));
1919   EXPECT_MAY_OVERFLOW(A2.unsignedSubMayOverflow(B2));
1920 }
1921 
1922 TEST_F(ConstantRangeTest, SignedAddOverflow) {
1923   // Ill-defined - may overflow is a conservative result.
1924   EXPECT_MAY_OVERFLOW(Some.signedAddMayOverflow(Empty));
1925   EXPECT_MAY_OVERFLOW(Empty.signedAddMayOverflow(Some));
1926 
1927   // Never overflow despite one full/wrap set.
1928   ConstantRange Zero(APInt::getNullValue(16));
1929   EXPECT_NEVER_OVERFLOWS(Full.signedAddMayOverflow(Zero));
1930   EXPECT_NEVER_OVERFLOWS(Wrap.signedAddMayOverflow(Zero));
1931   EXPECT_NEVER_OVERFLOWS(Zero.signedAddMayOverflow(Full));
1932   EXPECT_NEVER_OVERFLOWS(Zero.signedAddMayOverflow(Wrap));
1933 
1934   // But usually full/wrap always may overflow.
1935   EXPECT_MAY_OVERFLOW(Full.signedAddMayOverflow(One));
1936   EXPECT_MAY_OVERFLOW(Wrap.signedAddMayOverflow(One));
1937   EXPECT_MAY_OVERFLOW(One.signedAddMayOverflow(Full));
1938   EXPECT_MAY_OVERFLOW(One.signedAddMayOverflow(Wrap));
1939 
1940   ConstantRange A(APInt(16, 0x7d00), APInt(16, 0x7e00));
1941   ConstantRange B1(APInt(16, 0x0100), APInt(16, 0x0201));
1942   ConstantRange B2(APInt(16, 0x0100), APInt(16, 0x0202));
1943   EXPECT_NEVER_OVERFLOWS(A.signedAddMayOverflow(B1));
1944   EXPECT_MAY_OVERFLOW(A.signedAddMayOverflow(B2));
1945   ConstantRange B3(APInt(16, 0x8000), APInt(16, 0x0201));
1946   ConstantRange B4(APInt(16, 0x8000), APInt(16, 0x0202));
1947   EXPECT_NEVER_OVERFLOWS(A.signedAddMayOverflow(B3));
1948   EXPECT_MAY_OVERFLOW(A.signedAddMayOverflow(B4));
1949   ConstantRange B5(APInt(16, 0x0299), APInt(16, 0x0400));
1950   ConstantRange B6(APInt(16, 0x0300), APInt(16, 0x0400));
1951   EXPECT_MAY_OVERFLOW(A.signedAddMayOverflow(B5));
1952   EXPECT_ALWAYS_OVERFLOWS_HIGH(A.signedAddMayOverflow(B6));
1953 
1954   ConstantRange C(APInt(16, 0x8200), APInt(16, 0x8300));
1955   ConstantRange D1(APInt(16, 0xfe00), APInt(16, 0xff00));
1956   ConstantRange D2(APInt(16, 0xfd99), APInt(16, 0xff00));
1957   EXPECT_NEVER_OVERFLOWS(C.signedAddMayOverflow(D1));
1958   EXPECT_MAY_OVERFLOW(C.signedAddMayOverflow(D2));
1959   ConstantRange D3(APInt(16, 0xfe00), APInt(16, 0x8000));
1960   ConstantRange D4(APInt(16, 0xfd99), APInt(16, 0x8000));
1961   EXPECT_NEVER_OVERFLOWS(C.signedAddMayOverflow(D3));
1962   EXPECT_MAY_OVERFLOW(C.signedAddMayOverflow(D4));
1963   ConstantRange D5(APInt(16, 0xfc00), APInt(16, 0xfd02));
1964   ConstantRange D6(APInt(16, 0xfc00), APInt(16, 0xfd01));
1965   EXPECT_MAY_OVERFLOW(C.signedAddMayOverflow(D5));
1966   EXPECT_ALWAYS_OVERFLOWS_LOW(C.signedAddMayOverflow(D6));
1967 
1968   ConstantRange E(APInt(16, 0xff00), APInt(16, 0x0100));
1969   EXPECT_NEVER_OVERFLOWS(E.signedAddMayOverflow(E));
1970   ConstantRange F(APInt(16, 0xf000), APInt(16, 0x7000));
1971   EXPECT_MAY_OVERFLOW(F.signedAddMayOverflow(F));
1972 }
1973 
1974 TEST_F(ConstantRangeTest, SignedSubOverflow) {
1975   // Ill-defined - may overflow is a conservative result.
1976   EXPECT_MAY_OVERFLOW(Some.signedSubMayOverflow(Empty));
1977   EXPECT_MAY_OVERFLOW(Empty.signedSubMayOverflow(Some));
1978 
1979   // Never overflow despite one full/wrap set.
1980   ConstantRange Zero(APInt::getNullValue(16));
1981   EXPECT_NEVER_OVERFLOWS(Full.signedSubMayOverflow(Zero));
1982   EXPECT_NEVER_OVERFLOWS(Wrap.signedSubMayOverflow(Zero));
1983 
1984   // But usually full/wrap always may overflow.
1985   EXPECT_MAY_OVERFLOW(Full.signedSubMayOverflow(One));
1986   EXPECT_MAY_OVERFLOW(Wrap.signedSubMayOverflow(One));
1987   EXPECT_MAY_OVERFLOW(One.signedSubMayOverflow(Full));
1988   EXPECT_MAY_OVERFLOW(One.signedSubMayOverflow(Wrap));
1989 
1990   ConstantRange A(APInt(16, 0x7d00), APInt(16, 0x7e00));
1991   ConstantRange B1(APInt(16, 0xfe00), APInt(16, 0xff00));
1992   ConstantRange B2(APInt(16, 0xfd99), APInt(16, 0xff00));
1993   EXPECT_NEVER_OVERFLOWS(A.signedSubMayOverflow(B1));
1994   EXPECT_MAY_OVERFLOW(A.signedSubMayOverflow(B2));
1995   ConstantRange B3(APInt(16, 0xfc00), APInt(16, 0xfd02));
1996   ConstantRange B4(APInt(16, 0xfc00), APInt(16, 0xfd01));
1997   EXPECT_MAY_OVERFLOW(A.signedSubMayOverflow(B3));
1998   EXPECT_ALWAYS_OVERFLOWS_HIGH(A.signedSubMayOverflow(B4));
1999 
2000   ConstantRange C(APInt(16, 0x8200), APInt(16, 0x8300));
2001   ConstantRange D1(APInt(16, 0x0100), APInt(16, 0x0201));
2002   ConstantRange D2(APInt(16, 0x0100), APInt(16, 0x0202));
2003   EXPECT_NEVER_OVERFLOWS(C.signedSubMayOverflow(D1));
2004   EXPECT_MAY_OVERFLOW(C.signedSubMayOverflow(D2));
2005   ConstantRange D3(APInt(16, 0x0299), APInt(16, 0x0400));
2006   ConstantRange D4(APInt(16, 0x0300), APInt(16, 0x0400));
2007   EXPECT_MAY_OVERFLOW(C.signedSubMayOverflow(D3));
2008   EXPECT_ALWAYS_OVERFLOWS_LOW(C.signedSubMayOverflow(D4));
2009 
2010   ConstantRange E(APInt(16, 0xff00), APInt(16, 0x0100));
2011   EXPECT_NEVER_OVERFLOWS(E.signedSubMayOverflow(E));
2012   ConstantRange F(APInt(16, 0xf000), APInt(16, 0x7001));
2013   EXPECT_MAY_OVERFLOW(F.signedSubMayOverflow(F));
2014 }
2015 
2016 template<typename Fn1, typename Fn2>
2017 static void TestOverflowExhaustive(Fn1 OverflowFn, Fn2 MayOverflowFn) {
2018   // Constant range overflow checks are tested exhaustively on 4-bit numbers.
2019   unsigned Bits = 4;
2020   EnumerateTwoConstantRanges(Bits, [=](const ConstantRange &CR1,
2021                                        const ConstantRange &CR2) {
2022     // Loop over all N1 in CR1 and N2 in CR2 and check whether any of the
2023     // operations have overflow / have no overflow.
2024     bool RangeHasOverflowLow = false;
2025     bool RangeHasOverflowHigh = false;
2026     bool RangeHasNoOverflow = false;
2027     ForeachNumInConstantRange(CR1, [&](const APInt &N1) {
2028       ForeachNumInConstantRange(CR2, [&](const APInt &N2) {
2029         bool IsOverflowHigh;
2030         if (!OverflowFn(IsOverflowHigh, N1, N2)) {
2031           RangeHasNoOverflow = true;
2032           return;
2033         }
2034 
2035         if (IsOverflowHigh)
2036           RangeHasOverflowHigh = true;
2037         else
2038           RangeHasOverflowLow = true;
2039       });
2040     });
2041 
2042     ConstantRange::OverflowResult OR = MayOverflowFn(CR1, CR2);
2043     switch (OR) {
2044     case ConstantRange::OverflowResult::AlwaysOverflowsLow:
2045       EXPECT_TRUE(RangeHasOverflowLow);
2046       EXPECT_FALSE(RangeHasOverflowHigh);
2047       EXPECT_FALSE(RangeHasNoOverflow);
2048       break;
2049     case ConstantRange::OverflowResult::AlwaysOverflowsHigh:
2050       EXPECT_TRUE(RangeHasOverflowHigh);
2051       EXPECT_FALSE(RangeHasOverflowLow);
2052       EXPECT_FALSE(RangeHasNoOverflow);
2053       break;
2054     case ConstantRange::OverflowResult::NeverOverflows:
2055       EXPECT_FALSE(RangeHasOverflowLow);
2056       EXPECT_FALSE(RangeHasOverflowHigh);
2057       EXPECT_TRUE(RangeHasNoOverflow);
2058       break;
2059     case ConstantRange::OverflowResult::MayOverflow:
2060       // We return MayOverflow for empty sets as a conservative result,
2061       // but of course neither the RangeHasOverflow nor the
2062       // RangeHasNoOverflow flags will be set.
2063       if (CR1.isEmptySet() || CR2.isEmptySet())
2064         break;
2065 
2066       EXPECT_TRUE(RangeHasOverflowLow || RangeHasOverflowHigh);
2067       EXPECT_TRUE(RangeHasNoOverflow);
2068       break;
2069     }
2070   });
2071 }
2072 
2073 TEST_F(ConstantRangeTest, UnsignedAddOverflowExhaustive) {
2074   TestOverflowExhaustive(
2075       [](bool &IsOverflowHigh, const APInt &N1, const APInt &N2) {
2076         bool Overflow;
2077         (void) N1.uadd_ov(N2, Overflow);
2078         IsOverflowHigh = true;
2079         return Overflow;
2080       },
2081       [](const ConstantRange &CR1, const ConstantRange &CR2) {
2082         return CR1.unsignedAddMayOverflow(CR2);
2083       });
2084 }
2085 
2086 TEST_F(ConstantRangeTest, UnsignedSubOverflowExhaustive) {
2087   TestOverflowExhaustive(
2088       [](bool &IsOverflowHigh, const APInt &N1, const APInt &N2) {
2089         bool Overflow;
2090         (void) N1.usub_ov(N2, Overflow);
2091         IsOverflowHigh = false;
2092         return Overflow;
2093       },
2094       [](const ConstantRange &CR1, const ConstantRange &CR2) {
2095         return CR1.unsignedSubMayOverflow(CR2);
2096       });
2097 }
2098 
2099 TEST_F(ConstantRangeTest, UnsignedMulOverflowExhaustive) {
2100   TestOverflowExhaustive(
2101       [](bool &IsOverflowHigh, const APInt &N1, const APInt &N2) {
2102         bool Overflow;
2103         (void) N1.umul_ov(N2, Overflow);
2104         IsOverflowHigh = true;
2105         return Overflow;
2106       },
2107       [](const ConstantRange &CR1, const ConstantRange &CR2) {
2108         return CR1.unsignedMulMayOverflow(CR2);
2109       });
2110 }
2111 
2112 TEST_F(ConstantRangeTest, SignedAddOverflowExhaustive) {
2113   TestOverflowExhaustive(
2114       [](bool &IsOverflowHigh, const APInt &N1, const APInt &N2) {
2115         bool Overflow;
2116         (void) N1.sadd_ov(N2, Overflow);
2117         IsOverflowHigh = N1.isNonNegative();
2118         return Overflow;
2119       },
2120       [](const ConstantRange &CR1, const ConstantRange &CR2) {
2121         return CR1.signedAddMayOverflow(CR2);
2122       });
2123 }
2124 
2125 TEST_F(ConstantRangeTest, SignedSubOverflowExhaustive) {
2126   TestOverflowExhaustive(
2127       [](bool &IsOverflowHigh, const APInt &N1, const APInt &N2) {
2128         bool Overflow;
2129         (void) N1.ssub_ov(N2, Overflow);
2130         IsOverflowHigh = N1.isNonNegative();
2131         return Overflow;
2132       },
2133       [](const ConstantRange &CR1, const ConstantRange &CR2) {
2134         return CR1.signedSubMayOverflow(CR2);
2135       });
2136 }
2137 
2138 TEST_F(ConstantRangeTest, FromKnownBits) {
2139   KnownBits Unknown(16);
2140   EXPECT_EQ(Full, ConstantRange::fromKnownBits(Unknown, /*signed*/false));
2141   EXPECT_EQ(Full, ConstantRange::fromKnownBits(Unknown, /*signed*/true));
2142 
2143   // .10..01. -> unsigned 01000010 (66)  to 11011011 (219)
2144   //          -> signed   11000010 (194) to 01011011 (91)
2145   KnownBits Known(8);
2146   Known.Zero = 36;
2147   Known.One = 66;
2148   ConstantRange Unsigned(APInt(8, 66), APInt(8, 219 + 1));
2149   ConstantRange Signed(APInt(8, 194), APInt(8, 91 + 1));
2150   EXPECT_EQ(Unsigned, ConstantRange::fromKnownBits(Known, /*signed*/false));
2151   EXPECT_EQ(Signed, ConstantRange::fromKnownBits(Known, /*signed*/true));
2152 
2153   // 1.10.10. -> 10100100 (164) to 11101101 (237)
2154   Known.Zero = 18;
2155   Known.One = 164;
2156   ConstantRange CR1(APInt(8, 164), APInt(8, 237 + 1));
2157   EXPECT_EQ(CR1, ConstantRange::fromKnownBits(Known, /*signed*/false));
2158   EXPECT_EQ(CR1, ConstantRange::fromKnownBits(Known, /*signed*/true));
2159 
2160   // 01.0.1.0 -> 01000100 (68) to 01101110 (110)
2161   Known.Zero = 145;
2162   Known.One = 68;
2163   ConstantRange CR2(APInt(8, 68), APInt(8, 110 + 1));
2164   EXPECT_EQ(CR2, ConstantRange::fromKnownBits(Known, /*signed*/false));
2165   EXPECT_EQ(CR2, ConstantRange::fromKnownBits(Known, /*signed*/true));
2166 }
2167 
2168 TEST_F(ConstantRangeTest, FromKnownBitsExhaustive) {
2169   unsigned Bits = 4;
2170   unsigned Max = 1 << Bits;
2171   KnownBits Known(Bits);
2172   for (unsigned Zero = 0; Zero < Max; ++Zero) {
2173     for (unsigned One = 0; One < Max; ++One) {
2174       Known.Zero = Zero;
2175       Known.One = One;
2176       if (Known.hasConflict() || Known.isUnknown())
2177         continue;
2178 
2179       APInt MinUnsigned = APInt::getMaxValue(Bits);
2180       APInt MaxUnsigned = APInt::getMinValue(Bits);
2181       APInt MinSigned = APInt::getSignedMaxValue(Bits);
2182       APInt MaxSigned = APInt::getSignedMinValue(Bits);
2183       for (unsigned N = 0; N < Max; ++N) {
2184         APInt Num(Bits, N);
2185         if ((Num & Known.Zero) != 0 || (~Num & Known.One) != 0)
2186           continue;
2187 
2188         if (Num.ult(MinUnsigned)) MinUnsigned = Num;
2189         if (Num.ugt(MaxUnsigned)) MaxUnsigned = Num;
2190         if (Num.slt(MinSigned)) MinSigned = Num;
2191         if (Num.sgt(MaxSigned)) MaxSigned = Num;
2192       }
2193 
2194       ConstantRange UnsignedCR(MinUnsigned, MaxUnsigned + 1);
2195       ConstantRange SignedCR(MinSigned, MaxSigned + 1);
2196       EXPECT_EQ(UnsignedCR, ConstantRange::fromKnownBits(Known, false));
2197       EXPECT_EQ(SignedCR, ConstantRange::fromKnownBits(Known, true));
2198     }
2199   }
2200 }
2201 
2202 TEST_F(ConstantRangeTest, Negative) {
2203   // All elements in an empty set (of which there are none) are both negative
2204   // and non-negative. Empty & full sets checked explicitly for clarity, but
2205   // they are also covered by the exhaustive test below.
2206   EXPECT_TRUE(Empty.isAllNegative());
2207   EXPECT_TRUE(Empty.isAllNonNegative());
2208   EXPECT_FALSE(Full.isAllNegative());
2209   EXPECT_FALSE(Full.isAllNonNegative());
2210 
2211   unsigned Bits = 4;
2212   EnumerateConstantRanges(Bits, [](const ConstantRange &CR) {
2213     bool AllNegative = true;
2214     bool AllNonNegative = true;
2215     ForeachNumInConstantRange(CR, [&](const APInt &N) {
2216       if (!N.isNegative())
2217         AllNegative = false;
2218       if (!N.isNonNegative())
2219         AllNonNegative = false;
2220     });
2221     assert((CR.isEmptySet() || !AllNegative || !AllNonNegative) &&
2222            "Only empty set can be both all negative and all non-negative");
2223 
2224     EXPECT_EQ(AllNegative, CR.isAllNegative());
2225     EXPECT_EQ(AllNonNegative, CR.isAllNonNegative());
2226   });
2227 }
2228 
2229 TEST_F(ConstantRangeTest, UAddSat) {
2230   TestUnsignedBinOpExhaustive(
2231       [](const ConstantRange &CR1, const ConstantRange &CR2) {
2232         return CR1.uadd_sat(CR2);
2233       },
2234       [](const APInt &N1, const APInt &N2) {
2235         return N1.uadd_sat(N2);
2236       });
2237 }
2238 
2239 TEST_F(ConstantRangeTest, USubSat) {
2240   TestUnsignedBinOpExhaustive(
2241       [](const ConstantRange &CR1, const ConstantRange &CR2) {
2242         return CR1.usub_sat(CR2);
2243       },
2244       [](const APInt &N1, const APInt &N2) {
2245         return N1.usub_sat(N2);
2246       });
2247 }
2248 
2249 TEST_F(ConstantRangeTest, UMulSat) {
2250   TestUnsignedBinOpExhaustive(
2251       [](const ConstantRange &CR1, const ConstantRange &CR2) {
2252         return CR1.umul_sat(CR2);
2253       },
2254       [](const APInt &N1, const APInt &N2) { return N1.umul_sat(N2); });
2255 }
2256 
2257 TEST_F(ConstantRangeTest, UShlSat) {
2258   TestUnsignedBinOpExhaustive(
2259       [](const ConstantRange &CR1, const ConstantRange &CR2) {
2260         return CR1.ushl_sat(CR2);
2261       },
2262       [](const APInt &N1, const APInt &N2) { return N1.ushl_sat(N2); });
2263 }
2264 
2265 TEST_F(ConstantRangeTest, SAddSat) {
2266   TestSignedBinOpExhaustive(
2267       [](const ConstantRange &CR1, const ConstantRange &CR2) {
2268         return CR1.sadd_sat(CR2);
2269       },
2270       [](const APInt &N1, const APInt &N2) {
2271         return N1.sadd_sat(N2);
2272       });
2273 }
2274 
2275 TEST_F(ConstantRangeTest, SSubSat) {
2276   TestSignedBinOpExhaustive(
2277       [](const ConstantRange &CR1, const ConstantRange &CR2) {
2278         return CR1.ssub_sat(CR2);
2279       },
2280       [](const APInt &N1, const APInt &N2) {
2281         return N1.ssub_sat(N2);
2282       });
2283 }
2284 
2285 TEST_F(ConstantRangeTest, SMulSat) {
2286   TestSignedBinOpExhaustive(
2287       [](const ConstantRange &CR1, const ConstantRange &CR2) {
2288         return CR1.smul_sat(CR2);
2289       },
2290       [](const APInt &N1, const APInt &N2) { return N1.smul_sat(N2); });
2291 }
2292 
2293 TEST_F(ConstantRangeTest, SShlSat) {
2294   TestSignedBinOpExhaustive(
2295       [](const ConstantRange &CR1, const ConstantRange &CR2) {
2296         return CR1.sshl_sat(CR2);
2297       },
2298       [](const APInt &N1, const APInt &N2) { return N1.sshl_sat(N2); });
2299 }
2300 
2301 TEST_F(ConstantRangeTest, Abs) {
2302   // We're working with unsigned integers here, because it makes the signed
2303   // min case non-wrapping.
2304   TestUnsignedUnaryOpExhaustive(
2305       [](const ConstantRange &CR) { return CR.abs(); },
2306       [](const APInt &N) { return N.abs(); });
2307 
2308   TestUnsignedUnaryOpExhaustive(
2309       [](const ConstantRange &CR) { return CR.abs(/*IntMinIsPoison=*/true); },
2310       [](const APInt &N) { return N.abs(); },
2311       /*SkipSignedIntMin=*/true);
2312 }
2313 
2314 TEST_F(ConstantRangeTest, castOps) {
2315   ConstantRange A(APInt(16, 66), APInt(16, 128));
2316   ConstantRange FpToI8 = A.castOp(Instruction::FPToSI, 8);
2317   EXPECT_EQ(8u, FpToI8.getBitWidth());
2318   EXPECT_TRUE(FpToI8.isFullSet());
2319 
2320   ConstantRange FpToI16 = A.castOp(Instruction::FPToSI, 16);
2321   EXPECT_EQ(16u, FpToI16.getBitWidth());
2322   EXPECT_EQ(A, FpToI16);
2323 
2324   ConstantRange FPExtToDouble = A.castOp(Instruction::FPExt, 64);
2325   EXPECT_EQ(64u, FPExtToDouble.getBitWidth());
2326   EXPECT_TRUE(FPExtToDouble.isFullSet());
2327 
2328   ConstantRange PtrToInt = A.castOp(Instruction::PtrToInt, 64);
2329   EXPECT_EQ(64u, PtrToInt.getBitWidth());
2330   EXPECT_TRUE(PtrToInt.isFullSet());
2331 
2332   ConstantRange IntToPtr = A.castOp(Instruction::IntToPtr, 64);
2333   EXPECT_EQ(64u, IntToPtr.getBitWidth());
2334   EXPECT_TRUE(IntToPtr.isFullSet());
2335 }
2336 
2337 TEST_F(ConstantRangeTest, binaryXor) {
2338   // Single element ranges.
2339   ConstantRange R16(APInt(8, 16));
2340   ConstantRange R20(APInt(8, 20));
2341   EXPECT_EQ(*R16.binaryXor(R16).getSingleElement(), APInt(8, 0));
2342   EXPECT_EQ(*R16.binaryXor(R20).getSingleElement(), APInt(8, 16 ^ 20));
2343 
2344   // Ranges with more than a single element. Handled conservatively for now.
2345   ConstantRange R16_35(APInt(8, 16), APInt(8, 35));
2346   ConstantRange R0_99(APInt(8, 0), APInt(8, 99));
2347   EXPECT_TRUE(R16_35.binaryXor(R16_35).isFullSet());
2348   EXPECT_TRUE(R16_35.binaryXor(R0_99).isFullSet());
2349   EXPECT_TRUE(R0_99.binaryXor(R16_35).isFullSet());
2350 }
2351 
2352 }  // anonymous namespace
2353