[llvm-exegesis] Fix missing std::move.
[llvm-complete.git] / lib / IR / ConstantRange.cpp
blob39a0b13c4e0c005d8ec2a3d914830d633ecfb484
1 //===- ConstantRange.cpp - ConstantRange implementation -------------------===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // Represent a range of possible values that may occur when the program is run
11 // for an integral value. This keeps track of a lower and upper bound for the
12 // constant, which MAY wrap around the end of the numeric range. To do this, it
13 // keeps track of a [lower, upper) bound, which specifies an interval just like
14 // STL iterators. When used with boolean values, the following are important
15 // ranges (other integral ranges use min/max values for special range values):
17 // [F, F) = {} = Empty set
18 // [T, F) = {T}
19 // [F, T) = {F}
20 // [T, T) = {F, T} = Full set
22 //===----------------------------------------------------------------------===//
24 #include "llvm/ADT/APInt.h"
25 #include "llvm/Config/llvm-config.h"
26 #include "llvm/IR/ConstantRange.h"
27 #include "llvm/IR/Constants.h"
28 #include "llvm/IR/InstrTypes.h"
29 #include "llvm/IR/Instruction.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/raw_ostream.h"
36 #include <algorithm>
37 #include <cassert>
38 #include <cstdint>
40 using namespace llvm;
42 ConstantRange::ConstantRange(uint32_t BitWidth, bool Full)
43 : Lower(Full ? APInt::getMaxValue(BitWidth) : APInt::getMinValue(BitWidth)),
44 Upper(Lower) {}
46 ConstantRange::ConstantRange(APInt V)
47 : Lower(std::move(V)), Upper(Lower + 1) {}
49 ConstantRange::ConstantRange(APInt L, APInt U)
50 : Lower(std::move(L)), Upper(std::move(U)) {
51 assert(Lower.getBitWidth() == Upper.getBitWidth() &&
52 "ConstantRange with unequal bit widths");
53 assert((Lower != Upper || (Lower.isMaxValue() || Lower.isMinValue())) &&
54 "Lower == Upper, but they aren't min or max value!");
57 ConstantRange ConstantRange::makeAllowedICmpRegion(CmpInst::Predicate Pred,
58 const ConstantRange &CR) {
59 if (CR.isEmptySet())
60 return CR;
62 uint32_t W = CR.getBitWidth();
63 switch (Pred) {
64 default:
65 llvm_unreachable("Invalid ICmp predicate to makeAllowedICmpRegion()");
66 case CmpInst::ICMP_EQ:
67 return CR;
68 case CmpInst::ICMP_NE:
69 if (CR.isSingleElement())
70 return ConstantRange(CR.getUpper(), CR.getLower());
71 return ConstantRange(W);
72 case CmpInst::ICMP_ULT: {
73 APInt UMax(CR.getUnsignedMax());
74 if (UMax.isMinValue())
75 return ConstantRange(W, /* empty */ false);
76 return ConstantRange(APInt::getMinValue(W), std::move(UMax));
78 case CmpInst::ICMP_SLT: {
79 APInt SMax(CR.getSignedMax());
80 if (SMax.isMinSignedValue())
81 return ConstantRange(W, /* empty */ false);
82 return ConstantRange(APInt::getSignedMinValue(W), std::move(SMax));
84 case CmpInst::ICMP_ULE: {
85 APInt UMax(CR.getUnsignedMax());
86 if (UMax.isMaxValue())
87 return ConstantRange(W);
88 return ConstantRange(APInt::getMinValue(W), std::move(UMax) + 1);
90 case CmpInst::ICMP_SLE: {
91 APInt SMax(CR.getSignedMax());
92 if (SMax.isMaxSignedValue())
93 return ConstantRange(W);
94 return ConstantRange(APInt::getSignedMinValue(W), std::move(SMax) + 1);
96 case CmpInst::ICMP_UGT: {
97 APInt UMin(CR.getUnsignedMin());
98 if (UMin.isMaxValue())
99 return ConstantRange(W, /* empty */ false);
100 return ConstantRange(std::move(UMin) + 1, APInt::getNullValue(W));
102 case CmpInst::ICMP_SGT: {
103 APInt SMin(CR.getSignedMin());
104 if (SMin.isMaxSignedValue())
105 return ConstantRange(W, /* empty */ false);
106 return ConstantRange(std::move(SMin) + 1, APInt::getSignedMinValue(W));
108 case CmpInst::ICMP_UGE: {
109 APInt UMin(CR.getUnsignedMin());
110 if (UMin.isMinValue())
111 return ConstantRange(W);
112 return ConstantRange(std::move(UMin), APInt::getNullValue(W));
114 case CmpInst::ICMP_SGE: {
115 APInt SMin(CR.getSignedMin());
116 if (SMin.isMinSignedValue())
117 return ConstantRange(W);
118 return ConstantRange(std::move(SMin), APInt::getSignedMinValue(W));
123 ConstantRange ConstantRange::makeSatisfyingICmpRegion(CmpInst::Predicate Pred,
124 const ConstantRange &CR) {
125 // Follows from De-Morgan's laws:
127 // ~(~A union ~B) == A intersect B.
129 return makeAllowedICmpRegion(CmpInst::getInversePredicate(Pred), CR)
130 .inverse();
133 ConstantRange ConstantRange::makeExactICmpRegion(CmpInst::Predicate Pred,
134 const APInt &C) {
135 // Computes the exact range that is equal to both the constant ranges returned
136 // by makeAllowedICmpRegion and makeSatisfyingICmpRegion. This is always true
137 // when RHS is a singleton such as an APInt and so the assert is valid.
138 // However for non-singleton RHS, for example ult [2,5) makeAllowedICmpRegion
139 // returns [0,4) but makeSatisfyICmpRegion returns [0,2).
141 assert(makeAllowedICmpRegion(Pred, C) == makeSatisfyingICmpRegion(Pred, C));
142 return makeAllowedICmpRegion(Pred, C);
145 bool ConstantRange::getEquivalentICmp(CmpInst::Predicate &Pred,
146 APInt &RHS) const {
147 bool Success = false;
149 if (isFullSet() || isEmptySet()) {
150 Pred = isEmptySet() ? CmpInst::ICMP_ULT : CmpInst::ICMP_UGE;
151 RHS = APInt(getBitWidth(), 0);
152 Success = true;
153 } else if (auto *OnlyElt = getSingleElement()) {
154 Pred = CmpInst::ICMP_EQ;
155 RHS = *OnlyElt;
156 Success = true;
157 } else if (auto *OnlyMissingElt = getSingleMissingElement()) {
158 Pred = CmpInst::ICMP_NE;
159 RHS = *OnlyMissingElt;
160 Success = true;
161 } else if (getLower().isMinSignedValue() || getLower().isMinValue()) {
162 Pred =
163 getLower().isMinSignedValue() ? CmpInst::ICMP_SLT : CmpInst::ICMP_ULT;
164 RHS = getUpper();
165 Success = true;
166 } else if (getUpper().isMinSignedValue() || getUpper().isMinValue()) {
167 Pred =
168 getUpper().isMinSignedValue() ? CmpInst::ICMP_SGE : CmpInst::ICMP_UGE;
169 RHS = getLower();
170 Success = true;
173 assert((!Success || ConstantRange::makeExactICmpRegion(Pred, RHS) == *this) &&
174 "Bad result!");
176 return Success;
179 ConstantRange
180 ConstantRange::makeGuaranteedNoWrapRegion(Instruction::BinaryOps BinOp,
181 const ConstantRange &Other,
182 unsigned NoWrapKind) {
183 using OBO = OverflowingBinaryOperator;
185 // Computes the intersection of CR0 and CR1. It is different from
186 // intersectWith in that the ConstantRange returned will only contain elements
187 // in both CR0 and CR1 (i.e. SubsetIntersect(X, Y) is a *subset*, proper or
188 // not, of both X and Y).
189 auto SubsetIntersect =
190 [](const ConstantRange &CR0, const ConstantRange &CR1) {
191 return CR0.inverse().unionWith(CR1.inverse()).inverse();
194 assert(Instruction::isBinaryOp(BinOp) && "Binary operators only!");
196 assert((NoWrapKind == OBO::NoSignedWrap ||
197 NoWrapKind == OBO::NoUnsignedWrap ||
198 NoWrapKind == (OBO::NoUnsignedWrap | OBO::NoSignedWrap)) &&
199 "NoWrapKind invalid!");
201 unsigned BitWidth = Other.getBitWidth();
202 ConstantRange Result(BitWidth);
204 switch (BinOp) {
205 default:
206 // Conservative answer: empty set
207 return ConstantRange(BitWidth, false);
209 case Instruction::Add:
210 if (auto *C = Other.getSingleElement())
211 if (C->isNullValue())
212 // Full set: nothing signed / unsigned wraps when added to 0.
213 return ConstantRange(BitWidth);
214 if (NoWrapKind & OBO::NoUnsignedWrap)
215 Result =
216 SubsetIntersect(Result, ConstantRange(APInt::getNullValue(BitWidth),
217 -Other.getUnsignedMax()));
218 if (NoWrapKind & OBO::NoSignedWrap) {
219 const APInt &SignedMin = Other.getSignedMin();
220 const APInt &SignedMax = Other.getSignedMax();
221 if (SignedMax.isStrictlyPositive())
222 Result = SubsetIntersect(
223 Result,
224 ConstantRange(APInt::getSignedMinValue(BitWidth),
225 APInt::getSignedMinValue(BitWidth) - SignedMax));
226 if (SignedMin.isNegative())
227 Result = SubsetIntersect(
228 Result,
229 ConstantRange(APInt::getSignedMinValue(BitWidth) - SignedMin,
230 APInt::getSignedMinValue(BitWidth)));
232 return Result;
234 case Instruction::Sub:
235 if (auto *C = Other.getSingleElement())
236 if (C->isNullValue())
237 // Full set: nothing signed / unsigned wraps when subtracting 0.
238 return ConstantRange(BitWidth);
239 if (NoWrapKind & OBO::NoUnsignedWrap)
240 Result =
241 SubsetIntersect(Result, ConstantRange(Other.getUnsignedMax(),
242 APInt::getMinValue(BitWidth)));
243 if (NoWrapKind & OBO::NoSignedWrap) {
244 const APInt &SignedMin = Other.getSignedMin();
245 const APInt &SignedMax = Other.getSignedMax();
246 if (SignedMax.isStrictlyPositive())
247 Result = SubsetIntersect(
248 Result,
249 ConstantRange(APInt::getSignedMinValue(BitWidth) + SignedMax,
250 APInt::getSignedMinValue(BitWidth)));
251 if (SignedMin.isNegative())
252 Result = SubsetIntersect(
253 Result,
254 ConstantRange(APInt::getSignedMinValue(BitWidth),
255 APInt::getSignedMinValue(BitWidth) + SignedMin));
257 return Result;
258 case Instruction::Mul: {
259 if (NoWrapKind == (OBO::NoSignedWrap | OBO::NoUnsignedWrap)) {
260 return SubsetIntersect(
261 makeGuaranteedNoWrapRegion(BinOp, Other, OBO::NoSignedWrap),
262 makeGuaranteedNoWrapRegion(BinOp, Other, OBO::NoUnsignedWrap));
265 // Equivalent to calling makeGuaranteedNoWrapRegion() on [V, V+1).
266 const bool Unsigned = NoWrapKind == OBO::NoUnsignedWrap;
267 const auto makeSingleValueRegion = [Unsigned,
268 BitWidth](APInt V) -> ConstantRange {
269 // Handle special case for 0, -1 and 1. See the last for reason why we
270 // specialize -1 and 1.
271 if (V == 0 || V.isOneValue())
272 return ConstantRange(BitWidth, true);
274 APInt MinValue, MaxValue;
275 if (Unsigned) {
276 MinValue = APInt::getMinValue(BitWidth);
277 MaxValue = APInt::getMaxValue(BitWidth);
278 } else {
279 MinValue = APInt::getSignedMinValue(BitWidth);
280 MaxValue = APInt::getSignedMaxValue(BitWidth);
282 // e.g. Returning [-127, 127], represented as [-127, -128).
283 if (!Unsigned && V.isAllOnesValue())
284 return ConstantRange(-MaxValue, MinValue);
286 APInt Lower, Upper;
287 if (!Unsigned && V.isNegative()) {
288 Lower = APIntOps::RoundingSDiv(MaxValue, V, APInt::Rounding::UP);
289 Upper = APIntOps::RoundingSDiv(MinValue, V, APInt::Rounding::DOWN);
290 } else if (Unsigned) {
291 Lower = APIntOps::RoundingUDiv(MinValue, V, APInt::Rounding::UP);
292 Upper = APIntOps::RoundingUDiv(MaxValue, V, APInt::Rounding::DOWN);
293 } else {
294 Lower = APIntOps::RoundingSDiv(MinValue, V, APInt::Rounding::UP);
295 Upper = APIntOps::RoundingSDiv(MaxValue, V, APInt::Rounding::DOWN);
297 if (Unsigned) {
298 Lower = Lower.zextOrSelf(BitWidth);
299 Upper = Upper.zextOrSelf(BitWidth);
300 } else {
301 Lower = Lower.sextOrSelf(BitWidth);
302 Upper = Upper.sextOrSelf(BitWidth);
304 // ConstantRange ctor take a half inclusive interval [Lower, Upper + 1).
305 // Upper + 1 is guanranteed not to overflow, because |divisor| > 1. 0, -1,
306 // and 1 are already handled as special cases.
307 return ConstantRange(Lower, Upper + 1);
310 if (Unsigned)
311 return makeSingleValueRegion(Other.getUnsignedMax());
313 return SubsetIntersect(makeSingleValueRegion(Other.getSignedMin()),
314 makeSingleValueRegion(Other.getSignedMax()));
319 bool ConstantRange::isFullSet() const {
320 return Lower == Upper && Lower.isMaxValue();
323 bool ConstantRange::isEmptySet() const {
324 return Lower == Upper && Lower.isMinValue();
327 bool ConstantRange::isWrappedSet() const {
328 return Lower.ugt(Upper);
331 bool ConstantRange::isSignWrappedSet() const {
332 return contains(APInt::getSignedMaxValue(getBitWidth())) &&
333 contains(APInt::getSignedMinValue(getBitWidth()));
336 APInt ConstantRange::getSetSize() const {
337 if (isFullSet())
338 return APInt::getOneBitSet(getBitWidth()+1, getBitWidth());
340 // This is also correct for wrapped sets.
341 return (Upper - Lower).zext(getBitWidth()+1);
344 bool
345 ConstantRange::isSizeStrictlySmallerThan(const ConstantRange &Other) const {
346 assert(getBitWidth() == Other.getBitWidth());
347 if (isFullSet())
348 return false;
349 if (Other.isFullSet())
350 return true;
351 return (Upper - Lower).ult(Other.Upper - Other.Lower);
354 bool
355 ConstantRange::isSizeLargerThan(uint64_t MaxSize) const {
356 assert(MaxSize && "MaxSize can't be 0.");
357 // If this a full set, we need special handling to avoid needing an extra bit
358 // to represent the size.
359 if (isFullSet())
360 return APInt::getMaxValue(getBitWidth()).ugt(MaxSize - 1);
362 return (Upper - Lower).ugt(MaxSize);
365 APInt ConstantRange::getUnsignedMax() const {
366 if (isFullSet() || isWrappedSet())
367 return APInt::getMaxValue(getBitWidth());
368 return getUpper() - 1;
371 APInt ConstantRange::getUnsignedMin() const {
372 if (isFullSet() || (isWrappedSet() && !getUpper().isNullValue()))
373 return APInt::getMinValue(getBitWidth());
374 return getLower();
377 APInt ConstantRange::getSignedMax() const {
378 if (isFullSet() || Lower.sgt(Upper))
379 return APInt::getSignedMaxValue(getBitWidth());
380 return getUpper() - 1;
383 APInt ConstantRange::getSignedMin() const {
384 if (isFullSet() || (Lower.sgt(Upper) && !getUpper().isMinSignedValue()))
385 return APInt::getSignedMinValue(getBitWidth());
386 return getLower();
389 bool ConstantRange::contains(const APInt &V) const {
390 if (Lower == Upper)
391 return isFullSet();
393 if (!isWrappedSet())
394 return Lower.ule(V) && V.ult(Upper);
395 return Lower.ule(V) || V.ult(Upper);
398 bool ConstantRange::contains(const ConstantRange &Other) const {
399 if (isFullSet() || Other.isEmptySet()) return true;
400 if (isEmptySet() || Other.isFullSet()) return false;
402 if (!isWrappedSet()) {
403 if (Other.isWrappedSet())
404 return false;
406 return Lower.ule(Other.getLower()) && Other.getUpper().ule(Upper);
409 if (!Other.isWrappedSet())
410 return Other.getUpper().ule(Upper) ||
411 Lower.ule(Other.getLower());
413 return Other.getUpper().ule(Upper) && Lower.ule(Other.getLower());
416 ConstantRange ConstantRange::subtract(const APInt &Val) const {
417 assert(Val.getBitWidth() == getBitWidth() && "Wrong bit width");
418 // If the set is empty or full, don't modify the endpoints.
419 if (Lower == Upper)
420 return *this;
421 return ConstantRange(Lower - Val, Upper - Val);
424 ConstantRange ConstantRange::difference(const ConstantRange &CR) const {
425 return intersectWith(CR.inverse());
428 ConstantRange ConstantRange::intersectWith(const ConstantRange &CR) const {
429 assert(getBitWidth() == CR.getBitWidth() &&
430 "ConstantRange types don't agree!");
432 // Handle common cases.
433 if ( isEmptySet() || CR.isFullSet()) return *this;
434 if (CR.isEmptySet() || isFullSet()) return CR;
436 if (!isWrappedSet() && CR.isWrappedSet())
437 return CR.intersectWith(*this);
439 if (!isWrappedSet() && !CR.isWrappedSet()) {
440 if (Lower.ult(CR.Lower)) {
441 if (Upper.ule(CR.Lower))
442 return ConstantRange(getBitWidth(), false);
444 if (Upper.ult(CR.Upper))
445 return ConstantRange(CR.Lower, Upper);
447 return CR;
449 if (Upper.ult(CR.Upper))
450 return *this;
452 if (Lower.ult(CR.Upper))
453 return ConstantRange(Lower, CR.Upper);
455 return ConstantRange(getBitWidth(), false);
458 if (isWrappedSet() && !CR.isWrappedSet()) {
459 if (CR.Lower.ult(Upper)) {
460 if (CR.Upper.ult(Upper))
461 return CR;
463 if (CR.Upper.ule(Lower))
464 return ConstantRange(CR.Lower, Upper);
466 if (isSizeStrictlySmallerThan(CR))
467 return *this;
468 return CR;
470 if (CR.Lower.ult(Lower)) {
471 if (CR.Upper.ule(Lower))
472 return ConstantRange(getBitWidth(), false);
474 return ConstantRange(Lower, CR.Upper);
476 return CR;
479 if (CR.Upper.ult(Upper)) {
480 if (CR.Lower.ult(Upper)) {
481 if (isSizeStrictlySmallerThan(CR))
482 return *this;
483 return CR;
486 if (CR.Lower.ult(Lower))
487 return ConstantRange(Lower, CR.Upper);
489 return CR;
491 if (CR.Upper.ule(Lower)) {
492 if (CR.Lower.ult(Lower))
493 return *this;
495 return ConstantRange(CR.Lower, Upper);
497 if (isSizeStrictlySmallerThan(CR))
498 return *this;
499 return CR;
502 ConstantRange ConstantRange::unionWith(const ConstantRange &CR) const {
503 assert(getBitWidth() == CR.getBitWidth() &&
504 "ConstantRange types don't agree!");
506 if ( isFullSet() || CR.isEmptySet()) return *this;
507 if (CR.isFullSet() || isEmptySet()) return CR;
509 if (!isWrappedSet() && CR.isWrappedSet()) return CR.unionWith(*this);
511 if (!isWrappedSet() && !CR.isWrappedSet()) {
512 if (CR.Upper.ult(Lower) || Upper.ult(CR.Lower)) {
513 // If the two ranges are disjoint, find the smaller gap and bridge it.
514 APInt d1 = CR.Lower - Upper, d2 = Lower - CR.Upper;
515 if (d1.ult(d2))
516 return ConstantRange(Lower, CR.Upper);
517 return ConstantRange(CR.Lower, Upper);
520 APInt L = CR.Lower.ult(Lower) ? CR.Lower : Lower;
521 APInt U = (CR.Upper - 1).ugt(Upper - 1) ? CR.Upper : Upper;
523 if (L.isNullValue() && U.isNullValue())
524 return ConstantRange(getBitWidth());
526 return ConstantRange(std::move(L), std::move(U));
529 if (!CR.isWrappedSet()) {
530 // ------U L----- and ------U L----- : this
531 // L--U L--U : CR
532 if (CR.Upper.ule(Upper) || CR.Lower.uge(Lower))
533 return *this;
535 // ------U L----- : this
536 // L---------U : CR
537 if (CR.Lower.ule(Upper) && Lower.ule(CR.Upper))
538 return ConstantRange(getBitWidth());
540 // ----U L---- : this
541 // L---U : CR
542 // <d1> <d2>
543 if (Upper.ule(CR.Lower) && CR.Upper.ule(Lower)) {
544 APInt d1 = CR.Lower - Upper, d2 = Lower - CR.Upper;
545 if (d1.ult(d2))
546 return ConstantRange(Lower, CR.Upper);
547 return ConstantRange(CR.Lower, Upper);
550 // ----U L----- : this
551 // L----U : CR
552 if (Upper.ult(CR.Lower) && Lower.ult(CR.Upper))
553 return ConstantRange(CR.Lower, Upper);
555 // ------U L---- : this
556 // L-----U : CR
557 assert(CR.Lower.ult(Upper) && CR.Upper.ult(Lower) &&
558 "ConstantRange::unionWith missed a case with one range wrapped");
559 return ConstantRange(Lower, CR.Upper);
562 // ------U L---- and ------U L---- : this
563 // -U L----------- and ------------U L : CR
564 if (CR.Lower.ule(Upper) || Lower.ule(CR.Upper))
565 return ConstantRange(getBitWidth());
567 APInt L = CR.Lower.ult(Lower) ? CR.Lower : Lower;
568 APInt U = CR.Upper.ugt(Upper) ? CR.Upper : Upper;
570 return ConstantRange(std::move(L), std::move(U));
573 ConstantRange ConstantRange::castOp(Instruction::CastOps CastOp,
574 uint32_t ResultBitWidth) const {
575 switch (CastOp) {
576 default:
577 llvm_unreachable("unsupported cast type");
578 case Instruction::Trunc:
579 return truncate(ResultBitWidth);
580 case Instruction::SExt:
581 return signExtend(ResultBitWidth);
582 case Instruction::ZExt:
583 return zeroExtend(ResultBitWidth);
584 case Instruction::BitCast:
585 return *this;
586 case Instruction::FPToUI:
587 case Instruction::FPToSI:
588 if (getBitWidth() == ResultBitWidth)
589 return *this;
590 else
591 return ConstantRange(getBitWidth(), /*isFullSet=*/true);
592 case Instruction::UIToFP: {
593 // TODO: use input range if available
594 auto BW = getBitWidth();
595 APInt Min = APInt::getMinValue(BW).zextOrSelf(ResultBitWidth);
596 APInt Max = APInt::getMaxValue(BW).zextOrSelf(ResultBitWidth);
597 return ConstantRange(std::move(Min), std::move(Max));
599 case Instruction::SIToFP: {
600 // TODO: use input range if available
601 auto BW = getBitWidth();
602 APInt SMin = APInt::getSignedMinValue(BW).sextOrSelf(ResultBitWidth);
603 APInt SMax = APInt::getSignedMaxValue(BW).sextOrSelf(ResultBitWidth);
604 return ConstantRange(std::move(SMin), std::move(SMax));
606 case Instruction::FPTrunc:
607 case Instruction::FPExt:
608 case Instruction::IntToPtr:
609 case Instruction::PtrToInt:
610 case Instruction::AddrSpaceCast:
611 // Conservatively return full set.
612 return ConstantRange(getBitWidth(), /*isFullSet=*/true);
616 ConstantRange ConstantRange::zeroExtend(uint32_t DstTySize) const {
617 if (isEmptySet()) return ConstantRange(DstTySize, /*isFullSet=*/false);
619 unsigned SrcTySize = getBitWidth();
620 assert(SrcTySize < DstTySize && "Not a value extension");
621 if (isFullSet() || isWrappedSet()) {
622 // Change into [0, 1 << src bit width)
623 APInt LowerExt(DstTySize, 0);
624 if (!Upper) // special case: [X, 0) -- not really wrapping around
625 LowerExt = Lower.zext(DstTySize);
626 return ConstantRange(std::move(LowerExt),
627 APInt::getOneBitSet(DstTySize, SrcTySize));
630 return ConstantRange(Lower.zext(DstTySize), Upper.zext(DstTySize));
633 ConstantRange ConstantRange::signExtend(uint32_t DstTySize) const {
634 if (isEmptySet()) return ConstantRange(DstTySize, /*isFullSet=*/false);
636 unsigned SrcTySize = getBitWidth();
637 assert(SrcTySize < DstTySize && "Not a value extension");
639 // special case: [X, INT_MIN) -- not really wrapping around
640 if (Upper.isMinSignedValue())
641 return ConstantRange(Lower.sext(DstTySize), Upper.zext(DstTySize));
643 if (isFullSet() || isSignWrappedSet()) {
644 return ConstantRange(APInt::getHighBitsSet(DstTySize,DstTySize-SrcTySize+1),
645 APInt::getLowBitsSet(DstTySize, SrcTySize-1) + 1);
648 return ConstantRange(Lower.sext(DstTySize), Upper.sext(DstTySize));
651 ConstantRange ConstantRange::truncate(uint32_t DstTySize) const {
652 assert(getBitWidth() > DstTySize && "Not a value truncation");
653 if (isEmptySet())
654 return ConstantRange(DstTySize, /*isFullSet=*/false);
655 if (isFullSet())
656 return ConstantRange(DstTySize, /*isFullSet=*/true);
658 APInt LowerDiv(Lower), UpperDiv(Upper);
659 ConstantRange Union(DstTySize, /*isFullSet=*/false);
661 // Analyze wrapped sets in their two parts: [0, Upper) \/ [Lower, MaxValue]
662 // We use the non-wrapped set code to analyze the [Lower, MaxValue) part, and
663 // then we do the union with [MaxValue, Upper)
664 if (isWrappedSet()) {
665 // If Upper is greater than or equal to MaxValue(DstTy), it covers the whole
666 // truncated range.
667 if (Upper.getActiveBits() > DstTySize ||
668 Upper.countTrailingOnes() == DstTySize)
669 return ConstantRange(DstTySize, /*isFullSet=*/true);
671 Union = ConstantRange(APInt::getMaxValue(DstTySize),Upper.trunc(DstTySize));
672 UpperDiv.setAllBits();
674 // Union covers the MaxValue case, so return if the remaining range is just
675 // MaxValue(DstTy).
676 if (LowerDiv == UpperDiv)
677 return Union;
680 // Chop off the most significant bits that are past the destination bitwidth.
681 if (LowerDiv.getActiveBits() > DstTySize) {
682 // Mask to just the signficant bits and subtract from LowerDiv/UpperDiv.
683 APInt Adjust = LowerDiv & APInt::getBitsSetFrom(getBitWidth(), DstTySize);
684 LowerDiv -= Adjust;
685 UpperDiv -= Adjust;
688 unsigned UpperDivWidth = UpperDiv.getActiveBits();
689 if (UpperDivWidth <= DstTySize)
690 return ConstantRange(LowerDiv.trunc(DstTySize),
691 UpperDiv.trunc(DstTySize)).unionWith(Union);
693 // The truncated value wraps around. Check if we can do better than fullset.
694 if (UpperDivWidth == DstTySize + 1) {
695 // Clear the MSB so that UpperDiv wraps around.
696 UpperDiv.clearBit(DstTySize);
697 if (UpperDiv.ult(LowerDiv))
698 return ConstantRange(LowerDiv.trunc(DstTySize),
699 UpperDiv.trunc(DstTySize)).unionWith(Union);
702 return ConstantRange(DstTySize, /*isFullSet=*/true);
705 ConstantRange ConstantRange::zextOrTrunc(uint32_t DstTySize) const {
706 unsigned SrcTySize = getBitWidth();
707 if (SrcTySize > DstTySize)
708 return truncate(DstTySize);
709 if (SrcTySize < DstTySize)
710 return zeroExtend(DstTySize);
711 return *this;
714 ConstantRange ConstantRange::sextOrTrunc(uint32_t DstTySize) const {
715 unsigned SrcTySize = getBitWidth();
716 if (SrcTySize > DstTySize)
717 return truncate(DstTySize);
718 if (SrcTySize < DstTySize)
719 return signExtend(DstTySize);
720 return *this;
723 ConstantRange ConstantRange::binaryOp(Instruction::BinaryOps BinOp,
724 const ConstantRange &Other) const {
725 assert(Instruction::isBinaryOp(BinOp) && "Binary operators only!");
727 switch (BinOp) {
728 case Instruction::Add:
729 return add(Other);
730 case Instruction::Sub:
731 return sub(Other);
732 case Instruction::Mul:
733 return multiply(Other);
734 case Instruction::UDiv:
735 return udiv(Other);
736 case Instruction::Shl:
737 return shl(Other);
738 case Instruction::LShr:
739 return lshr(Other);
740 case Instruction::AShr:
741 return ashr(Other);
742 case Instruction::And:
743 return binaryAnd(Other);
744 case Instruction::Or:
745 return binaryOr(Other);
746 // Note: floating point operations applied to abstract ranges are just
747 // ideal integer operations with a lossy representation
748 case Instruction::FAdd:
749 return add(Other);
750 case Instruction::FSub:
751 return sub(Other);
752 case Instruction::FMul:
753 return multiply(Other);
754 default:
755 // Conservatively return full set.
756 return ConstantRange(getBitWidth(), /*isFullSet=*/true);
760 ConstantRange
761 ConstantRange::add(const ConstantRange &Other) const {
762 if (isEmptySet() || Other.isEmptySet())
763 return ConstantRange(getBitWidth(), /*isFullSet=*/false);
764 if (isFullSet() || Other.isFullSet())
765 return ConstantRange(getBitWidth(), /*isFullSet=*/true);
767 APInt NewLower = getLower() + Other.getLower();
768 APInt NewUpper = getUpper() + Other.getUpper() - 1;
769 if (NewLower == NewUpper)
770 return ConstantRange(getBitWidth(), /*isFullSet=*/true);
772 ConstantRange X = ConstantRange(std::move(NewLower), std::move(NewUpper));
773 if (X.isSizeStrictlySmallerThan(*this) ||
774 X.isSizeStrictlySmallerThan(Other))
775 // We've wrapped, therefore, full set.
776 return ConstantRange(getBitWidth(), /*isFullSet=*/true);
777 return X;
780 ConstantRange ConstantRange::addWithNoSignedWrap(const APInt &Other) const {
781 // Calculate the subset of this range such that "X + Other" is
782 // guaranteed not to wrap (overflow) for all X in this subset.
783 // makeGuaranteedNoWrapRegion will produce an exact NSW range since we are
784 // passing a single element range.
785 auto NSWRange = ConstantRange::makeGuaranteedNoWrapRegion(BinaryOperator::Add,
786 ConstantRange(Other),
787 OverflowingBinaryOperator::NoSignedWrap);
788 auto NSWConstrainedRange = intersectWith(NSWRange);
790 return NSWConstrainedRange.add(ConstantRange(Other));
793 ConstantRange
794 ConstantRange::sub(const ConstantRange &Other) const {
795 if (isEmptySet() || Other.isEmptySet())
796 return ConstantRange(getBitWidth(), /*isFullSet=*/false);
797 if (isFullSet() || Other.isFullSet())
798 return ConstantRange(getBitWidth(), /*isFullSet=*/true);
800 APInt NewLower = getLower() - Other.getUpper() + 1;
801 APInt NewUpper = getUpper() - Other.getLower();
802 if (NewLower == NewUpper)
803 return ConstantRange(getBitWidth(), /*isFullSet=*/true);
805 ConstantRange X = ConstantRange(std::move(NewLower), std::move(NewUpper));
806 if (X.isSizeStrictlySmallerThan(*this) ||
807 X.isSizeStrictlySmallerThan(Other))
808 // We've wrapped, therefore, full set.
809 return ConstantRange(getBitWidth(), /*isFullSet=*/true);
810 return X;
813 ConstantRange
814 ConstantRange::multiply(const ConstantRange &Other) const {
815 // TODO: If either operand is a single element and the multiply is known to
816 // be non-wrapping, round the result min and max value to the appropriate
817 // multiple of that element. If wrapping is possible, at least adjust the
818 // range according to the greatest power-of-two factor of the single element.
820 if (isEmptySet() || Other.isEmptySet())
821 return ConstantRange(getBitWidth(), /*isFullSet=*/false);
823 // Multiplication is signedness-independent. However different ranges can be
824 // obtained depending on how the input ranges are treated. These different
825 // ranges are all conservatively correct, but one might be better than the
826 // other. We calculate two ranges; one treating the inputs as unsigned
827 // and the other signed, then return the smallest of these ranges.
829 // Unsigned range first.
830 APInt this_min = getUnsignedMin().zext(getBitWidth() * 2);
831 APInt this_max = getUnsignedMax().zext(getBitWidth() * 2);
832 APInt Other_min = Other.getUnsignedMin().zext(getBitWidth() * 2);
833 APInt Other_max = Other.getUnsignedMax().zext(getBitWidth() * 2);
835 ConstantRange Result_zext = ConstantRange(this_min * Other_min,
836 this_max * Other_max + 1);
837 ConstantRange UR = Result_zext.truncate(getBitWidth());
839 // If the unsigned range doesn't wrap, and isn't negative then it's a range
840 // from one positive number to another which is as good as we can generate.
841 // In this case, skip the extra work of generating signed ranges which aren't
842 // going to be better than this range.
843 if (!UR.isWrappedSet() &&
844 (UR.getUpper().isNonNegative() || UR.getUpper().isMinSignedValue()))
845 return UR;
847 // Now the signed range. Because we could be dealing with negative numbers
848 // here, the lower bound is the smallest of the cartesian product of the
849 // lower and upper ranges; for example:
850 // [-1,4) * [-2,3) = min(-1*-2, -1*2, 3*-2, 3*2) = -6.
851 // Similarly for the upper bound, swapping min for max.
853 this_min = getSignedMin().sext(getBitWidth() * 2);
854 this_max = getSignedMax().sext(getBitWidth() * 2);
855 Other_min = Other.getSignedMin().sext(getBitWidth() * 2);
856 Other_max = Other.getSignedMax().sext(getBitWidth() * 2);
858 auto L = {this_min * Other_min, this_min * Other_max,
859 this_max * Other_min, this_max * Other_max};
860 auto Compare = [](const APInt &A, const APInt &B) { return A.slt(B); };
861 ConstantRange Result_sext(std::min(L, Compare), std::max(L, Compare) + 1);
862 ConstantRange SR = Result_sext.truncate(getBitWidth());
864 return UR.isSizeStrictlySmallerThan(SR) ? UR : SR;
867 ConstantRange
868 ConstantRange::smax(const ConstantRange &Other) const {
869 // X smax Y is: range(smax(X_smin, Y_smin),
870 // smax(X_smax, Y_smax))
871 if (isEmptySet() || Other.isEmptySet())
872 return ConstantRange(getBitWidth(), /*isFullSet=*/false);
873 APInt NewL = APIntOps::smax(getSignedMin(), Other.getSignedMin());
874 APInt NewU = APIntOps::smax(getSignedMax(), Other.getSignedMax()) + 1;
875 if (NewU == NewL)
876 return ConstantRange(getBitWidth(), /*isFullSet=*/true);
877 return ConstantRange(std::move(NewL), std::move(NewU));
880 ConstantRange
881 ConstantRange::umax(const ConstantRange &Other) const {
882 // X umax Y is: range(umax(X_umin, Y_umin),
883 // umax(X_umax, Y_umax))
884 if (isEmptySet() || Other.isEmptySet())
885 return ConstantRange(getBitWidth(), /*isFullSet=*/false);
886 APInt NewL = APIntOps::umax(getUnsignedMin(), Other.getUnsignedMin());
887 APInt NewU = APIntOps::umax(getUnsignedMax(), Other.getUnsignedMax()) + 1;
888 if (NewU == NewL)
889 return ConstantRange(getBitWidth(), /*isFullSet=*/true);
890 return ConstantRange(std::move(NewL), std::move(NewU));
893 ConstantRange
894 ConstantRange::smin(const ConstantRange &Other) const {
895 // X smin Y is: range(smin(X_smin, Y_smin),
896 // smin(X_smax, Y_smax))
897 if (isEmptySet() || Other.isEmptySet())
898 return ConstantRange(getBitWidth(), /*isFullSet=*/false);
899 APInt NewL = APIntOps::smin(getSignedMin(), Other.getSignedMin());
900 APInt NewU = APIntOps::smin(getSignedMax(), Other.getSignedMax()) + 1;
901 if (NewU == NewL)
902 return ConstantRange(getBitWidth(), /*isFullSet=*/true);
903 return ConstantRange(std::move(NewL), std::move(NewU));
906 ConstantRange
907 ConstantRange::umin(const ConstantRange &Other) const {
908 // X umin Y is: range(umin(X_umin, Y_umin),
909 // umin(X_umax, Y_umax))
910 if (isEmptySet() || Other.isEmptySet())
911 return ConstantRange(getBitWidth(), /*isFullSet=*/false);
912 APInt NewL = APIntOps::umin(getUnsignedMin(), Other.getUnsignedMin());
913 APInt NewU = APIntOps::umin(getUnsignedMax(), Other.getUnsignedMax()) + 1;
914 if (NewU == NewL)
915 return ConstantRange(getBitWidth(), /*isFullSet=*/true);
916 return ConstantRange(std::move(NewL), std::move(NewU));
919 ConstantRange
920 ConstantRange::udiv(const ConstantRange &RHS) const {
921 if (isEmptySet() || RHS.isEmptySet() || RHS.getUnsignedMax().isNullValue())
922 return ConstantRange(getBitWidth(), /*isFullSet=*/false);
923 if (RHS.isFullSet())
924 return ConstantRange(getBitWidth(), /*isFullSet=*/true);
926 APInt Lower = getUnsignedMin().udiv(RHS.getUnsignedMax());
928 APInt RHS_umin = RHS.getUnsignedMin();
929 if (RHS_umin.isNullValue()) {
930 // We want the lowest value in RHS excluding zero. Usually that would be 1
931 // except for a range in the form of [X, 1) in which case it would be X.
932 if (RHS.getUpper() == 1)
933 RHS_umin = RHS.getLower();
934 else
935 RHS_umin = 1;
938 APInt Upper = getUnsignedMax().udiv(RHS_umin) + 1;
940 // If the LHS is Full and the RHS is a wrapped interval containing 1 then
941 // this could occur.
942 if (Lower == Upper)
943 return ConstantRange(getBitWidth(), /*isFullSet=*/true);
945 return ConstantRange(std::move(Lower), std::move(Upper));
948 ConstantRange
949 ConstantRange::binaryAnd(const ConstantRange &Other) const {
950 if (isEmptySet() || Other.isEmptySet())
951 return ConstantRange(getBitWidth(), /*isFullSet=*/false);
953 // TODO: replace this with something less conservative
955 APInt umin = APIntOps::umin(Other.getUnsignedMax(), getUnsignedMax());
956 if (umin.isAllOnesValue())
957 return ConstantRange(getBitWidth(), /*isFullSet=*/true);
958 return ConstantRange(APInt::getNullValue(getBitWidth()), std::move(umin) + 1);
961 ConstantRange
962 ConstantRange::binaryOr(const ConstantRange &Other) const {
963 if (isEmptySet() || Other.isEmptySet())
964 return ConstantRange(getBitWidth(), /*isFullSet=*/false);
966 // TODO: replace this with something less conservative
968 APInt umax = APIntOps::umax(getUnsignedMin(), Other.getUnsignedMin());
969 if (umax.isNullValue())
970 return ConstantRange(getBitWidth(), /*isFullSet=*/true);
971 return ConstantRange(std::move(umax), APInt::getNullValue(getBitWidth()));
974 ConstantRange
975 ConstantRange::shl(const ConstantRange &Other) const {
976 if (isEmptySet() || Other.isEmptySet())
977 return ConstantRange(getBitWidth(), /*isFullSet=*/false);
979 APInt max = getUnsignedMax();
980 APInt Other_umax = Other.getUnsignedMax();
982 // there's overflow!
983 if (Other_umax.uge(max.countLeadingZeros()))
984 return ConstantRange(getBitWidth(), /*isFullSet=*/true);
986 // FIXME: implement the other tricky cases
988 APInt min = getUnsignedMin();
989 min <<= Other.getUnsignedMin();
990 max <<= Other_umax;
992 return ConstantRange(std::move(min), std::move(max) + 1);
995 ConstantRange
996 ConstantRange::lshr(const ConstantRange &Other) const {
997 if (isEmptySet() || Other.isEmptySet())
998 return ConstantRange(getBitWidth(), /*isFullSet=*/false);
1000 APInt max = getUnsignedMax().lshr(Other.getUnsignedMin()) + 1;
1001 APInt min = getUnsignedMin().lshr(Other.getUnsignedMax());
1002 if (min == max)
1003 return ConstantRange(getBitWidth(), /*isFullSet=*/true);
1005 return ConstantRange(std::move(min), std::move(max));
1008 ConstantRange
1009 ConstantRange::ashr(const ConstantRange &Other) const {
1010 if (isEmptySet() || Other.isEmptySet())
1011 return ConstantRange(getBitWidth(), /*isFullSet=*/false);
1013 // May straddle zero, so handle both positive and negative cases.
1014 // 'PosMax' is the upper bound of the result of the ashr
1015 // operation, when Upper of the LHS of ashr is a non-negative.
1016 // number. Since ashr of a non-negative number will result in a
1017 // smaller number, the Upper value of LHS is shifted right with
1018 // the minimum value of 'Other' instead of the maximum value.
1019 APInt PosMax = getSignedMax().ashr(Other.getUnsignedMin()) + 1;
1021 // 'PosMin' is the lower bound of the result of the ashr
1022 // operation, when Lower of the LHS is a non-negative number.
1023 // Since ashr of a non-negative number will result in a smaller
1024 // number, the Lower value of LHS is shifted right with the
1025 // maximum value of 'Other'.
1026 APInt PosMin = getSignedMin().ashr(Other.getUnsignedMax());
1028 // 'NegMax' is the upper bound of the result of the ashr
1029 // operation, when Upper of the LHS of ashr is a negative number.
1030 // Since 'ashr' of a negative number will result in a bigger
1031 // number, the Upper value of LHS is shifted right with the
1032 // maximum value of 'Other'.
1033 APInt NegMax = getSignedMax().ashr(Other.getUnsignedMax()) + 1;
1035 // 'NegMin' is the lower bound of the result of the ashr
1036 // operation, when Lower of the LHS of ashr is a negative number.
1037 // Since 'ashr' of a negative number will result in a bigger
1038 // number, the Lower value of LHS is shifted right with the
1039 // minimum value of 'Other'.
1040 APInt NegMin = getSignedMin().ashr(Other.getUnsignedMin());
1042 APInt max, min;
1043 if (getSignedMin().isNonNegative()) {
1044 // Upper and Lower of LHS are non-negative.
1045 min = PosMin;
1046 max = PosMax;
1047 } else if (getSignedMax().isNegative()) {
1048 // Upper and Lower of LHS are negative.
1049 min = NegMin;
1050 max = NegMax;
1051 } else {
1052 // Upper is non-negative and Lower is negative.
1053 min = NegMin;
1054 max = PosMax;
1056 if (min == max)
1057 return ConstantRange(getBitWidth(), /*isFullSet=*/true);
1059 return ConstantRange(std::move(min), std::move(max));
1062 ConstantRange ConstantRange::inverse() const {
1063 if (isFullSet())
1064 return ConstantRange(getBitWidth(), /*isFullSet=*/false);
1065 if (isEmptySet())
1066 return ConstantRange(getBitWidth(), /*isFullSet=*/true);
1067 return ConstantRange(Upper, Lower);
1070 void ConstantRange::print(raw_ostream &OS) const {
1071 if (isFullSet())
1072 OS << "full-set";
1073 else if (isEmptySet())
1074 OS << "empty-set";
1075 else
1076 OS << "[" << Lower << "," << Upper << ")";
1079 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
1080 LLVM_DUMP_METHOD void ConstantRange::dump() const {
1081 print(dbgs());
1083 #endif
1085 ConstantRange llvm::getConstantRangeFromMetadata(const MDNode &Ranges) {
1086 const unsigned NumRanges = Ranges.getNumOperands() / 2;
1087 assert(NumRanges >= 1 && "Must have at least one range!");
1088 assert(Ranges.getNumOperands() % 2 == 0 && "Must be a sequence of pairs");
1090 auto *FirstLow = mdconst::extract<ConstantInt>(Ranges.getOperand(0));
1091 auto *FirstHigh = mdconst::extract<ConstantInt>(Ranges.getOperand(1));
1093 ConstantRange CR(FirstLow->getValue(), FirstHigh->getValue());
1095 for (unsigned i = 1; i < NumRanges; ++i) {
1096 auto *Low = mdconst::extract<ConstantInt>(Ranges.getOperand(2 * i + 0));
1097 auto *High = mdconst::extract<ConstantInt>(Ranges.getOperand(2 * i + 1));
1099 // Note: unionWith will potentially create a range that contains values not
1100 // contained in any of the original N ranges.
1101 CR = CR.unionWith(ConstantRange(Low->getValue(), High->getValue()));
1104 return CR;