• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===- ConstantRange.cpp - ConstantRange implementation -------------------===//
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 // Represent a range of possible values that may occur when the program is run
10 // for an integral value.  This keeps track of a lower and upper bound for the
11 // constant, which MAY wrap around the end of the numeric range.  To do this, it
12 // keeps track of a [lower, upper) bound, which specifies an interval just like
13 // STL iterators.  When used with boolean values, the following are important
14 // ranges (other integral ranges use min/max values for special range values):
15 //
16 //  [F, F) = {}     = Empty set
17 //  [T, F) = {T}
18 //  [F, T) = {F}
19 //  [T, T) = {F, T} = Full set
20 //
21 //===----------------------------------------------------------------------===//
22 
23 #include "llvm/ADT/APInt.h"
24 #include "llvm/Config/llvm-config.h"
25 #include "llvm/IR/ConstantRange.h"
26 #include "llvm/IR/Constants.h"
27 #include "llvm/IR/InstrTypes.h"
28 #include "llvm/IR/Instruction.h"
29 #include "llvm/IR/Intrinsics.h"
30 #include "llvm/IR/Metadata.h"
31 #include "llvm/IR/Operator.h"
32 #include "llvm/Support/Compiler.h"
33 #include "llvm/Support/Debug.h"
34 #include "llvm/Support/ErrorHandling.h"
35 #include "llvm/Support/KnownBits.h"
36 #include "llvm/Support/raw_ostream.h"
37 #include <algorithm>
38 #include <cassert>
39 #include <cstdint>
40 
41 using namespace llvm;
42 
ConstantRange(uint32_t BitWidth,bool Full)43 ConstantRange::ConstantRange(uint32_t BitWidth, bool Full)
44     : Lower(Full ? APInt::getMaxValue(BitWidth) : APInt::getMinValue(BitWidth)),
45       Upper(Lower) {}
46 
ConstantRange(APInt V)47 ConstantRange::ConstantRange(APInt V)
48     : Lower(std::move(V)), Upper(Lower + 1) {}
49 
ConstantRange(APInt L,APInt U)50 ConstantRange::ConstantRange(APInt L, APInt U)
51     : Lower(std::move(L)), Upper(std::move(U)) {
52   assert(Lower.getBitWidth() == Upper.getBitWidth() &&
53          "ConstantRange with unequal bit widths");
54   assert((Lower != Upper || (Lower.isMaxValue() || Lower.isMinValue())) &&
55          "Lower == Upper, but they aren't min or max value!");
56 }
57 
fromKnownBits(const KnownBits & Known,bool IsSigned)58 ConstantRange ConstantRange::fromKnownBits(const KnownBits &Known,
59                                            bool IsSigned) {
60   assert(!Known.hasConflict() && "Expected valid KnownBits");
61 
62   if (Known.isUnknown())
63     return getFull(Known.getBitWidth());
64 
65   // For unsigned ranges, or signed ranges with known sign bit, create a simple
66   // range between the smallest and largest possible value.
67   if (!IsSigned || Known.isNegative() || Known.isNonNegative())
68     return ConstantRange(Known.getMinValue(), Known.getMaxValue() + 1);
69 
70   // If we don't know the sign bit, pick the lower bound as a negative number
71   // and the upper bound as a non-negative one.
72   APInt Lower = Known.getMinValue(), Upper = Known.getMaxValue();
73   Lower.setSignBit();
74   Upper.clearSignBit();
75   return ConstantRange(Lower, Upper + 1);
76 }
77 
makeAllowedICmpRegion(CmpInst::Predicate Pred,const ConstantRange & CR)78 ConstantRange ConstantRange::makeAllowedICmpRegion(CmpInst::Predicate Pred,
79                                                    const ConstantRange &CR) {
80   if (CR.isEmptySet())
81     return CR;
82 
83   uint32_t W = CR.getBitWidth();
84   switch (Pred) {
85   default:
86     llvm_unreachable("Invalid ICmp predicate to makeAllowedICmpRegion()");
87   case CmpInst::ICMP_EQ:
88     return CR;
89   case CmpInst::ICMP_NE:
90     if (CR.isSingleElement())
91       return ConstantRange(CR.getUpper(), CR.getLower());
92     return getFull(W);
93   case CmpInst::ICMP_ULT: {
94     APInt UMax(CR.getUnsignedMax());
95     if (UMax.isMinValue())
96       return getEmpty(W);
97     return ConstantRange(APInt::getMinValue(W), std::move(UMax));
98   }
99   case CmpInst::ICMP_SLT: {
100     APInt SMax(CR.getSignedMax());
101     if (SMax.isMinSignedValue())
102       return getEmpty(W);
103     return ConstantRange(APInt::getSignedMinValue(W), std::move(SMax));
104   }
105   case CmpInst::ICMP_ULE:
106     return getNonEmpty(APInt::getMinValue(W), CR.getUnsignedMax() + 1);
107   case CmpInst::ICMP_SLE:
108     return getNonEmpty(APInt::getSignedMinValue(W), CR.getSignedMax() + 1);
109   case CmpInst::ICMP_UGT: {
110     APInt UMin(CR.getUnsignedMin());
111     if (UMin.isMaxValue())
112       return getEmpty(W);
113     return ConstantRange(std::move(UMin) + 1, APInt::getNullValue(W));
114   }
115   case CmpInst::ICMP_SGT: {
116     APInt SMin(CR.getSignedMin());
117     if (SMin.isMaxSignedValue())
118       return getEmpty(W);
119     return ConstantRange(std::move(SMin) + 1, APInt::getSignedMinValue(W));
120   }
121   case CmpInst::ICMP_UGE:
122     return getNonEmpty(CR.getUnsignedMin(), APInt::getNullValue(W));
123   case CmpInst::ICMP_SGE:
124     return getNonEmpty(CR.getSignedMin(), APInt::getSignedMinValue(W));
125   }
126 }
127 
makeSatisfyingICmpRegion(CmpInst::Predicate Pred,const ConstantRange & CR)128 ConstantRange ConstantRange::makeSatisfyingICmpRegion(CmpInst::Predicate Pred,
129                                                       const ConstantRange &CR) {
130   // Follows from De-Morgan's laws:
131   //
132   // ~(~A union ~B) == A intersect B.
133   //
134   return makeAllowedICmpRegion(CmpInst::getInversePredicate(Pred), CR)
135       .inverse();
136 }
137 
makeExactICmpRegion(CmpInst::Predicate Pred,const APInt & C)138 ConstantRange ConstantRange::makeExactICmpRegion(CmpInst::Predicate Pred,
139                                                  const APInt &C) {
140   // Computes the exact range that is equal to both the constant ranges returned
141   // by makeAllowedICmpRegion and makeSatisfyingICmpRegion. This is always true
142   // when RHS is a singleton such as an APInt and so the assert is valid.
143   // However for non-singleton RHS, for example ult [2,5) makeAllowedICmpRegion
144   // returns [0,4) but makeSatisfyICmpRegion returns [0,2).
145   //
146   assert(makeAllowedICmpRegion(Pred, C) == makeSatisfyingICmpRegion(Pred, C));
147   return makeAllowedICmpRegion(Pred, C);
148 }
149 
getEquivalentICmp(CmpInst::Predicate & Pred,APInt & RHS) const150 bool ConstantRange::getEquivalentICmp(CmpInst::Predicate &Pred,
151                                       APInt &RHS) const {
152   bool Success = false;
153 
154   if (isFullSet() || isEmptySet()) {
155     Pred = isEmptySet() ? CmpInst::ICMP_ULT : CmpInst::ICMP_UGE;
156     RHS = APInt(getBitWidth(), 0);
157     Success = true;
158   } else if (auto *OnlyElt = getSingleElement()) {
159     Pred = CmpInst::ICMP_EQ;
160     RHS = *OnlyElt;
161     Success = true;
162   } else if (auto *OnlyMissingElt = getSingleMissingElement()) {
163     Pred = CmpInst::ICMP_NE;
164     RHS = *OnlyMissingElt;
165     Success = true;
166   } else if (getLower().isMinSignedValue() || getLower().isMinValue()) {
167     Pred =
168         getLower().isMinSignedValue() ? CmpInst::ICMP_SLT : CmpInst::ICMP_ULT;
169     RHS = getUpper();
170     Success = true;
171   } else if (getUpper().isMinSignedValue() || getUpper().isMinValue()) {
172     Pred =
173         getUpper().isMinSignedValue() ? CmpInst::ICMP_SGE : CmpInst::ICMP_UGE;
174     RHS = getLower();
175     Success = true;
176   }
177 
178   assert((!Success || ConstantRange::makeExactICmpRegion(Pred, RHS) == *this) &&
179          "Bad result!");
180 
181   return Success;
182 }
183 
184 /// Exact mul nuw region for single element RHS.
makeExactMulNUWRegion(const APInt & V)185 static ConstantRange makeExactMulNUWRegion(const APInt &V) {
186   unsigned BitWidth = V.getBitWidth();
187   if (V == 0)
188     return ConstantRange::getFull(V.getBitWidth());
189 
190   return ConstantRange::getNonEmpty(
191       APIntOps::RoundingUDiv(APInt::getMinValue(BitWidth), V,
192                              APInt::Rounding::UP),
193       APIntOps::RoundingUDiv(APInt::getMaxValue(BitWidth), V,
194                              APInt::Rounding::DOWN) + 1);
195 }
196 
197 /// Exact mul nsw region for single element RHS.
makeExactMulNSWRegion(const APInt & V)198 static ConstantRange makeExactMulNSWRegion(const APInt &V) {
199   // Handle special case for 0, -1 and 1. See the last for reason why we
200   // specialize -1 and 1.
201   unsigned BitWidth = V.getBitWidth();
202   if (V == 0 || V.isOneValue())
203     return ConstantRange::getFull(BitWidth);
204 
205   APInt MinValue = APInt::getSignedMinValue(BitWidth);
206   APInt MaxValue = APInt::getSignedMaxValue(BitWidth);
207   // e.g. Returning [-127, 127], represented as [-127, -128).
208   if (V.isAllOnesValue())
209     return ConstantRange(-MaxValue, MinValue);
210 
211   APInt Lower, Upper;
212   if (V.isNegative()) {
213     Lower = APIntOps::RoundingSDiv(MaxValue, V, APInt::Rounding::UP);
214     Upper = APIntOps::RoundingSDiv(MinValue, V, APInt::Rounding::DOWN);
215   } else {
216     Lower = APIntOps::RoundingSDiv(MinValue, V, APInt::Rounding::UP);
217     Upper = APIntOps::RoundingSDiv(MaxValue, V, APInt::Rounding::DOWN);
218   }
219   // ConstantRange ctor take a half inclusive interval [Lower, Upper + 1).
220   // Upper + 1 is guaranteed not to overflow, because |divisor| > 1. 0, -1,
221   // and 1 are already handled as special cases.
222   return ConstantRange(Lower, Upper + 1);
223 }
224 
225 ConstantRange
makeGuaranteedNoWrapRegion(Instruction::BinaryOps BinOp,const ConstantRange & Other,unsigned NoWrapKind)226 ConstantRange::makeGuaranteedNoWrapRegion(Instruction::BinaryOps BinOp,
227                                           const ConstantRange &Other,
228                                           unsigned NoWrapKind) {
229   using OBO = OverflowingBinaryOperator;
230 
231   assert(Instruction::isBinaryOp(BinOp) && "Binary operators only!");
232 
233   assert((NoWrapKind == OBO::NoSignedWrap ||
234           NoWrapKind == OBO::NoUnsignedWrap) &&
235          "NoWrapKind invalid!");
236 
237   bool Unsigned = NoWrapKind == OBO::NoUnsignedWrap;
238   unsigned BitWidth = Other.getBitWidth();
239 
240   switch (BinOp) {
241   default:
242     llvm_unreachable("Unsupported binary op");
243 
244   case Instruction::Add: {
245     if (Unsigned)
246       return getNonEmpty(APInt::getNullValue(BitWidth),
247                          -Other.getUnsignedMax());
248 
249     APInt SignedMinVal = APInt::getSignedMinValue(BitWidth);
250     APInt SMin = Other.getSignedMin(), SMax = Other.getSignedMax();
251     return getNonEmpty(
252         SMin.isNegative() ? SignedMinVal - SMin : SignedMinVal,
253         SMax.isStrictlyPositive() ? SignedMinVal - SMax : SignedMinVal);
254   }
255 
256   case Instruction::Sub: {
257     if (Unsigned)
258       return getNonEmpty(Other.getUnsignedMax(), APInt::getMinValue(BitWidth));
259 
260     APInt SignedMinVal = APInt::getSignedMinValue(BitWidth);
261     APInt SMin = Other.getSignedMin(), SMax = Other.getSignedMax();
262     return getNonEmpty(
263         SMax.isStrictlyPositive() ? SignedMinVal + SMax : SignedMinVal,
264         SMin.isNegative() ? SignedMinVal + SMin : SignedMinVal);
265   }
266 
267   case Instruction::Mul:
268     if (Unsigned)
269       return makeExactMulNUWRegion(Other.getUnsignedMax());
270 
271     return makeExactMulNSWRegion(Other.getSignedMin())
272         .intersectWith(makeExactMulNSWRegion(Other.getSignedMax()));
273 
274   case Instruction::Shl: {
275     // For given range of shift amounts, if we ignore all illegal shift amounts
276     // (that always produce poison), what shift amount range is left?
277     ConstantRange ShAmt = Other.intersectWith(
278         ConstantRange(APInt(BitWidth, 0), APInt(BitWidth, (BitWidth - 1) + 1)));
279     if (ShAmt.isEmptySet()) {
280       // If the entire range of shift amounts is already poison-producing,
281       // then we can freely add more poison-producing flags ontop of that.
282       return getFull(BitWidth);
283     }
284     // There are some legal shift amounts, we can compute conservatively-correct
285     // range of no-wrap inputs. Note that by now we have clamped the ShAmtUMax
286     // to be at most bitwidth-1, which results in most conservative range.
287     APInt ShAmtUMax = ShAmt.getUnsignedMax();
288     if (Unsigned)
289       return getNonEmpty(APInt::getNullValue(BitWidth),
290                          APInt::getMaxValue(BitWidth).lshr(ShAmtUMax) + 1);
291     return getNonEmpty(APInt::getSignedMinValue(BitWidth).ashr(ShAmtUMax),
292                        APInt::getSignedMaxValue(BitWidth).ashr(ShAmtUMax) + 1);
293   }
294   }
295 }
296 
makeExactNoWrapRegion(Instruction::BinaryOps BinOp,const APInt & Other,unsigned NoWrapKind)297 ConstantRange ConstantRange::makeExactNoWrapRegion(Instruction::BinaryOps BinOp,
298                                                    const APInt &Other,
299                                                    unsigned NoWrapKind) {
300   // makeGuaranteedNoWrapRegion() is exact for single-element ranges, as
301   // "for all" and "for any" coincide in this case.
302   return makeGuaranteedNoWrapRegion(BinOp, ConstantRange(Other), NoWrapKind);
303 }
304 
isFullSet() const305 bool ConstantRange::isFullSet() const {
306   return Lower == Upper && Lower.isMaxValue();
307 }
308 
isEmptySet() const309 bool ConstantRange::isEmptySet() const {
310   return Lower == Upper && Lower.isMinValue();
311 }
312 
isWrappedSet() const313 bool ConstantRange::isWrappedSet() const {
314   return Lower.ugt(Upper) && !Upper.isNullValue();
315 }
316 
isUpperWrapped() const317 bool ConstantRange::isUpperWrapped() const {
318   return Lower.ugt(Upper);
319 }
320 
isSignWrappedSet() const321 bool ConstantRange::isSignWrappedSet() const {
322   return Lower.sgt(Upper) && !Upper.isMinSignedValue();
323 }
324 
isUpperSignWrapped() const325 bool ConstantRange::isUpperSignWrapped() const {
326   return Lower.sgt(Upper);
327 }
328 
329 bool
isSizeStrictlySmallerThan(const ConstantRange & Other) const330 ConstantRange::isSizeStrictlySmallerThan(const ConstantRange &Other) const {
331   assert(getBitWidth() == Other.getBitWidth());
332   if (isFullSet())
333     return false;
334   if (Other.isFullSet())
335     return true;
336   return (Upper - Lower).ult(Other.Upper - Other.Lower);
337 }
338 
339 bool
isSizeLargerThan(uint64_t MaxSize) const340 ConstantRange::isSizeLargerThan(uint64_t MaxSize) const {
341   assert(MaxSize && "MaxSize can't be 0.");
342   // If this a full set, we need special handling to avoid needing an extra bit
343   // to represent the size.
344   if (isFullSet())
345     return APInt::getMaxValue(getBitWidth()).ugt(MaxSize - 1);
346 
347   return (Upper - Lower).ugt(MaxSize);
348 }
349 
isAllNegative() const350 bool ConstantRange::isAllNegative() const {
351   // Empty set is all negative, full set is not.
352   if (isEmptySet())
353     return true;
354   if (isFullSet())
355     return false;
356 
357   return !isUpperSignWrapped() && !Upper.isStrictlyPositive();
358 }
359 
isAllNonNegative() const360 bool ConstantRange::isAllNonNegative() const {
361   // Empty and full set are automatically treated correctly.
362   return !isSignWrappedSet() && Lower.isNonNegative();
363 }
364 
getUnsignedMax() const365 APInt ConstantRange::getUnsignedMax() const {
366   if (isFullSet() || isUpperWrapped())
367     return APInt::getMaxValue(getBitWidth());
368   return getUpper() - 1;
369 }
370 
getUnsignedMin() const371 APInt ConstantRange::getUnsignedMin() const {
372   if (isFullSet() || isWrappedSet())
373     return APInt::getMinValue(getBitWidth());
374   return getLower();
375 }
376 
getSignedMax() const377 APInt ConstantRange::getSignedMax() const {
378   if (isFullSet() || isUpperSignWrapped())
379     return APInt::getSignedMaxValue(getBitWidth());
380   return getUpper() - 1;
381 }
382 
getSignedMin() const383 APInt ConstantRange::getSignedMin() const {
384   if (isFullSet() || isSignWrappedSet())
385     return APInt::getSignedMinValue(getBitWidth());
386   return getLower();
387 }
388 
contains(const APInt & V) const389 bool ConstantRange::contains(const APInt &V) const {
390   if (Lower == Upper)
391     return isFullSet();
392 
393   if (!isUpperWrapped())
394     return Lower.ule(V) && V.ult(Upper);
395   return Lower.ule(V) || V.ult(Upper);
396 }
397 
contains(const ConstantRange & Other) const398 bool ConstantRange::contains(const ConstantRange &Other) const {
399   if (isFullSet() || Other.isEmptySet()) return true;
400   if (isEmptySet() || Other.isFullSet()) return false;
401 
402   if (!isUpperWrapped()) {
403     if (Other.isUpperWrapped())
404       return false;
405 
406     return Lower.ule(Other.getLower()) && Other.getUpper().ule(Upper);
407   }
408 
409   if (!Other.isUpperWrapped())
410     return Other.getUpper().ule(Upper) ||
411            Lower.ule(Other.getLower());
412 
413   return Other.getUpper().ule(Upper) && Lower.ule(Other.getLower());
414 }
415 
getActiveBits() const416 unsigned ConstantRange::getActiveBits() const {
417   if (isEmptySet())
418     return 0;
419 
420   return getUnsignedMax().getActiveBits();
421 }
422 
getMinSignedBits() const423 unsigned ConstantRange::getMinSignedBits() const {
424   if (isEmptySet())
425     return 0;
426 
427   return std::max(getSignedMin().getMinSignedBits(),
428                   getSignedMax().getMinSignedBits());
429 }
430 
subtract(const APInt & Val) const431 ConstantRange ConstantRange::subtract(const APInt &Val) const {
432   assert(Val.getBitWidth() == getBitWidth() && "Wrong bit width");
433   // If the set is empty or full, don't modify the endpoints.
434   if (Lower == Upper)
435     return *this;
436   return ConstantRange(Lower - Val, Upper - Val);
437 }
438 
difference(const ConstantRange & CR) const439 ConstantRange ConstantRange::difference(const ConstantRange &CR) const {
440   return intersectWith(CR.inverse());
441 }
442 
getPreferredRange(const ConstantRange & CR1,const ConstantRange & CR2,ConstantRange::PreferredRangeType Type)443 static ConstantRange getPreferredRange(
444     const ConstantRange &CR1, const ConstantRange &CR2,
445     ConstantRange::PreferredRangeType Type) {
446   if (Type == ConstantRange::Unsigned) {
447     if (!CR1.isWrappedSet() && CR2.isWrappedSet())
448       return CR1;
449     if (CR1.isWrappedSet() && !CR2.isWrappedSet())
450       return CR2;
451   } else if (Type == ConstantRange::Signed) {
452     if (!CR1.isSignWrappedSet() && CR2.isSignWrappedSet())
453       return CR1;
454     if (CR1.isSignWrappedSet() && !CR2.isSignWrappedSet())
455       return CR2;
456   }
457 
458   if (CR1.isSizeStrictlySmallerThan(CR2))
459     return CR1;
460   return CR2;
461 }
462 
intersectWith(const ConstantRange & CR,PreferredRangeType Type) const463 ConstantRange ConstantRange::intersectWith(const ConstantRange &CR,
464                                            PreferredRangeType Type) const {
465   assert(getBitWidth() == CR.getBitWidth() &&
466          "ConstantRange types don't agree!");
467 
468   // Handle common cases.
469   if (   isEmptySet() || CR.isFullSet()) return *this;
470   if (CR.isEmptySet() ||    isFullSet()) return CR;
471 
472   if (!isUpperWrapped() && CR.isUpperWrapped())
473     return CR.intersectWith(*this, Type);
474 
475   if (!isUpperWrapped() && !CR.isUpperWrapped()) {
476     if (Lower.ult(CR.Lower)) {
477       // L---U       : this
478       //       L---U : CR
479       if (Upper.ule(CR.Lower))
480         return getEmpty();
481 
482       // L---U       : this
483       //   L---U     : CR
484       if (Upper.ult(CR.Upper))
485         return ConstantRange(CR.Lower, Upper);
486 
487       // L-------U   : this
488       //   L---U     : CR
489       return CR;
490     }
491     //   L---U     : this
492     // L-------U   : CR
493     if (Upper.ult(CR.Upper))
494       return *this;
495 
496     //   L-----U   : this
497     // L-----U     : CR
498     if (Lower.ult(CR.Upper))
499       return ConstantRange(Lower, CR.Upper);
500 
501     //       L---U : this
502     // L---U       : CR
503     return getEmpty();
504   }
505 
506   if (isUpperWrapped() && !CR.isUpperWrapped()) {
507     if (CR.Lower.ult(Upper)) {
508       // ------U   L--- : this
509       //  L--U          : CR
510       if (CR.Upper.ult(Upper))
511         return CR;
512 
513       // ------U   L--- : this
514       //  L------U      : CR
515       if (CR.Upper.ule(Lower))
516         return ConstantRange(CR.Lower, Upper);
517 
518       // ------U   L--- : this
519       //  L----------U  : CR
520       return getPreferredRange(*this, CR, Type);
521     }
522     if (CR.Lower.ult(Lower)) {
523       // --U      L---- : this
524       //     L--U       : CR
525       if (CR.Upper.ule(Lower))
526         return getEmpty();
527 
528       // --U      L---- : this
529       //     L------U   : CR
530       return ConstantRange(Lower, CR.Upper);
531     }
532 
533     // --U  L------ : this
534     //        L--U  : CR
535     return CR;
536   }
537 
538   if (CR.Upper.ult(Upper)) {
539     // ------U L-- : this
540     // --U L------ : CR
541     if (CR.Lower.ult(Upper))
542       return getPreferredRange(*this, CR, Type);
543 
544     // ----U   L-- : this
545     // --U   L---- : CR
546     if (CR.Lower.ult(Lower))
547       return ConstantRange(Lower, CR.Upper);
548 
549     // ----U L---- : this
550     // --U     L-- : CR
551     return CR;
552   }
553   if (CR.Upper.ule(Lower)) {
554     // --U     L-- : this
555     // ----U L---- : CR
556     if (CR.Lower.ult(Lower))
557       return *this;
558 
559     // --U   L---- : this
560     // ----U   L-- : CR
561     return ConstantRange(CR.Lower, Upper);
562   }
563 
564   // --U L------ : this
565   // ------U L-- : CR
566   return getPreferredRange(*this, CR, Type);
567 }
568 
unionWith(const ConstantRange & CR,PreferredRangeType Type) const569 ConstantRange ConstantRange::unionWith(const ConstantRange &CR,
570                                        PreferredRangeType Type) const {
571   assert(getBitWidth() == CR.getBitWidth() &&
572          "ConstantRange types don't agree!");
573 
574   if (   isFullSet() || CR.isEmptySet()) return *this;
575   if (CR.isFullSet() ||    isEmptySet()) return CR;
576 
577   if (!isUpperWrapped() && CR.isUpperWrapped())
578     return CR.unionWith(*this, Type);
579 
580   if (!isUpperWrapped() && !CR.isUpperWrapped()) {
581     //        L---U  and  L---U        : this
582     //  L---U                   L---U  : CR
583     // result in one of
584     //  L---------U
585     // -----U L-----
586     if (CR.Upper.ult(Lower) || Upper.ult(CR.Lower))
587       return getPreferredRange(
588           ConstantRange(Lower, CR.Upper), ConstantRange(CR.Lower, Upper), Type);
589 
590     APInt L = CR.Lower.ult(Lower) ? CR.Lower : Lower;
591     APInt U = (CR.Upper - 1).ugt(Upper - 1) ? CR.Upper : Upper;
592 
593     if (L.isNullValue() && U.isNullValue())
594       return getFull();
595 
596     return ConstantRange(std::move(L), std::move(U));
597   }
598 
599   if (!CR.isUpperWrapped()) {
600     // ------U   L-----  and  ------U   L----- : this
601     //   L--U                            L--U  : CR
602     if (CR.Upper.ule(Upper) || CR.Lower.uge(Lower))
603       return *this;
604 
605     // ------U   L----- : this
606     //    L---------U   : CR
607     if (CR.Lower.ule(Upper) && Lower.ule(CR.Upper))
608       return getFull();
609 
610     // ----U       L---- : this
611     //       L---U       : CR
612     // results in one of
613     // ----------U L----
614     // ----U L----------
615     if (Upper.ult(CR.Lower) && CR.Upper.ult(Lower))
616       return getPreferredRange(
617           ConstantRange(Lower, CR.Upper), ConstantRange(CR.Lower, Upper), Type);
618 
619     // ----U     L----- : this
620     //        L----U    : CR
621     if (Upper.ult(CR.Lower) && Lower.ule(CR.Upper))
622       return ConstantRange(CR.Lower, Upper);
623 
624     // ------U    L---- : this
625     //    L-----U       : CR
626     assert(CR.Lower.ule(Upper) && CR.Upper.ult(Lower) &&
627            "ConstantRange::unionWith missed a case with one range wrapped");
628     return ConstantRange(Lower, CR.Upper);
629   }
630 
631   // ------U    L----  and  ------U    L---- : this
632   // -U  L-----------  and  ------------U  L : CR
633   if (CR.Lower.ule(Upper) || Lower.ule(CR.Upper))
634     return getFull();
635 
636   APInt L = CR.Lower.ult(Lower) ? CR.Lower : Lower;
637   APInt U = CR.Upper.ugt(Upper) ? CR.Upper : Upper;
638 
639   return ConstantRange(std::move(L), std::move(U));
640 }
641 
castOp(Instruction::CastOps CastOp,uint32_t ResultBitWidth) const642 ConstantRange ConstantRange::castOp(Instruction::CastOps CastOp,
643                                     uint32_t ResultBitWidth) const {
644   switch (CastOp) {
645   default:
646     llvm_unreachable("unsupported cast type");
647   case Instruction::Trunc:
648     return truncate(ResultBitWidth);
649   case Instruction::SExt:
650     return signExtend(ResultBitWidth);
651   case Instruction::ZExt:
652     return zeroExtend(ResultBitWidth);
653   case Instruction::BitCast:
654     return *this;
655   case Instruction::FPToUI:
656   case Instruction::FPToSI:
657     if (getBitWidth() == ResultBitWidth)
658       return *this;
659     else
660       return getFull(ResultBitWidth);
661   case Instruction::UIToFP: {
662     // TODO: use input range if available
663     auto BW = getBitWidth();
664     APInt Min = APInt::getMinValue(BW).zextOrSelf(ResultBitWidth);
665     APInt Max = APInt::getMaxValue(BW).zextOrSelf(ResultBitWidth);
666     return ConstantRange(std::move(Min), std::move(Max));
667   }
668   case Instruction::SIToFP: {
669     // TODO: use input range if available
670     auto BW = getBitWidth();
671     APInt SMin = APInt::getSignedMinValue(BW).sextOrSelf(ResultBitWidth);
672     APInt SMax = APInt::getSignedMaxValue(BW).sextOrSelf(ResultBitWidth);
673     return ConstantRange(std::move(SMin), std::move(SMax));
674   }
675   case Instruction::FPTrunc:
676   case Instruction::FPExt:
677   case Instruction::IntToPtr:
678   case Instruction::PtrToInt:
679   case Instruction::AddrSpaceCast:
680     // Conservatively return getFull set.
681     return getFull(ResultBitWidth);
682   };
683 }
684 
zeroExtend(uint32_t DstTySize) const685 ConstantRange ConstantRange::zeroExtend(uint32_t DstTySize) const {
686   if (isEmptySet()) return getEmpty(DstTySize);
687 
688   unsigned SrcTySize = getBitWidth();
689   assert(SrcTySize < DstTySize && "Not a value extension");
690   if (isFullSet() || isUpperWrapped()) {
691     // Change into [0, 1 << src bit width)
692     APInt LowerExt(DstTySize, 0);
693     if (!Upper) // special case: [X, 0) -- not really wrapping around
694       LowerExt = Lower.zext(DstTySize);
695     return ConstantRange(std::move(LowerExt),
696                          APInt::getOneBitSet(DstTySize, SrcTySize));
697   }
698 
699   return ConstantRange(Lower.zext(DstTySize), Upper.zext(DstTySize));
700 }
701 
signExtend(uint32_t DstTySize) const702 ConstantRange ConstantRange::signExtend(uint32_t DstTySize) const {
703   if (isEmptySet()) return getEmpty(DstTySize);
704 
705   unsigned SrcTySize = getBitWidth();
706   assert(SrcTySize < DstTySize && "Not a value extension");
707 
708   // special case: [X, INT_MIN) -- not really wrapping around
709   if (Upper.isMinSignedValue())
710     return ConstantRange(Lower.sext(DstTySize), Upper.zext(DstTySize));
711 
712   if (isFullSet() || isSignWrappedSet()) {
713     return ConstantRange(APInt::getHighBitsSet(DstTySize,DstTySize-SrcTySize+1),
714                          APInt::getLowBitsSet(DstTySize, SrcTySize-1) + 1);
715   }
716 
717   return ConstantRange(Lower.sext(DstTySize), Upper.sext(DstTySize));
718 }
719 
truncate(uint32_t DstTySize) const720 ConstantRange ConstantRange::truncate(uint32_t DstTySize) const {
721   assert(getBitWidth() > DstTySize && "Not a value truncation");
722   if (isEmptySet())
723     return getEmpty(DstTySize);
724   if (isFullSet())
725     return getFull(DstTySize);
726 
727   APInt LowerDiv(Lower), UpperDiv(Upper);
728   ConstantRange Union(DstTySize, /*isFullSet=*/false);
729 
730   // Analyze wrapped sets in their two parts: [0, Upper) \/ [Lower, MaxValue]
731   // We use the non-wrapped set code to analyze the [Lower, MaxValue) part, and
732   // then we do the union with [MaxValue, Upper)
733   if (isUpperWrapped()) {
734     // If Upper is greater than or equal to MaxValue(DstTy), it covers the whole
735     // truncated range.
736     if (Upper.getActiveBits() > DstTySize ||
737         Upper.countTrailingOnes() == DstTySize)
738       return getFull(DstTySize);
739 
740     Union = ConstantRange(APInt::getMaxValue(DstTySize),Upper.trunc(DstTySize));
741     UpperDiv.setAllBits();
742 
743     // Union covers the MaxValue case, so return if the remaining range is just
744     // MaxValue(DstTy).
745     if (LowerDiv == UpperDiv)
746       return Union;
747   }
748 
749   // Chop off the most significant bits that are past the destination bitwidth.
750   if (LowerDiv.getActiveBits() > DstTySize) {
751     // Mask to just the signficant bits and subtract from LowerDiv/UpperDiv.
752     APInt Adjust = LowerDiv & APInt::getBitsSetFrom(getBitWidth(), DstTySize);
753     LowerDiv -= Adjust;
754     UpperDiv -= Adjust;
755   }
756 
757   unsigned UpperDivWidth = UpperDiv.getActiveBits();
758   if (UpperDivWidth <= DstTySize)
759     return ConstantRange(LowerDiv.trunc(DstTySize),
760                          UpperDiv.trunc(DstTySize)).unionWith(Union);
761 
762   // The truncated value wraps around. Check if we can do better than fullset.
763   if (UpperDivWidth == DstTySize + 1) {
764     // Clear the MSB so that UpperDiv wraps around.
765     UpperDiv.clearBit(DstTySize);
766     if (UpperDiv.ult(LowerDiv))
767       return ConstantRange(LowerDiv.trunc(DstTySize),
768                            UpperDiv.trunc(DstTySize)).unionWith(Union);
769   }
770 
771   return getFull(DstTySize);
772 }
773 
zextOrTrunc(uint32_t DstTySize) const774 ConstantRange ConstantRange::zextOrTrunc(uint32_t DstTySize) const {
775   unsigned SrcTySize = getBitWidth();
776   if (SrcTySize > DstTySize)
777     return truncate(DstTySize);
778   if (SrcTySize < DstTySize)
779     return zeroExtend(DstTySize);
780   return *this;
781 }
782 
sextOrTrunc(uint32_t DstTySize) const783 ConstantRange ConstantRange::sextOrTrunc(uint32_t DstTySize) const {
784   unsigned SrcTySize = getBitWidth();
785   if (SrcTySize > DstTySize)
786     return truncate(DstTySize);
787   if (SrcTySize < DstTySize)
788     return signExtend(DstTySize);
789   return *this;
790 }
791 
binaryOp(Instruction::BinaryOps BinOp,const ConstantRange & Other) const792 ConstantRange ConstantRange::binaryOp(Instruction::BinaryOps BinOp,
793                                       const ConstantRange &Other) const {
794   assert(Instruction::isBinaryOp(BinOp) && "Binary operators only!");
795 
796   switch (BinOp) {
797   case Instruction::Add:
798     return add(Other);
799   case Instruction::Sub:
800     return sub(Other);
801   case Instruction::Mul:
802     return multiply(Other);
803   case Instruction::UDiv:
804     return udiv(Other);
805   case Instruction::SDiv:
806     return sdiv(Other);
807   case Instruction::URem:
808     return urem(Other);
809   case Instruction::SRem:
810     return srem(Other);
811   case Instruction::Shl:
812     return shl(Other);
813   case Instruction::LShr:
814     return lshr(Other);
815   case Instruction::AShr:
816     return ashr(Other);
817   case Instruction::And:
818     return binaryAnd(Other);
819   case Instruction::Or:
820     return binaryOr(Other);
821   case Instruction::Xor:
822     return binaryXor(Other);
823   // Note: floating point operations applied to abstract ranges are just
824   // ideal integer operations with a lossy representation
825   case Instruction::FAdd:
826     return add(Other);
827   case Instruction::FSub:
828     return sub(Other);
829   case Instruction::FMul:
830     return multiply(Other);
831   default:
832     // Conservatively return getFull set.
833     return getFull();
834   }
835 }
836 
overflowingBinaryOp(Instruction::BinaryOps BinOp,const ConstantRange & Other,unsigned NoWrapKind) const837 ConstantRange ConstantRange::overflowingBinaryOp(Instruction::BinaryOps BinOp,
838                                                  const ConstantRange &Other,
839                                                  unsigned NoWrapKind) const {
840   assert(Instruction::isBinaryOp(BinOp) && "Binary operators only!");
841 
842   switch (BinOp) {
843   case Instruction::Add:
844     return addWithNoWrap(Other, NoWrapKind);
845   case Instruction::Sub:
846     return subWithNoWrap(Other, NoWrapKind);
847   default:
848     // Don't know about this Overflowing Binary Operation.
849     // Conservatively fallback to plain binop handling.
850     return binaryOp(BinOp, Other);
851   }
852 }
853 
isIntrinsicSupported(Intrinsic::ID IntrinsicID)854 bool ConstantRange::isIntrinsicSupported(Intrinsic::ID IntrinsicID) {
855   switch (IntrinsicID) {
856   case Intrinsic::uadd_sat:
857   case Intrinsic::usub_sat:
858   case Intrinsic::sadd_sat:
859   case Intrinsic::ssub_sat:
860   case Intrinsic::umin:
861   case Intrinsic::umax:
862   case Intrinsic::smin:
863   case Intrinsic::smax:
864   case Intrinsic::abs:
865     return true;
866   default:
867     return false;
868   }
869 }
870 
intrinsic(Intrinsic::ID IntrinsicID,ArrayRef<ConstantRange> Ops)871 ConstantRange ConstantRange::intrinsic(Intrinsic::ID IntrinsicID,
872                                        ArrayRef<ConstantRange> Ops) {
873   switch (IntrinsicID) {
874   case Intrinsic::uadd_sat:
875     return Ops[0].uadd_sat(Ops[1]);
876   case Intrinsic::usub_sat:
877     return Ops[0].usub_sat(Ops[1]);
878   case Intrinsic::sadd_sat:
879     return Ops[0].sadd_sat(Ops[1]);
880   case Intrinsic::ssub_sat:
881     return Ops[0].ssub_sat(Ops[1]);
882   case Intrinsic::umin:
883     return Ops[0].umin(Ops[1]);
884   case Intrinsic::umax:
885     return Ops[0].umax(Ops[1]);
886   case Intrinsic::smin:
887     return Ops[0].smin(Ops[1]);
888   case Intrinsic::smax:
889     return Ops[0].smax(Ops[1]);
890   case Intrinsic::abs: {
891     const APInt *IntMinIsPoison = Ops[1].getSingleElement();
892     assert(IntMinIsPoison && "Must be known (immarg)");
893     assert(IntMinIsPoison->getBitWidth() == 1 && "Must be boolean");
894     return Ops[0].abs(IntMinIsPoison->getBoolValue());
895   }
896   default:
897     assert(!isIntrinsicSupported(IntrinsicID) && "Shouldn't be supported");
898     llvm_unreachable("Unsupported intrinsic");
899   }
900 }
901 
902 ConstantRange
add(const ConstantRange & Other) const903 ConstantRange::add(const ConstantRange &Other) const {
904   if (isEmptySet() || Other.isEmptySet())
905     return getEmpty();
906   if (isFullSet() || Other.isFullSet())
907     return getFull();
908 
909   APInt NewLower = getLower() + Other.getLower();
910   APInt NewUpper = getUpper() + Other.getUpper() - 1;
911   if (NewLower == NewUpper)
912     return getFull();
913 
914   ConstantRange X = ConstantRange(std::move(NewLower), std::move(NewUpper));
915   if (X.isSizeStrictlySmallerThan(*this) ||
916       X.isSizeStrictlySmallerThan(Other))
917     // We've wrapped, therefore, full set.
918     return getFull();
919   return X;
920 }
921 
addWithNoWrap(const ConstantRange & Other,unsigned NoWrapKind,PreferredRangeType RangeType) const922 ConstantRange ConstantRange::addWithNoWrap(const ConstantRange &Other,
923                                            unsigned NoWrapKind,
924                                            PreferredRangeType RangeType) const {
925   // Calculate the range for "X + Y" which is guaranteed not to wrap(overflow).
926   // (X is from this, and Y is from Other)
927   if (isEmptySet() || Other.isEmptySet())
928     return getEmpty();
929   if (isFullSet() && Other.isFullSet())
930     return getFull();
931 
932   using OBO = OverflowingBinaryOperator;
933   ConstantRange Result = add(Other);
934 
935   // If an overflow happens for every value pair in these two constant ranges,
936   // we must return Empty set. In this case, we get that for free, because we
937   // get lucky that intersection of add() with uadd_sat()/sadd_sat() results
938   // in an empty set.
939 
940   if (NoWrapKind & OBO::NoSignedWrap)
941     Result = Result.intersectWith(sadd_sat(Other), RangeType);
942 
943   if (NoWrapKind & OBO::NoUnsignedWrap)
944     Result = Result.intersectWith(uadd_sat(Other), RangeType);
945 
946   return Result;
947 }
948 
949 ConstantRange
sub(const ConstantRange & Other) const950 ConstantRange::sub(const ConstantRange &Other) const {
951   if (isEmptySet() || Other.isEmptySet())
952     return getEmpty();
953   if (isFullSet() || Other.isFullSet())
954     return getFull();
955 
956   APInt NewLower = getLower() - Other.getUpper() + 1;
957   APInt NewUpper = getUpper() - Other.getLower();
958   if (NewLower == NewUpper)
959     return getFull();
960 
961   ConstantRange X = ConstantRange(std::move(NewLower), std::move(NewUpper));
962   if (X.isSizeStrictlySmallerThan(*this) ||
963       X.isSizeStrictlySmallerThan(Other))
964     // We've wrapped, therefore, full set.
965     return getFull();
966   return X;
967 }
968 
subWithNoWrap(const ConstantRange & Other,unsigned NoWrapKind,PreferredRangeType RangeType) const969 ConstantRange ConstantRange::subWithNoWrap(const ConstantRange &Other,
970                                            unsigned NoWrapKind,
971                                            PreferredRangeType RangeType) const {
972   // Calculate the range for "X - Y" which is guaranteed not to wrap(overflow).
973   // (X is from this, and Y is from Other)
974   if (isEmptySet() || Other.isEmptySet())
975     return getEmpty();
976   if (isFullSet() && Other.isFullSet())
977     return getFull();
978 
979   using OBO = OverflowingBinaryOperator;
980   ConstantRange Result = sub(Other);
981 
982   // If an overflow happens for every value pair in these two constant ranges,
983   // we must return Empty set. In signed case, we get that for free, because we
984   // get lucky that intersection of sub() with ssub_sat() results in an
985   // empty set. But for unsigned we must perform the overflow check manually.
986 
987   if (NoWrapKind & OBO::NoSignedWrap)
988     Result = Result.intersectWith(ssub_sat(Other), RangeType);
989 
990   if (NoWrapKind & OBO::NoUnsignedWrap) {
991     if (getUnsignedMax().ult(Other.getUnsignedMin()))
992       return getEmpty(); // Always overflows.
993     Result = Result.intersectWith(usub_sat(Other), RangeType);
994   }
995 
996   return Result;
997 }
998 
999 ConstantRange
multiply(const ConstantRange & Other) const1000 ConstantRange::multiply(const ConstantRange &Other) const {
1001   // TODO: If either operand is a single element and the multiply is known to
1002   // be non-wrapping, round the result min and max value to the appropriate
1003   // multiple of that element. If wrapping is possible, at least adjust the
1004   // range according to the greatest power-of-two factor of the single element.
1005 
1006   if (isEmptySet() || Other.isEmptySet())
1007     return getEmpty();
1008 
1009   // Multiplication is signedness-independent. However different ranges can be
1010   // obtained depending on how the input ranges are treated. These different
1011   // ranges are all conservatively correct, but one might be better than the
1012   // other. We calculate two ranges; one treating the inputs as unsigned
1013   // and the other signed, then return the smallest of these ranges.
1014 
1015   // Unsigned range first.
1016   APInt this_min = getUnsignedMin().zext(getBitWidth() * 2);
1017   APInt this_max = getUnsignedMax().zext(getBitWidth() * 2);
1018   APInt Other_min = Other.getUnsignedMin().zext(getBitWidth() * 2);
1019   APInt Other_max = Other.getUnsignedMax().zext(getBitWidth() * 2);
1020 
1021   ConstantRange Result_zext = ConstantRange(this_min * Other_min,
1022                                             this_max * Other_max + 1);
1023   ConstantRange UR = Result_zext.truncate(getBitWidth());
1024 
1025   // If the unsigned range doesn't wrap, and isn't negative then it's a range
1026   // from one positive number to another which is as good as we can generate.
1027   // In this case, skip the extra work of generating signed ranges which aren't
1028   // going to be better than this range.
1029   if (!UR.isUpperWrapped() &&
1030       (UR.getUpper().isNonNegative() || UR.getUpper().isMinSignedValue()))
1031     return UR;
1032 
1033   // Now the signed range. Because we could be dealing with negative numbers
1034   // here, the lower bound is the smallest of the cartesian product of the
1035   // lower and upper ranges; for example:
1036   //   [-1,4) * [-2,3) = min(-1*-2, -1*2, 3*-2, 3*2) = -6.
1037   // Similarly for the upper bound, swapping min for max.
1038 
1039   this_min = getSignedMin().sext(getBitWidth() * 2);
1040   this_max = getSignedMax().sext(getBitWidth() * 2);
1041   Other_min = Other.getSignedMin().sext(getBitWidth() * 2);
1042   Other_max = Other.getSignedMax().sext(getBitWidth() * 2);
1043 
1044   auto L = {this_min * Other_min, this_min * Other_max,
1045             this_max * Other_min, this_max * Other_max};
1046   auto Compare = [](const APInt &A, const APInt &B) { return A.slt(B); };
1047   ConstantRange Result_sext(std::min(L, Compare), std::max(L, Compare) + 1);
1048   ConstantRange SR = Result_sext.truncate(getBitWidth());
1049 
1050   return UR.isSizeStrictlySmallerThan(SR) ? UR : SR;
1051 }
1052 
1053 ConstantRange
smax(const ConstantRange & Other) const1054 ConstantRange::smax(const ConstantRange &Other) const {
1055   // X smax Y is: range(smax(X_smin, Y_smin),
1056   //                    smax(X_smax, Y_smax))
1057   if (isEmptySet() || Other.isEmptySet())
1058     return getEmpty();
1059   APInt NewL = APIntOps::smax(getSignedMin(), Other.getSignedMin());
1060   APInt NewU = APIntOps::smax(getSignedMax(), Other.getSignedMax()) + 1;
1061   return getNonEmpty(std::move(NewL), std::move(NewU));
1062 }
1063 
1064 ConstantRange
umax(const ConstantRange & Other) const1065 ConstantRange::umax(const ConstantRange &Other) const {
1066   // X umax Y is: range(umax(X_umin, Y_umin),
1067   //                    umax(X_umax, Y_umax))
1068   if (isEmptySet() || Other.isEmptySet())
1069     return getEmpty();
1070   APInt NewL = APIntOps::umax(getUnsignedMin(), Other.getUnsignedMin());
1071   APInt NewU = APIntOps::umax(getUnsignedMax(), Other.getUnsignedMax()) + 1;
1072   return getNonEmpty(std::move(NewL), std::move(NewU));
1073 }
1074 
1075 ConstantRange
smin(const ConstantRange & Other) const1076 ConstantRange::smin(const ConstantRange &Other) const {
1077   // X smin Y is: range(smin(X_smin, Y_smin),
1078   //                    smin(X_smax, Y_smax))
1079   if (isEmptySet() || Other.isEmptySet())
1080     return getEmpty();
1081   APInt NewL = APIntOps::smin(getSignedMin(), Other.getSignedMin());
1082   APInt NewU = APIntOps::smin(getSignedMax(), Other.getSignedMax()) + 1;
1083   return getNonEmpty(std::move(NewL), std::move(NewU));
1084 }
1085 
1086 ConstantRange
umin(const ConstantRange & Other) const1087 ConstantRange::umin(const ConstantRange &Other) const {
1088   // X umin Y is: range(umin(X_umin, Y_umin),
1089   //                    umin(X_umax, Y_umax))
1090   if (isEmptySet() || Other.isEmptySet())
1091     return getEmpty();
1092   APInt NewL = APIntOps::umin(getUnsignedMin(), Other.getUnsignedMin());
1093   APInt NewU = APIntOps::umin(getUnsignedMax(), Other.getUnsignedMax()) + 1;
1094   return getNonEmpty(std::move(NewL), std::move(NewU));
1095 }
1096 
1097 ConstantRange
udiv(const ConstantRange & RHS) const1098 ConstantRange::udiv(const ConstantRange &RHS) const {
1099   if (isEmptySet() || RHS.isEmptySet() || RHS.getUnsignedMax().isNullValue())
1100     return getEmpty();
1101 
1102   APInt Lower = getUnsignedMin().udiv(RHS.getUnsignedMax());
1103 
1104   APInt RHS_umin = RHS.getUnsignedMin();
1105   if (RHS_umin.isNullValue()) {
1106     // We want the lowest value in RHS excluding zero. Usually that would be 1
1107     // except for a range in the form of [X, 1) in which case it would be X.
1108     if (RHS.getUpper() == 1)
1109       RHS_umin = RHS.getLower();
1110     else
1111       RHS_umin = 1;
1112   }
1113 
1114   APInt Upper = getUnsignedMax().udiv(RHS_umin) + 1;
1115   return getNonEmpty(std::move(Lower), std::move(Upper));
1116 }
1117 
sdiv(const ConstantRange & RHS) const1118 ConstantRange ConstantRange::sdiv(const ConstantRange &RHS) const {
1119   // We split up the LHS and RHS into positive and negative components
1120   // and then also compute the positive and negative components of the result
1121   // separately by combining division results with the appropriate signs.
1122   APInt Zero = APInt::getNullValue(getBitWidth());
1123   APInt SignedMin = APInt::getSignedMinValue(getBitWidth());
1124   ConstantRange PosFilter(APInt(getBitWidth(), 1), SignedMin);
1125   ConstantRange NegFilter(SignedMin, Zero);
1126   ConstantRange PosL = intersectWith(PosFilter);
1127   ConstantRange NegL = intersectWith(NegFilter);
1128   ConstantRange PosR = RHS.intersectWith(PosFilter);
1129   ConstantRange NegR = RHS.intersectWith(NegFilter);
1130 
1131   ConstantRange PosRes = getEmpty();
1132   if (!PosL.isEmptySet() && !PosR.isEmptySet())
1133     // pos / pos = pos.
1134     PosRes = ConstantRange(PosL.Lower.sdiv(PosR.Upper - 1),
1135                            (PosL.Upper - 1).sdiv(PosR.Lower) + 1);
1136 
1137   if (!NegL.isEmptySet() && !NegR.isEmptySet()) {
1138     // neg / neg = pos.
1139     //
1140     // We need to deal with one tricky case here: SignedMin / -1 is UB on the
1141     // IR level, so we'll want to exclude this case when calculating bounds.
1142     // (For APInts the operation is well-defined and yields SignedMin.) We
1143     // handle this by dropping either SignedMin from the LHS or -1 from the RHS.
1144     APInt Lo = (NegL.Upper - 1).sdiv(NegR.Lower);
1145     if (NegL.Lower.isMinSignedValue() && NegR.Upper.isNullValue()) {
1146       // Remove -1 from the LHS. Skip if it's the only element, as this would
1147       // leave us with an empty set.
1148       if (!NegR.Lower.isAllOnesValue()) {
1149         APInt AdjNegRUpper;
1150         if (RHS.Lower.isAllOnesValue())
1151           // Negative part of [-1, X] without -1 is [SignedMin, X].
1152           AdjNegRUpper = RHS.Upper;
1153         else
1154           // [X, -1] without -1 is [X, -2].
1155           AdjNegRUpper = NegR.Upper - 1;
1156 
1157         PosRes = PosRes.unionWith(
1158             ConstantRange(Lo, NegL.Lower.sdiv(AdjNegRUpper - 1) + 1));
1159       }
1160 
1161       // Remove SignedMin from the RHS. Skip if it's the only element, as this
1162       // would leave us with an empty set.
1163       if (NegL.Upper != SignedMin + 1) {
1164         APInt AdjNegLLower;
1165         if (Upper == SignedMin + 1)
1166           // Negative part of [X, SignedMin] without SignedMin is [X, -1].
1167           AdjNegLLower = Lower;
1168         else
1169           // [SignedMin, X] without SignedMin is [SignedMin + 1, X].
1170           AdjNegLLower = NegL.Lower + 1;
1171 
1172         PosRes = PosRes.unionWith(
1173             ConstantRange(std::move(Lo),
1174                           AdjNegLLower.sdiv(NegR.Upper - 1) + 1));
1175       }
1176     } else {
1177       PosRes = PosRes.unionWith(
1178           ConstantRange(std::move(Lo), NegL.Lower.sdiv(NegR.Upper - 1) + 1));
1179     }
1180   }
1181 
1182   ConstantRange NegRes = getEmpty();
1183   if (!PosL.isEmptySet() && !NegR.isEmptySet())
1184     // pos / neg = neg.
1185     NegRes = ConstantRange((PosL.Upper - 1).sdiv(NegR.Upper - 1),
1186                            PosL.Lower.sdiv(NegR.Lower) + 1);
1187 
1188   if (!NegL.isEmptySet() && !PosR.isEmptySet())
1189     // neg / pos = neg.
1190     NegRes = NegRes.unionWith(
1191         ConstantRange(NegL.Lower.sdiv(PosR.Lower),
1192                       (NegL.Upper - 1).sdiv(PosR.Upper - 1) + 1));
1193 
1194   // Prefer a non-wrapping signed range here.
1195   ConstantRange Res = NegRes.unionWith(PosRes, PreferredRangeType::Signed);
1196 
1197   // Preserve the zero that we dropped when splitting the LHS by sign.
1198   if (contains(Zero) && (!PosR.isEmptySet() || !NegR.isEmptySet()))
1199     Res = Res.unionWith(ConstantRange(Zero));
1200   return Res;
1201 }
1202 
urem(const ConstantRange & RHS) const1203 ConstantRange ConstantRange::urem(const ConstantRange &RHS) const {
1204   if (isEmptySet() || RHS.isEmptySet() || RHS.getUnsignedMax().isNullValue())
1205     return getEmpty();
1206 
1207   // L % R for L < R is L.
1208   if (getUnsignedMax().ult(RHS.getUnsignedMin()))
1209     return *this;
1210 
1211   // L % R is <= L and < R.
1212   APInt Upper = APIntOps::umin(getUnsignedMax(), RHS.getUnsignedMax() - 1) + 1;
1213   return getNonEmpty(APInt::getNullValue(getBitWidth()), std::move(Upper));
1214 }
1215 
srem(const ConstantRange & RHS) const1216 ConstantRange ConstantRange::srem(const ConstantRange &RHS) const {
1217   if (isEmptySet() || RHS.isEmptySet())
1218     return getEmpty();
1219 
1220   ConstantRange AbsRHS = RHS.abs();
1221   APInt MinAbsRHS = AbsRHS.getUnsignedMin();
1222   APInt MaxAbsRHS = AbsRHS.getUnsignedMax();
1223 
1224   // Modulus by zero is UB.
1225   if (MaxAbsRHS.isNullValue())
1226     return getEmpty();
1227 
1228   if (MinAbsRHS.isNullValue())
1229     ++MinAbsRHS;
1230 
1231   APInt MinLHS = getSignedMin(), MaxLHS = getSignedMax();
1232 
1233   if (MinLHS.isNonNegative()) {
1234     // L % R for L < R is L.
1235     if (MaxLHS.ult(MinAbsRHS))
1236       return *this;
1237 
1238     // L % R is <= L and < R.
1239     APInt Upper = APIntOps::umin(MaxLHS, MaxAbsRHS - 1) + 1;
1240     return ConstantRange(APInt::getNullValue(getBitWidth()), std::move(Upper));
1241   }
1242 
1243   // Same basic logic as above, but the result is negative.
1244   if (MaxLHS.isNegative()) {
1245     if (MinLHS.ugt(-MinAbsRHS))
1246       return *this;
1247 
1248     APInt Lower = APIntOps::umax(MinLHS, -MaxAbsRHS + 1);
1249     return ConstantRange(std::move(Lower), APInt(getBitWidth(), 1));
1250   }
1251 
1252   // LHS range crosses zero.
1253   APInt Lower = APIntOps::umax(MinLHS, -MaxAbsRHS + 1);
1254   APInt Upper = APIntOps::umin(MaxLHS, MaxAbsRHS - 1) + 1;
1255   return ConstantRange(std::move(Lower), std::move(Upper));
1256 }
1257 
binaryNot() const1258 ConstantRange ConstantRange::binaryNot() const {
1259   if (isEmptySet())
1260     return getEmpty();
1261 
1262   if (isWrappedSet())
1263     return getFull();
1264 
1265   return ConstantRange(APInt::getAllOnesValue(getBitWidth())).sub(*this);
1266 }
1267 
1268 ConstantRange
binaryAnd(const ConstantRange & Other) const1269 ConstantRange::binaryAnd(const ConstantRange &Other) const {
1270   if (isEmptySet() || Other.isEmptySet())
1271     return getEmpty();
1272 
1273   // Use APInt's implementation of AND for single element ranges.
1274   if (isSingleElement() && Other.isSingleElement())
1275     return {*getSingleElement() & *Other.getSingleElement()};
1276 
1277   // TODO: replace this with something less conservative
1278 
1279   APInt umin = APIntOps::umin(Other.getUnsignedMax(), getUnsignedMax());
1280   return getNonEmpty(APInt::getNullValue(getBitWidth()), std::move(umin) + 1);
1281 }
1282 
1283 ConstantRange
binaryOr(const ConstantRange & Other) const1284 ConstantRange::binaryOr(const ConstantRange &Other) const {
1285   if (isEmptySet() || Other.isEmptySet())
1286     return getEmpty();
1287 
1288   // Use APInt's implementation of OR for single element ranges.
1289   if (isSingleElement() && Other.isSingleElement())
1290     return {*getSingleElement() | *Other.getSingleElement()};
1291 
1292   // TODO: replace this with something less conservative
1293 
1294   APInt umax = APIntOps::umax(getUnsignedMin(), Other.getUnsignedMin());
1295   return getNonEmpty(std::move(umax), APInt::getNullValue(getBitWidth()));
1296 }
1297 
binaryXor(const ConstantRange & Other) const1298 ConstantRange ConstantRange::binaryXor(const ConstantRange &Other) const {
1299   if (isEmptySet() || Other.isEmptySet())
1300     return getEmpty();
1301 
1302   // Use APInt's implementation of XOR for single element ranges.
1303   if (isSingleElement() && Other.isSingleElement())
1304     return {*getSingleElement() ^ *Other.getSingleElement()};
1305 
1306   // Special-case binary complement, since we can give a precise answer.
1307   if (Other.isSingleElement() && Other.getSingleElement()->isAllOnesValue())
1308     return binaryNot();
1309   if (isSingleElement() && getSingleElement()->isAllOnesValue())
1310     return Other.binaryNot();
1311 
1312   // TODO: replace this with something less conservative
1313   return getFull();
1314 }
1315 
1316 ConstantRange
shl(const ConstantRange & Other) const1317 ConstantRange::shl(const ConstantRange &Other) const {
1318   if (isEmptySet() || Other.isEmptySet())
1319     return getEmpty();
1320 
1321   APInt max = getUnsignedMax();
1322   APInt Other_umax = Other.getUnsignedMax();
1323 
1324   // If we are shifting by maximum amount of
1325   // zero return return the original range.
1326   if (Other_umax.isNullValue())
1327     return *this;
1328   // there's overflow!
1329   if (Other_umax.ugt(max.countLeadingZeros()))
1330     return getFull();
1331 
1332   // FIXME: implement the other tricky cases
1333 
1334   APInt min = getUnsignedMin();
1335   min <<= Other.getUnsignedMin();
1336   max <<= Other_umax;
1337 
1338   return ConstantRange(std::move(min), std::move(max) + 1);
1339 }
1340 
1341 ConstantRange
lshr(const ConstantRange & Other) const1342 ConstantRange::lshr(const ConstantRange &Other) const {
1343   if (isEmptySet() || Other.isEmptySet())
1344     return getEmpty();
1345 
1346   APInt max = getUnsignedMax().lshr(Other.getUnsignedMin()) + 1;
1347   APInt min = getUnsignedMin().lshr(Other.getUnsignedMax());
1348   return getNonEmpty(std::move(min), std::move(max));
1349 }
1350 
1351 ConstantRange
ashr(const ConstantRange & Other) const1352 ConstantRange::ashr(const ConstantRange &Other) const {
1353   if (isEmptySet() || Other.isEmptySet())
1354     return getEmpty();
1355 
1356   // May straddle zero, so handle both positive and negative cases.
1357   // 'PosMax' is the upper bound of the result of the ashr
1358   // operation, when Upper of the LHS of ashr is a non-negative.
1359   // number. Since ashr of a non-negative number will result in a
1360   // smaller number, the Upper value of LHS is shifted right with
1361   // the minimum value of 'Other' instead of the maximum value.
1362   APInt PosMax = getSignedMax().ashr(Other.getUnsignedMin()) + 1;
1363 
1364   // 'PosMin' is the lower bound of the result of the ashr
1365   // operation, when Lower of the LHS is a non-negative number.
1366   // Since ashr of a non-negative number will result in a smaller
1367   // number, the Lower value of LHS is shifted right with the
1368   // maximum value of 'Other'.
1369   APInt PosMin = getSignedMin().ashr(Other.getUnsignedMax());
1370 
1371   // 'NegMax' is the upper bound of the result of the ashr
1372   // operation, when Upper of the LHS of ashr is a negative number.
1373   // Since 'ashr' of a negative number will result in a bigger
1374   // number, the Upper value of LHS is shifted right with the
1375   // maximum value of 'Other'.
1376   APInt NegMax = getSignedMax().ashr(Other.getUnsignedMax()) + 1;
1377 
1378   // 'NegMin' is the lower bound of the result of the ashr
1379   // operation, when Lower of the LHS of ashr is a negative number.
1380   // Since 'ashr' of a negative number will result in a bigger
1381   // number, the Lower value of LHS is shifted right with the
1382   // minimum value of 'Other'.
1383   APInt NegMin = getSignedMin().ashr(Other.getUnsignedMin());
1384 
1385   APInt max, min;
1386   if (getSignedMin().isNonNegative()) {
1387     // Upper and Lower of LHS are non-negative.
1388     min = PosMin;
1389     max = PosMax;
1390   } else if (getSignedMax().isNegative()) {
1391     // Upper and Lower of LHS are negative.
1392     min = NegMin;
1393     max = NegMax;
1394   } else {
1395     // Upper is non-negative and Lower is negative.
1396     min = NegMin;
1397     max = PosMax;
1398   }
1399   return getNonEmpty(std::move(min), std::move(max));
1400 }
1401 
uadd_sat(const ConstantRange & Other) const1402 ConstantRange ConstantRange::uadd_sat(const ConstantRange &Other) const {
1403   if (isEmptySet() || Other.isEmptySet())
1404     return getEmpty();
1405 
1406   APInt NewL = getUnsignedMin().uadd_sat(Other.getUnsignedMin());
1407   APInt NewU = getUnsignedMax().uadd_sat(Other.getUnsignedMax()) + 1;
1408   return getNonEmpty(std::move(NewL), std::move(NewU));
1409 }
1410 
sadd_sat(const ConstantRange & Other) const1411 ConstantRange ConstantRange::sadd_sat(const ConstantRange &Other) const {
1412   if (isEmptySet() || Other.isEmptySet())
1413     return getEmpty();
1414 
1415   APInt NewL = getSignedMin().sadd_sat(Other.getSignedMin());
1416   APInt NewU = getSignedMax().sadd_sat(Other.getSignedMax()) + 1;
1417   return getNonEmpty(std::move(NewL), std::move(NewU));
1418 }
1419 
usub_sat(const ConstantRange & Other) const1420 ConstantRange ConstantRange::usub_sat(const ConstantRange &Other) const {
1421   if (isEmptySet() || Other.isEmptySet())
1422     return getEmpty();
1423 
1424   APInt NewL = getUnsignedMin().usub_sat(Other.getUnsignedMax());
1425   APInt NewU = getUnsignedMax().usub_sat(Other.getUnsignedMin()) + 1;
1426   return getNonEmpty(std::move(NewL), std::move(NewU));
1427 }
1428 
ssub_sat(const ConstantRange & Other) const1429 ConstantRange ConstantRange::ssub_sat(const ConstantRange &Other) const {
1430   if (isEmptySet() || Other.isEmptySet())
1431     return getEmpty();
1432 
1433   APInt NewL = getSignedMin().ssub_sat(Other.getSignedMax());
1434   APInt NewU = getSignedMax().ssub_sat(Other.getSignedMin()) + 1;
1435   return getNonEmpty(std::move(NewL), std::move(NewU));
1436 }
1437 
umul_sat(const ConstantRange & Other) const1438 ConstantRange ConstantRange::umul_sat(const ConstantRange &Other) const {
1439   if (isEmptySet() || Other.isEmptySet())
1440     return getEmpty();
1441 
1442   APInt NewL = getUnsignedMin().umul_sat(Other.getUnsignedMin());
1443   APInt NewU = getUnsignedMax().umul_sat(Other.getUnsignedMax()) + 1;
1444   return getNonEmpty(std::move(NewL), std::move(NewU));
1445 }
1446 
smul_sat(const ConstantRange & Other) const1447 ConstantRange ConstantRange::smul_sat(const ConstantRange &Other) const {
1448   if (isEmptySet() || Other.isEmptySet())
1449     return getEmpty();
1450 
1451   // Because we could be dealing with negative numbers here, the lower bound is
1452   // the smallest of the cartesian product of the lower and upper ranges;
1453   // for example:
1454   //   [-1,4) * [-2,3) = min(-1*-2, -1*2, 3*-2, 3*2) = -6.
1455   // Similarly for the upper bound, swapping min for max.
1456 
1457   APInt this_min = getSignedMin().sext(getBitWidth() * 2);
1458   APInt this_max = getSignedMax().sext(getBitWidth() * 2);
1459   APInt Other_min = Other.getSignedMin().sext(getBitWidth() * 2);
1460   APInt Other_max = Other.getSignedMax().sext(getBitWidth() * 2);
1461 
1462   auto L = {this_min * Other_min, this_min * Other_max, this_max * Other_min,
1463             this_max * Other_max};
1464   auto Compare = [](const APInt &A, const APInt &B) { return A.slt(B); };
1465 
1466   // Note that we wanted to perform signed saturating multiplication,
1467   // so since we performed plain multiplication in twice the bitwidth,
1468   // we need to perform signed saturating truncation.
1469   return getNonEmpty(std::min(L, Compare).truncSSat(getBitWidth()),
1470                      std::max(L, Compare).truncSSat(getBitWidth()) + 1);
1471 }
1472 
ushl_sat(const ConstantRange & Other) const1473 ConstantRange ConstantRange::ushl_sat(const ConstantRange &Other) const {
1474   if (isEmptySet() || Other.isEmptySet())
1475     return getEmpty();
1476 
1477   APInt NewL = getUnsignedMin().ushl_sat(Other.getUnsignedMin());
1478   APInt NewU = getUnsignedMax().ushl_sat(Other.getUnsignedMax()) + 1;
1479   return getNonEmpty(std::move(NewL), std::move(NewU));
1480 }
1481 
sshl_sat(const ConstantRange & Other) const1482 ConstantRange ConstantRange::sshl_sat(const ConstantRange &Other) const {
1483   if (isEmptySet() || Other.isEmptySet())
1484     return getEmpty();
1485 
1486   APInt Min = getSignedMin(), Max = getSignedMax();
1487   APInt ShAmtMin = Other.getUnsignedMin(), ShAmtMax = Other.getUnsignedMax();
1488   APInt NewL = Min.sshl_sat(Min.isNonNegative() ? ShAmtMin : ShAmtMax);
1489   APInt NewU = Max.sshl_sat(Max.isNegative() ? ShAmtMin : ShAmtMax) + 1;
1490   return getNonEmpty(std::move(NewL), std::move(NewU));
1491 }
1492 
inverse() const1493 ConstantRange ConstantRange::inverse() const {
1494   if (isFullSet())
1495     return getEmpty();
1496   if (isEmptySet())
1497     return getFull();
1498   return ConstantRange(Upper, Lower);
1499 }
1500 
abs(bool IntMinIsPoison) const1501 ConstantRange ConstantRange::abs(bool IntMinIsPoison) const {
1502   if (isEmptySet())
1503     return getEmpty();
1504 
1505   if (isSignWrappedSet()) {
1506     APInt Lo;
1507     // Check whether the range crosses zero.
1508     if (Upper.isStrictlyPositive() || !Lower.isStrictlyPositive())
1509       Lo = APInt::getNullValue(getBitWidth());
1510     else
1511       Lo = APIntOps::umin(Lower, -Upper + 1);
1512 
1513     // If SignedMin is not poison, then it is included in the result range.
1514     if (IntMinIsPoison)
1515       return ConstantRange(Lo, APInt::getSignedMinValue(getBitWidth()));
1516     else
1517       return ConstantRange(Lo, APInt::getSignedMinValue(getBitWidth()) + 1);
1518   }
1519 
1520   APInt SMin = getSignedMin(), SMax = getSignedMax();
1521 
1522   // Skip SignedMin if it is poison.
1523   if (IntMinIsPoison && SMin.isMinSignedValue()) {
1524     // The range may become empty if it *only* contains SignedMin.
1525     if (SMax.isMinSignedValue())
1526       return getEmpty();
1527     ++SMin;
1528   }
1529 
1530   // All non-negative.
1531   if (SMin.isNonNegative())
1532     return *this;
1533 
1534   // All negative.
1535   if (SMax.isNegative())
1536     return ConstantRange(-SMax, -SMin + 1);
1537 
1538   // Range crosses zero.
1539   return ConstantRange(APInt::getNullValue(getBitWidth()),
1540                        APIntOps::umax(-SMin, SMax) + 1);
1541 }
1542 
unsignedAddMayOverflow(const ConstantRange & Other) const1543 ConstantRange::OverflowResult ConstantRange::unsignedAddMayOverflow(
1544     const ConstantRange &Other) const {
1545   if (isEmptySet() || Other.isEmptySet())
1546     return OverflowResult::MayOverflow;
1547 
1548   APInt Min = getUnsignedMin(), Max = getUnsignedMax();
1549   APInt OtherMin = Other.getUnsignedMin(), OtherMax = Other.getUnsignedMax();
1550 
1551   // a u+ b overflows high iff a u> ~b.
1552   if (Min.ugt(~OtherMin))
1553     return OverflowResult::AlwaysOverflowsHigh;
1554   if (Max.ugt(~OtherMax))
1555     return OverflowResult::MayOverflow;
1556   return OverflowResult::NeverOverflows;
1557 }
1558 
signedAddMayOverflow(const ConstantRange & Other) const1559 ConstantRange::OverflowResult ConstantRange::signedAddMayOverflow(
1560     const ConstantRange &Other) const {
1561   if (isEmptySet() || Other.isEmptySet())
1562     return OverflowResult::MayOverflow;
1563 
1564   APInt Min = getSignedMin(), Max = getSignedMax();
1565   APInt OtherMin = Other.getSignedMin(), OtherMax = Other.getSignedMax();
1566 
1567   APInt SignedMin = APInt::getSignedMinValue(getBitWidth());
1568   APInt SignedMax = APInt::getSignedMaxValue(getBitWidth());
1569 
1570   // a s+ b overflows high iff a s>=0 && b s>= 0 && a s> smax - b.
1571   // a s+ b overflows low iff a s< 0 && b s< 0 && a s< smin - b.
1572   if (Min.isNonNegative() && OtherMin.isNonNegative() &&
1573       Min.sgt(SignedMax - OtherMin))
1574     return OverflowResult::AlwaysOverflowsHigh;
1575   if (Max.isNegative() && OtherMax.isNegative() &&
1576       Max.slt(SignedMin - OtherMax))
1577     return OverflowResult::AlwaysOverflowsLow;
1578 
1579   if (Max.isNonNegative() && OtherMax.isNonNegative() &&
1580       Max.sgt(SignedMax - OtherMax))
1581     return OverflowResult::MayOverflow;
1582   if (Min.isNegative() && OtherMin.isNegative() &&
1583       Min.slt(SignedMin - OtherMin))
1584     return OverflowResult::MayOverflow;
1585 
1586   return OverflowResult::NeverOverflows;
1587 }
1588 
unsignedSubMayOverflow(const ConstantRange & Other) const1589 ConstantRange::OverflowResult ConstantRange::unsignedSubMayOverflow(
1590     const ConstantRange &Other) const {
1591   if (isEmptySet() || Other.isEmptySet())
1592     return OverflowResult::MayOverflow;
1593 
1594   APInt Min = getUnsignedMin(), Max = getUnsignedMax();
1595   APInt OtherMin = Other.getUnsignedMin(), OtherMax = Other.getUnsignedMax();
1596 
1597   // a u- b overflows low iff a u< b.
1598   if (Max.ult(OtherMin))
1599     return OverflowResult::AlwaysOverflowsLow;
1600   if (Min.ult(OtherMax))
1601     return OverflowResult::MayOverflow;
1602   return OverflowResult::NeverOverflows;
1603 }
1604 
signedSubMayOverflow(const ConstantRange & Other) const1605 ConstantRange::OverflowResult ConstantRange::signedSubMayOverflow(
1606     const ConstantRange &Other) const {
1607   if (isEmptySet() || Other.isEmptySet())
1608     return OverflowResult::MayOverflow;
1609 
1610   APInt Min = getSignedMin(), Max = getSignedMax();
1611   APInt OtherMin = Other.getSignedMin(), OtherMax = Other.getSignedMax();
1612 
1613   APInt SignedMin = APInt::getSignedMinValue(getBitWidth());
1614   APInt SignedMax = APInt::getSignedMaxValue(getBitWidth());
1615 
1616   // a s- b overflows high iff a s>=0 && b s< 0 && a s> smax + b.
1617   // a s- b overflows low iff a s< 0 && b s>= 0 && a s< smin + b.
1618   if (Min.isNonNegative() && OtherMax.isNegative() &&
1619       Min.sgt(SignedMax + OtherMax))
1620     return OverflowResult::AlwaysOverflowsHigh;
1621   if (Max.isNegative() && OtherMin.isNonNegative() &&
1622       Max.slt(SignedMin + OtherMin))
1623     return OverflowResult::AlwaysOverflowsLow;
1624 
1625   if (Max.isNonNegative() && OtherMin.isNegative() &&
1626       Max.sgt(SignedMax + OtherMin))
1627     return OverflowResult::MayOverflow;
1628   if (Min.isNegative() && OtherMax.isNonNegative() &&
1629       Min.slt(SignedMin + OtherMax))
1630     return OverflowResult::MayOverflow;
1631 
1632   return OverflowResult::NeverOverflows;
1633 }
1634 
unsignedMulMayOverflow(const ConstantRange & Other) const1635 ConstantRange::OverflowResult ConstantRange::unsignedMulMayOverflow(
1636     const ConstantRange &Other) const {
1637   if (isEmptySet() || Other.isEmptySet())
1638     return OverflowResult::MayOverflow;
1639 
1640   APInt Min = getUnsignedMin(), Max = getUnsignedMax();
1641   APInt OtherMin = Other.getUnsignedMin(), OtherMax = Other.getUnsignedMax();
1642   bool Overflow;
1643 
1644   (void) Min.umul_ov(OtherMin, Overflow);
1645   if (Overflow)
1646     return OverflowResult::AlwaysOverflowsHigh;
1647 
1648   (void) Max.umul_ov(OtherMax, Overflow);
1649   if (Overflow)
1650     return OverflowResult::MayOverflow;
1651 
1652   return OverflowResult::NeverOverflows;
1653 }
1654 
print(raw_ostream & OS) const1655 void ConstantRange::print(raw_ostream &OS) const {
1656   if (isFullSet())
1657     OS << "full-set";
1658   else if (isEmptySet())
1659     OS << "empty-set";
1660   else
1661     OS << "[" << Lower << "," << Upper << ")";
1662 }
1663 
1664 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
dump() const1665 LLVM_DUMP_METHOD void ConstantRange::dump() const {
1666   print(dbgs());
1667 }
1668 #endif
1669 
getConstantRangeFromMetadata(const MDNode & Ranges)1670 ConstantRange llvm::getConstantRangeFromMetadata(const MDNode &Ranges) {
1671   const unsigned NumRanges = Ranges.getNumOperands() / 2;
1672   assert(NumRanges >= 1 && "Must have at least one range!");
1673   assert(Ranges.getNumOperands() % 2 == 0 && "Must be a sequence of pairs");
1674 
1675   auto *FirstLow = mdconst::extract<ConstantInt>(Ranges.getOperand(0));
1676   auto *FirstHigh = mdconst::extract<ConstantInt>(Ranges.getOperand(1));
1677 
1678   ConstantRange CR(FirstLow->getValue(), FirstHigh->getValue());
1679 
1680   for (unsigned i = 1; i < NumRanges; ++i) {
1681     auto *Low = mdconst::extract<ConstantInt>(Ranges.getOperand(2 * i + 0));
1682     auto *High = mdconst::extract<ConstantInt>(Ranges.getOperand(2 * i + 1));
1683 
1684     // Note: unionWith will potentially create a range that contains values not
1685     // contained in any of the original N ranges.
1686     CR = CR.unionWith(ConstantRange(Low->getValue(), High->getValue()));
1687   }
1688 
1689   return CR;
1690 }
1691