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