2315 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8//9// Represent a range of possible values that may occur when the program is run10// for an integral value. This keeps track of a lower and upper bound for the11// constant, which MAY wrap around the end of the numeric range. To do this, it12// keeps track of a [lower, upper) bound, which specifies an interval just like13// STL iterators. When used with boolean values, the following are important14// ranges (other integral ranges use min/max values for special range values):15//16// [F, F) = {} = Empty set17// [T, F) = {T}18// [F, T) = {F}19// [T, T) = {F, T} = Full set20//21//===----------------------------------------------------------------------===//22 23#include "llvm/IR/ConstantRange.h"24#include "llvm/ADT/APInt.h"25#include "llvm/Config/llvm-config.h"26#include "llvm/IR/Constants.h"27#include "llvm/IR/InstrTypes.h"28#include "llvm/IR/Instruction.h"29#include "llvm/IR/Instructions.h"30#include "llvm/IR/Intrinsics.h"31#include "llvm/IR/Metadata.h"32#include "llvm/IR/Operator.h"33#include "llvm/Support/Compiler.h"34#include "llvm/Support/Debug.h"35#include "llvm/Support/ErrorHandling.h"36#include "llvm/Support/KnownBits.h"37#include "llvm/Support/raw_ostream.h"38#include <algorithm>39#include <cassert>40#include <cstdint>41#include <optional>42 43using namespace llvm;44 45ConstantRange::ConstantRange(uint32_t BitWidth, bool Full)46 : Lower(Full ? APInt::getMaxValue(BitWidth) : APInt::getMinValue(BitWidth)),47 Upper(Lower) {}48 49ConstantRange::ConstantRange(APInt V)50 : Lower(std::move(V)), Upper(Lower + 1) {}51 52ConstantRange::ConstantRange(APInt L, APInt U)53 : Lower(std::move(L)), Upper(std::move(U)) {54 assert(Lower.getBitWidth() == Upper.getBitWidth() &&55 "ConstantRange with unequal bit widths");56 assert((Lower != Upper || (Lower.isMaxValue() || Lower.isMinValue())) &&57 "Lower == Upper, but they aren't min or max value!");58}59 60ConstantRange ConstantRange::fromKnownBits(const KnownBits &Known,61 bool IsSigned) {62 if (Known.hasConflict())63 return getEmpty(Known.getBitWidth());64 if (Known.isUnknown())65 return getFull(Known.getBitWidth());66 67 // For unsigned ranges, or signed ranges with known sign bit, create a simple68 // range between the smallest and largest possible value.69 if (!IsSigned || Known.isNegative() || Known.isNonNegative())70 return ConstantRange(Known.getMinValue(), Known.getMaxValue() + 1);71 72 // If we don't know the sign bit, pick the lower bound as a negative number73 // and the upper bound as a non-negative one.74 APInt Lower = Known.getMinValue(), Upper = Known.getMaxValue();75 Lower.setSignBit();76 Upper.clearSignBit();77 return ConstantRange(Lower, Upper + 1);78}79 80KnownBits ConstantRange::toKnownBits() const {81 // TODO: We could return conflicting known bits here, but consumers are82 // likely not prepared for that.83 if (isEmptySet())84 return KnownBits(getBitWidth());85 86 // We can only retain the top bits that are the same between min and max.87 APInt Min = getUnsignedMin();88 APInt Max = getUnsignedMax();89 KnownBits Known = KnownBits::makeConstant(Min);90 if (std::optional<unsigned> DifferentBit =91 APIntOps::GetMostSignificantDifferentBit(Min, Max)) {92 Known.Zero.clearLowBits(*DifferentBit + 1);93 Known.One.clearLowBits(*DifferentBit + 1);94 }95 return Known;96}97 98std::pair<ConstantRange, ConstantRange> ConstantRange::splitPosNeg() const {99 uint32_t BW = getBitWidth();100 APInt Zero = APInt::getZero(BW), One = APInt(BW, 1);101 APInt SignedMin = APInt::getSignedMinValue(BW);102 // There are no positive 1-bit values. The 1 would get interpreted as -1.103 ConstantRange PosFilter =104 BW == 1 ? getEmpty() : ConstantRange(One, SignedMin);105 ConstantRange NegFilter(SignedMin, Zero);106 return {intersectWith(PosFilter), intersectWith(NegFilter)};107}108 109ConstantRange ConstantRange::makeAllowedICmpRegion(CmpInst::Predicate Pred,110 const ConstantRange &CR) {111 if (CR.isEmptySet())112 return CR;113 114 uint32_t W = CR.getBitWidth();115 switch (Pred) {116 default:117 llvm_unreachable("Invalid ICmp predicate to makeAllowedICmpRegion()");118 case CmpInst::ICMP_EQ:119 return CR;120 case CmpInst::ICMP_NE:121 if (CR.isSingleElement())122 return ConstantRange(CR.getUpper(), CR.getLower());123 return getFull(W);124 case CmpInst::ICMP_ULT: {125 APInt UMax(CR.getUnsignedMax());126 if (UMax.isMinValue())127 return getEmpty(W);128 return ConstantRange(APInt::getMinValue(W), std::move(UMax));129 }130 case CmpInst::ICMP_SLT: {131 APInt SMax(CR.getSignedMax());132 if (SMax.isMinSignedValue())133 return getEmpty(W);134 return ConstantRange(APInt::getSignedMinValue(W), std::move(SMax));135 }136 case CmpInst::ICMP_ULE:137 return getNonEmpty(APInt::getMinValue(W), CR.getUnsignedMax() + 1);138 case CmpInst::ICMP_SLE:139 return getNonEmpty(APInt::getSignedMinValue(W), CR.getSignedMax() + 1);140 case CmpInst::ICMP_UGT: {141 APInt UMin(CR.getUnsignedMin());142 if (UMin.isMaxValue())143 return getEmpty(W);144 return ConstantRange(std::move(UMin) + 1, APInt::getZero(W));145 }146 case CmpInst::ICMP_SGT: {147 APInt SMin(CR.getSignedMin());148 if (SMin.isMaxSignedValue())149 return getEmpty(W);150 return ConstantRange(std::move(SMin) + 1, APInt::getSignedMinValue(W));151 }152 case CmpInst::ICMP_UGE:153 return getNonEmpty(CR.getUnsignedMin(), APInt::getZero(W));154 case CmpInst::ICMP_SGE:155 return getNonEmpty(CR.getSignedMin(), APInt::getSignedMinValue(W));156 }157}158 159ConstantRange ConstantRange::makeSatisfyingICmpRegion(CmpInst::Predicate Pred,160 const ConstantRange &CR) {161 // Follows from De-Morgan's laws:162 //163 // ~(~A union ~B) == A intersect B.164 //165 return makeAllowedICmpRegion(CmpInst::getInversePredicate(Pred), CR)166 .inverse();167}168 169ConstantRange ConstantRange::makeExactICmpRegion(CmpInst::Predicate Pred,170 const APInt &C) {171 // Computes the exact range that is equal to both the constant ranges returned172 // by makeAllowedICmpRegion and makeSatisfyingICmpRegion. This is always true173 // when RHS is a singleton such as an APInt. However for non-singleton RHS,174 // for example ult [2,5) makeAllowedICmpRegion returns [0,4) but175 // makeSatisfyICmpRegion returns [0,2).176 //177 return makeAllowedICmpRegion(Pred, C);178}179 180bool ConstantRange::areInsensitiveToSignednessOfICmpPredicate(181 const ConstantRange &CR1, const ConstantRange &CR2) {182 if (CR1.isEmptySet() || CR2.isEmptySet())183 return true;184 185 return (CR1.isAllNonNegative() && CR2.isAllNonNegative()) ||186 (CR1.isAllNegative() && CR2.isAllNegative());187}188 189bool ConstantRange::areInsensitiveToSignednessOfInvertedICmpPredicate(190 const ConstantRange &CR1, const ConstantRange &CR2) {191 if (CR1.isEmptySet() || CR2.isEmptySet())192 return true;193 194 return (CR1.isAllNonNegative() && CR2.isAllNegative()) ||195 (CR1.isAllNegative() && CR2.isAllNonNegative());196}197 198CmpInst::Predicate ConstantRange::getEquivalentPredWithFlippedSignedness(199 CmpInst::Predicate Pred, const ConstantRange &CR1,200 const ConstantRange &CR2) {201 assert(CmpInst::isIntPredicate(Pred) && CmpInst::isRelational(Pred) &&202 "Only for relational integer predicates!");203 204 CmpInst::Predicate FlippedSignednessPred =205 ICmpInst::getFlippedSignednessPredicate(Pred);206 207 if (areInsensitiveToSignednessOfICmpPredicate(CR1, CR2))208 return FlippedSignednessPred;209 210 if (areInsensitiveToSignednessOfInvertedICmpPredicate(CR1, CR2))211 return CmpInst::getInversePredicate(FlippedSignednessPred);212 213 return CmpInst::Predicate::BAD_ICMP_PREDICATE;214}215 216void ConstantRange::getEquivalentICmp(CmpInst::Predicate &Pred,217 APInt &RHS, APInt &Offset) const {218 Offset = APInt(getBitWidth(), 0);219 if (isFullSet() || isEmptySet()) {220 Pred = isEmptySet() ? CmpInst::ICMP_ULT : CmpInst::ICMP_UGE;221 RHS = APInt(getBitWidth(), 0);222 } else if (auto *OnlyElt = getSingleElement()) {223 Pred = CmpInst::ICMP_EQ;224 RHS = *OnlyElt;225 } else if (auto *OnlyMissingElt = getSingleMissingElement()) {226 Pred = CmpInst::ICMP_NE;227 RHS = *OnlyMissingElt;228 } else if (getLower().isMinSignedValue() || getLower().isMinValue()) {229 Pred =230 getLower().isMinSignedValue() ? CmpInst::ICMP_SLT : CmpInst::ICMP_ULT;231 RHS = getUpper();232 } else if (getUpper().isMinSignedValue() || getUpper().isMinValue()) {233 Pred =234 getUpper().isMinSignedValue() ? CmpInst::ICMP_SGE : CmpInst::ICMP_UGE;235 RHS = getLower();236 } else {237 Pred = CmpInst::ICMP_ULT;238 RHS = getUpper() - getLower();239 Offset = -getLower();240 }241 242 assert(ConstantRange::makeExactICmpRegion(Pred, RHS) == add(Offset) &&243 "Bad result!");244}245 246bool ConstantRange::getEquivalentICmp(CmpInst::Predicate &Pred,247 APInt &RHS) const {248 APInt Offset;249 getEquivalentICmp(Pred, RHS, Offset);250 return Offset.isZero();251}252 253bool ConstantRange::icmp(CmpInst::Predicate Pred,254 const ConstantRange &Other) const {255 if (isEmptySet() || Other.isEmptySet())256 return true;257 258 switch (Pred) {259 case CmpInst::ICMP_EQ:260 if (const APInt *L = getSingleElement())261 if (const APInt *R = Other.getSingleElement())262 return *L == *R;263 return false;264 case CmpInst::ICMP_NE:265 return inverse().contains(Other);266 case CmpInst::ICMP_ULT:267 return getUnsignedMax().ult(Other.getUnsignedMin());268 case CmpInst::ICMP_ULE:269 return getUnsignedMax().ule(Other.getUnsignedMin());270 case CmpInst::ICMP_UGT:271 return getUnsignedMin().ugt(Other.getUnsignedMax());272 case CmpInst::ICMP_UGE:273 return getUnsignedMin().uge(Other.getUnsignedMax());274 case CmpInst::ICMP_SLT:275 return getSignedMax().slt(Other.getSignedMin());276 case CmpInst::ICMP_SLE:277 return getSignedMax().sle(Other.getSignedMin());278 case CmpInst::ICMP_SGT:279 return getSignedMin().sgt(Other.getSignedMax());280 case CmpInst::ICMP_SGE:281 return getSignedMin().sge(Other.getSignedMax());282 default:283 llvm_unreachable("Invalid ICmp predicate");284 }285}286 287/// Exact mul nuw region for single element RHS.288static ConstantRange makeExactMulNUWRegion(const APInt &V) {289 unsigned BitWidth = V.getBitWidth();290 if (V == 0)291 return ConstantRange::getFull(V.getBitWidth());292 293 return ConstantRange::getNonEmpty(294 APIntOps::RoundingUDiv(APInt::getMinValue(BitWidth), V,295 APInt::Rounding::UP),296 APIntOps::RoundingUDiv(APInt::getMaxValue(BitWidth), V,297 APInt::Rounding::DOWN) + 1);298}299 300/// Exact mul nsw region for single element RHS.301static ConstantRange makeExactMulNSWRegion(const APInt &V) {302 // Handle 0 and -1 separately to avoid division by zero or overflow.303 unsigned BitWidth = V.getBitWidth();304 if (V == 0)305 return ConstantRange::getFull(BitWidth);306 307 APInt MinValue = APInt::getSignedMinValue(BitWidth);308 APInt MaxValue = APInt::getSignedMaxValue(BitWidth);309 // e.g. Returning [-127, 127], represented as [-127, -128).310 if (V.isAllOnes())311 return ConstantRange(-MaxValue, MinValue);312 313 APInt Lower, Upper;314 if (V.isNegative()) {315 Lower = APIntOps::RoundingSDiv(MaxValue, V, APInt::Rounding::UP);316 Upper = APIntOps::RoundingSDiv(MinValue, V, APInt::Rounding::DOWN);317 } else {318 Lower = APIntOps::RoundingSDiv(MinValue, V, APInt::Rounding::UP);319 Upper = APIntOps::RoundingSDiv(MaxValue, V, APInt::Rounding::DOWN);320 }321 return ConstantRange::getNonEmpty(Lower, Upper + 1);322}323 324ConstantRange325ConstantRange::makeGuaranteedNoWrapRegion(Instruction::BinaryOps BinOp,326 const ConstantRange &Other,327 unsigned NoWrapKind) {328 using OBO = OverflowingBinaryOperator;329 330 assert(Instruction::isBinaryOp(BinOp) && "Binary operators only!");331 332 assert((NoWrapKind == OBO::NoSignedWrap ||333 NoWrapKind == OBO::NoUnsignedWrap) &&334 "NoWrapKind invalid!");335 336 bool Unsigned = NoWrapKind == OBO::NoUnsignedWrap;337 unsigned BitWidth = Other.getBitWidth();338 339 switch (BinOp) {340 default:341 llvm_unreachable("Unsupported binary op");342 343 case Instruction::Add: {344 if (Unsigned)345 return getNonEmpty(APInt::getZero(BitWidth), -Other.getUnsignedMax());346 347 APInt SignedMinVal = APInt::getSignedMinValue(BitWidth);348 APInt SMin = Other.getSignedMin(), SMax = Other.getSignedMax();349 return getNonEmpty(350 SMin.isNegative() ? SignedMinVal - SMin : SignedMinVal,351 SMax.isStrictlyPositive() ? SignedMinVal - SMax : SignedMinVal);352 }353 354 case Instruction::Sub: {355 if (Unsigned)356 return getNonEmpty(Other.getUnsignedMax(), APInt::getMinValue(BitWidth));357 358 APInt SignedMinVal = APInt::getSignedMinValue(BitWidth);359 APInt SMin = Other.getSignedMin(), SMax = Other.getSignedMax();360 return getNonEmpty(361 SMax.isStrictlyPositive() ? SignedMinVal + SMax : SignedMinVal,362 SMin.isNegative() ? SignedMinVal + SMin : SignedMinVal);363 }364 365 case Instruction::Mul:366 if (Unsigned)367 return makeExactMulNUWRegion(Other.getUnsignedMax());368 369 // Avoid one makeExactMulNSWRegion() call for the common case of constants.370 if (const APInt *C = Other.getSingleElement())371 return makeExactMulNSWRegion(*C);372 373 return makeExactMulNSWRegion(Other.getSignedMin())374 .intersectWith(makeExactMulNSWRegion(Other.getSignedMax()));375 376 case Instruction::Shl: {377 // For given range of shift amounts, if we ignore all illegal shift amounts378 // (that always produce poison), what shift amount range is left?379 ConstantRange ShAmt = Other.intersectWith(380 ConstantRange(APInt(BitWidth, 0), APInt(BitWidth, (BitWidth - 1) + 1)));381 if (ShAmt.isEmptySet()) {382 // If the entire range of shift amounts is already poison-producing,383 // then we can freely add more poison-producing flags ontop of that.384 return getFull(BitWidth);385 }386 // There are some legal shift amounts, we can compute conservatively-correct387 // range of no-wrap inputs. Note that by now we have clamped the ShAmtUMax388 // to be at most bitwidth-1, which results in most conservative range.389 APInt ShAmtUMax = ShAmt.getUnsignedMax();390 if (Unsigned)391 return getNonEmpty(APInt::getZero(BitWidth),392 APInt::getMaxValue(BitWidth).lshr(ShAmtUMax) + 1);393 return getNonEmpty(APInt::getSignedMinValue(BitWidth).ashr(ShAmtUMax),394 APInt::getSignedMaxValue(BitWidth).ashr(ShAmtUMax) + 1);395 }396 }397}398 399ConstantRange ConstantRange::makeExactNoWrapRegion(Instruction::BinaryOps BinOp,400 const APInt &Other,401 unsigned NoWrapKind) {402 // makeGuaranteedNoWrapRegion() is exact for single-element ranges, as403 // "for all" and "for any" coincide in this case.404 return makeGuaranteedNoWrapRegion(BinOp, ConstantRange(Other), NoWrapKind);405}406 407ConstantRange ConstantRange::makeMaskNotEqualRange(const APInt &Mask,408 const APInt &C) {409 unsigned BitWidth = Mask.getBitWidth();410 411 if ((Mask & C) != C)412 return getFull(BitWidth);413 414 if (Mask.isZero())415 return getEmpty(BitWidth);416 417 // If (Val & Mask) != C, constrained to the non-equality being418 // satisfiable, then the value must be larger than the lowest set bit of419 // Mask, offset by constant C.420 return ConstantRange::getNonEmpty(421 APInt::getOneBitSet(BitWidth, Mask.countr_zero()) + C, C);422}423 424bool ConstantRange::isFullSet() const {425 return Lower == Upper && Lower.isMaxValue();426}427 428bool ConstantRange::isEmptySet() const {429 return Lower == Upper && Lower.isMinValue();430}431 432bool ConstantRange::isWrappedSet() const {433 return Lower.ugt(Upper) && !Upper.isZero();434}435 436bool ConstantRange::isUpperWrapped() const {437 return Lower.ugt(Upper);438}439 440bool ConstantRange::isSignWrappedSet() const {441 return Lower.sgt(Upper) && !Upper.isMinSignedValue();442}443 444bool ConstantRange::isUpperSignWrapped() const {445 return Lower.sgt(Upper);446}447 448bool449ConstantRange::isSizeStrictlySmallerThan(const ConstantRange &Other) const {450 assert(getBitWidth() == Other.getBitWidth());451 if (isFullSet())452 return false;453 if (Other.isFullSet())454 return true;455 return (Upper - Lower).ult(Other.Upper - Other.Lower);456}457 458bool459ConstantRange::isSizeLargerThan(uint64_t MaxSize) const {460 // If this a full set, we need special handling to avoid needing an extra bit461 // to represent the size.462 if (isFullSet())463 return MaxSize == 0 || APInt::getMaxValue(getBitWidth()).ugt(MaxSize - 1);464 465 return (Upper - Lower).ugt(MaxSize);466}467 468bool ConstantRange::isAllNegative() const {469 // Empty set is all negative, full set is not.470 if (isEmptySet())471 return true;472 if (isFullSet())473 return false;474 475 return !isUpperSignWrapped() && !Upper.isStrictlyPositive();476}477 478bool ConstantRange::isAllNonNegative() const {479 // Empty and full set are automatically treated correctly.480 return !isSignWrappedSet() && Lower.isNonNegative();481}482 483bool ConstantRange::isAllPositive() const {484 // Empty set is all positive, full set is not.485 if (isEmptySet())486 return true;487 if (isFullSet())488 return false;489 490 return !isSignWrappedSet() && Lower.isStrictlyPositive();491}492 493APInt ConstantRange::getUnsignedMax() const {494 if (isFullSet() || isUpperWrapped())495 return APInt::getMaxValue(getBitWidth());496 return getUpper() - 1;497}498 499APInt ConstantRange::getUnsignedMin() const {500 if (isFullSet() || isWrappedSet())501 return APInt::getMinValue(getBitWidth());502 return getLower();503}504 505APInt ConstantRange::getSignedMax() const {506 if (isFullSet() || isUpperSignWrapped())507 return APInt::getSignedMaxValue(getBitWidth());508 return getUpper() - 1;509}510 511APInt ConstantRange::getSignedMin() const {512 if (isFullSet() || isSignWrappedSet())513 return APInt::getSignedMinValue(getBitWidth());514 return getLower();515}516 517bool ConstantRange::contains(const APInt &V) const {518 if (Lower == Upper)519 return isFullSet();520 521 if (!isUpperWrapped())522 return Lower.ule(V) && V.ult(Upper);523 return Lower.ule(V) || V.ult(Upper);524}525 526bool ConstantRange::contains(const ConstantRange &Other) const {527 if (isFullSet() || Other.isEmptySet()) return true;528 if (isEmptySet() || Other.isFullSet()) return false;529 530 if (!isUpperWrapped()) {531 if (Other.isUpperWrapped())532 return false;533 534 return Lower.ule(Other.getLower()) && Other.getUpper().ule(Upper);535 }536 537 if (!Other.isUpperWrapped())538 return Other.getUpper().ule(Upper) ||539 Lower.ule(Other.getLower());540 541 return Other.getUpper().ule(Upper) && Lower.ule(Other.getLower());542}543 544unsigned ConstantRange::getActiveBits() const {545 if (isEmptySet())546 return 0;547 548 return getUnsignedMax().getActiveBits();549}550 551unsigned ConstantRange::getMinSignedBits() const {552 if (isEmptySet())553 return 0;554 555 return std::max(getSignedMin().getSignificantBits(),556 getSignedMax().getSignificantBits());557}558 559ConstantRange ConstantRange::subtract(const APInt &Val) const {560 assert(Val.getBitWidth() == getBitWidth() && "Wrong bit width");561 // If the set is empty or full, don't modify the endpoints.562 if (Lower == Upper)563 return *this;564 return ConstantRange(Lower - Val, Upper - Val);565}566 567ConstantRange ConstantRange::difference(const ConstantRange &CR) const {568 return intersectWith(CR.inverse());569}570 571static ConstantRange getPreferredRange(572 const ConstantRange &CR1, const ConstantRange &CR2,573 ConstantRange::PreferredRangeType Type) {574 if (Type == ConstantRange::Unsigned) {575 if (!CR1.isWrappedSet() && CR2.isWrappedSet())576 return CR1;577 if (CR1.isWrappedSet() && !CR2.isWrappedSet())578 return CR2;579 } else if (Type == ConstantRange::Signed) {580 if (!CR1.isSignWrappedSet() && CR2.isSignWrappedSet())581 return CR1;582 if (CR1.isSignWrappedSet() && !CR2.isSignWrappedSet())583 return CR2;584 }585 586 if (CR1.isSizeStrictlySmallerThan(CR2))587 return CR1;588 return CR2;589}590 591ConstantRange ConstantRange::intersectWith(const ConstantRange &CR,592 PreferredRangeType Type) const {593 assert(getBitWidth() == CR.getBitWidth() &&594 "ConstantRange types don't agree!");595 596 // Handle common cases.597 if ( isEmptySet() || CR.isFullSet()) return *this;598 if (CR.isEmptySet() || isFullSet()) return CR;599 600 if (!isUpperWrapped() && CR.isUpperWrapped())601 return CR.intersectWith(*this, Type);602 603 if (!isUpperWrapped() && !CR.isUpperWrapped()) {604 if (Lower.ult(CR.Lower)) {605 // L---U : this606 // L---U : CR607 if (Upper.ule(CR.Lower))608 return getEmpty();609 610 // L---U : this611 // L---U : CR612 if (Upper.ult(CR.Upper))613 return ConstantRange(CR.Lower, Upper);614 615 // L-------U : this616 // L---U : CR617 return CR;618 }619 // L---U : this620 // L-------U : CR621 if (Upper.ult(CR.Upper))622 return *this;623 624 // L-----U : this625 // L-----U : CR626 if (Lower.ult(CR.Upper))627 return ConstantRange(Lower, CR.Upper);628 629 // L---U : this630 // L---U : CR631 return getEmpty();632 }633 634 if (isUpperWrapped() && !CR.isUpperWrapped()) {635 if (CR.Lower.ult(Upper)) {636 // ------U L--- : this637 // L--U : CR638 if (CR.Upper.ult(Upper))639 return CR;640 641 // ------U L--- : this642 // L------U : CR643 if (CR.Upper.ule(Lower))644 return ConstantRange(CR.Lower, Upper);645 646 // ------U L--- : this647 // L----------U : CR648 return getPreferredRange(*this, CR, Type);649 }650 if (CR.Lower.ult(Lower)) {651 // --U L---- : this652 // L--U : CR653 if (CR.Upper.ule(Lower))654 return getEmpty();655 656 // --U L---- : this657 // L------U : CR658 return ConstantRange(Lower, CR.Upper);659 }660 661 // --U L------ : this662 // L--U : CR663 return CR;664 }665 666 if (CR.Upper.ult(Upper)) {667 // ------U L-- : this668 // --U L------ : CR669 if (CR.Lower.ult(Upper))670 return getPreferredRange(*this, CR, Type);671 672 // ----U L-- : this673 // --U L---- : CR674 if (CR.Lower.ult(Lower))675 return ConstantRange(Lower, CR.Upper);676 677 // ----U L---- : this678 // --U L-- : CR679 return CR;680 }681 if (CR.Upper.ule(Lower)) {682 // --U L-- : this683 // ----U L---- : CR684 if (CR.Lower.ult(Lower))685 return *this;686 687 // --U L---- : this688 // ----U L-- : CR689 return ConstantRange(CR.Lower, Upper);690 }691 692 // --U L------ : this693 // ------U L-- : CR694 return getPreferredRange(*this, CR, Type);695}696 697ConstantRange ConstantRange::unionWith(const ConstantRange &CR,698 PreferredRangeType Type) const {699 assert(getBitWidth() == CR.getBitWidth() &&700 "ConstantRange types don't agree!");701 702 if ( isFullSet() || CR.isEmptySet()) return *this;703 if (CR.isFullSet() || isEmptySet()) return CR;704 705 if (!isUpperWrapped() && CR.isUpperWrapped())706 return CR.unionWith(*this, Type);707 708 if (!isUpperWrapped() && !CR.isUpperWrapped()) {709 // L---U and L---U : this710 // L---U L---U : CR711 // result in one of712 // L---------U713 // -----U L-----714 if (CR.Upper.ult(Lower) || Upper.ult(CR.Lower))715 return getPreferredRange(716 ConstantRange(Lower, CR.Upper), ConstantRange(CR.Lower, Upper), Type);717 718 APInt L = CR.Lower.ult(Lower) ? CR.Lower : Lower;719 APInt U = (CR.Upper - 1).ugt(Upper - 1) ? CR.Upper : Upper;720 721 if (L.isZero() && U.isZero())722 return getFull();723 724 return ConstantRange(std::move(L), std::move(U));725 }726 727 if (!CR.isUpperWrapped()) {728 // ------U L----- and ------U L----- : this729 // L--U L--U : CR730 if (CR.Upper.ule(Upper) || CR.Lower.uge(Lower))731 return *this;732 733 // ------U L----- : this734 // L---------U : CR735 if (CR.Lower.ule(Upper) && Lower.ule(CR.Upper))736 return getFull();737 738 // ----U L---- : this739 // L---U : CR740 // results in one of741 // ----------U L----742 // ----U L----------743 if (Upper.ult(CR.Lower) && CR.Upper.ult(Lower))744 return getPreferredRange(745 ConstantRange(Lower, CR.Upper), ConstantRange(CR.Lower, Upper), Type);746 747 // ----U L----- : this748 // L----U : CR749 if (Upper.ult(CR.Lower) && Lower.ule(CR.Upper))750 return ConstantRange(CR.Lower, Upper);751 752 // ------U L---- : this753 // L-----U : CR754 assert(CR.Lower.ule(Upper) && CR.Upper.ult(Lower) &&755 "ConstantRange::unionWith missed a case with one range wrapped");756 return ConstantRange(Lower, CR.Upper);757 }758 759 // ------U L---- and ------U L---- : this760 // -U L----------- and ------------U L : CR761 if (CR.Lower.ule(Upper) || Lower.ule(CR.Upper))762 return getFull();763 764 APInt L = CR.Lower.ult(Lower) ? CR.Lower : Lower;765 APInt U = CR.Upper.ugt(Upper) ? CR.Upper : Upper;766 767 return ConstantRange(std::move(L), std::move(U));768}769 770std::optional<ConstantRange>771ConstantRange::exactIntersectWith(const ConstantRange &CR) const {772 // TODO: This can be implemented more efficiently.773 ConstantRange Result = intersectWith(CR);774 if (Result == inverse().unionWith(CR.inverse()).inverse())775 return Result;776 return std::nullopt;777}778 779std::optional<ConstantRange>780ConstantRange::exactUnionWith(const ConstantRange &CR) const {781 // TODO: This can be implemented more efficiently.782 ConstantRange Result = unionWith(CR);783 if (Result == inverse().intersectWith(CR.inverse()).inverse())784 return Result;785 return std::nullopt;786}787 788ConstantRange ConstantRange::castOp(Instruction::CastOps CastOp,789 uint32_t ResultBitWidth) const {790 switch (CastOp) {791 default:792 llvm_unreachable("unsupported cast type");793 case Instruction::Trunc:794 return truncate(ResultBitWidth);795 case Instruction::SExt:796 return signExtend(ResultBitWidth);797 case Instruction::ZExt:798 return zeroExtend(ResultBitWidth);799 case Instruction::BitCast:800 return *this;801 case Instruction::FPToUI:802 case Instruction::FPToSI:803 if (getBitWidth() == ResultBitWidth)804 return *this;805 else806 return getFull(ResultBitWidth);807 case Instruction::UIToFP: {808 // TODO: use input range if available809 auto BW = getBitWidth();810 APInt Min = APInt::getMinValue(BW);811 APInt Max = APInt::getMaxValue(BW);812 if (ResultBitWidth > BW) {813 Min = Min.zext(ResultBitWidth);814 Max = Max.zext(ResultBitWidth);815 }816 return getNonEmpty(std::move(Min), std::move(Max) + 1);817 }818 case Instruction::SIToFP: {819 // TODO: use input range if available820 auto BW = getBitWidth();821 APInt SMin = APInt::getSignedMinValue(BW);822 APInt SMax = APInt::getSignedMaxValue(BW);823 if (ResultBitWidth > BW) {824 SMin = SMin.sext(ResultBitWidth);825 SMax = SMax.sext(ResultBitWidth);826 }827 return getNonEmpty(std::move(SMin), std::move(SMax) + 1);828 }829 case Instruction::FPTrunc:830 case Instruction::FPExt:831 case Instruction::IntToPtr:832 case Instruction::PtrToAddr:833 case Instruction::PtrToInt:834 case Instruction::AddrSpaceCast:835 // Conservatively return getFull set.836 return getFull(ResultBitWidth);837 };838}839 840ConstantRange ConstantRange::zeroExtend(uint32_t DstTySize) const {841 if (isEmptySet()) return getEmpty(DstTySize);842 843 unsigned SrcTySize = getBitWidth();844 if (DstTySize == SrcTySize)845 return *this;846 assert(SrcTySize < DstTySize && "Not a value extension");847 if (isFullSet() || isUpperWrapped()) {848 // Change into [0, 1 << src bit width)849 APInt LowerExt(DstTySize, 0);850 if (!Upper) // special case: [X, 0) -- not really wrapping around851 LowerExt = Lower.zext(DstTySize);852 return ConstantRange(std::move(LowerExt),853 APInt::getOneBitSet(DstTySize, SrcTySize));854 }855 856 return ConstantRange(Lower.zext(DstTySize), Upper.zext(DstTySize));857}858 859ConstantRange ConstantRange::signExtend(uint32_t DstTySize) const {860 if (isEmptySet()) return getEmpty(DstTySize);861 862 unsigned SrcTySize = getBitWidth();863 if (DstTySize == SrcTySize)864 return *this;865 assert(SrcTySize < DstTySize && "Not a value extension");866 867 // special case: [X, INT_MIN) -- not really wrapping around868 if (Upper.isMinSignedValue())869 return ConstantRange(Lower.sext(DstTySize), Upper.zext(DstTySize));870 871 if (isFullSet() || isSignWrappedSet()) {872 return ConstantRange(APInt::getHighBitsSet(DstTySize,DstTySize-SrcTySize+1),873 APInt::getLowBitsSet(DstTySize, SrcTySize-1) + 1);874 }875 876 return ConstantRange(Lower.sext(DstTySize), Upper.sext(DstTySize));877}878 879ConstantRange ConstantRange::truncate(uint32_t DstTySize,880 unsigned NoWrapKind) const {881 if (DstTySize == getBitWidth())882 return *this;883 assert(getBitWidth() > DstTySize && "Not a value truncation");884 if (isEmptySet())885 return getEmpty(DstTySize);886 if (isFullSet())887 return getFull(DstTySize);888 889 APInt LowerDiv(Lower), UpperDiv(Upper);890 ConstantRange Union(DstTySize, /*isFullSet=*/false);891 892 // Analyze wrapped sets in their two parts: [0, Upper) \/ [Lower, MaxValue]893 // We use the non-wrapped set code to analyze the [Lower, MaxValue) part, and894 // then we do the union with [MaxValue, Upper)895 if (isUpperWrapped()) {896 // If Upper is greater than MaxValue(DstTy), it covers the whole truncated897 // range.898 if (Upper.getActiveBits() > DstTySize)899 return getFull(DstTySize);900 901 // For nuw the two parts are: [0, Upper) \/ [Lower, MaxValue(DstTy)]902 if (NoWrapKind & TruncInst::NoUnsignedWrap) {903 Union = ConstantRange(APInt::getZero(DstTySize), Upper.trunc(DstTySize));904 UpperDiv = APInt::getOneBitSet(getBitWidth(), DstTySize);905 } else {906 // If Upper is equal to MaxValue(DstTy), it covers the whole truncated907 // range.908 if (Upper.countr_one() == DstTySize)909 return getFull(DstTySize);910 Union =911 ConstantRange(APInt::getMaxValue(DstTySize), Upper.trunc(DstTySize));912 UpperDiv.setAllBits();913 // Union covers the MaxValue case, so return if the remaining range is914 // just MaxValue(DstTy).915 if (LowerDiv == UpperDiv)916 return Union;917 }918 }919 920 // Chop off the most significant bits that are past the destination bitwidth.921 if (LowerDiv.getActiveBits() > DstTySize) {922 // For trunc nuw if LowerDiv is greater than MaxValue(DstTy), the range is923 // outside the whole truncated range.924 if (NoWrapKind & TruncInst::NoUnsignedWrap)925 return Union;926 // Mask to just the signficant bits and subtract from LowerDiv/UpperDiv.927 APInt Adjust = LowerDiv & APInt::getBitsSetFrom(getBitWidth(), DstTySize);928 LowerDiv -= Adjust;929 UpperDiv -= Adjust;930 }931 932 unsigned UpperDivWidth = UpperDiv.getActiveBits();933 if (UpperDivWidth <= DstTySize)934 return ConstantRange(LowerDiv.trunc(DstTySize),935 UpperDiv.trunc(DstTySize)).unionWith(Union);936 937 if (!LowerDiv.isZero() && NoWrapKind & TruncInst::NoUnsignedWrap)938 return ConstantRange(LowerDiv.trunc(DstTySize), APInt::getZero(DstTySize))939 .unionWith(Union);940 941 // The truncated value wraps around. Check if we can do better than fullset.942 if (UpperDivWidth == DstTySize + 1) {943 // Clear the MSB so that UpperDiv wraps around.944 UpperDiv.clearBit(DstTySize);945 if (UpperDiv.ult(LowerDiv))946 return ConstantRange(LowerDiv.trunc(DstTySize),947 UpperDiv.trunc(DstTySize)).unionWith(Union);948 }949 950 return getFull(DstTySize);951}952 953ConstantRange ConstantRange::zextOrTrunc(uint32_t DstTySize) const {954 unsigned SrcTySize = getBitWidth();955 if (SrcTySize > DstTySize)956 return truncate(DstTySize);957 if (SrcTySize < DstTySize)958 return zeroExtend(DstTySize);959 return *this;960}961 962ConstantRange ConstantRange::sextOrTrunc(uint32_t DstTySize) const {963 unsigned SrcTySize = getBitWidth();964 if (SrcTySize > DstTySize)965 return truncate(DstTySize);966 if (SrcTySize < DstTySize)967 return signExtend(DstTySize);968 return *this;969}970 971ConstantRange ConstantRange::binaryOp(Instruction::BinaryOps BinOp,972 const ConstantRange &Other) const {973 assert(Instruction::isBinaryOp(BinOp) && "Binary operators only!");974 975 switch (BinOp) {976 case Instruction::Add:977 return add(Other);978 case Instruction::Sub:979 return sub(Other);980 case Instruction::Mul:981 return multiply(Other);982 case Instruction::UDiv:983 return udiv(Other);984 case Instruction::SDiv:985 return sdiv(Other);986 case Instruction::URem:987 return urem(Other);988 case Instruction::SRem:989 return srem(Other);990 case Instruction::Shl:991 return shl(Other);992 case Instruction::LShr:993 return lshr(Other);994 case Instruction::AShr:995 return ashr(Other);996 case Instruction::And:997 return binaryAnd(Other);998 case Instruction::Or:999 return binaryOr(Other);1000 case Instruction::Xor:1001 return binaryXor(Other);1002 // Note: floating point operations applied to abstract ranges are just1003 // ideal integer operations with a lossy representation1004 case Instruction::FAdd:1005 return add(Other);1006 case Instruction::FSub:1007 return sub(Other);1008 case Instruction::FMul:1009 return multiply(Other);1010 default:1011 // Conservatively return getFull set.1012 return getFull();1013 }1014}1015 1016ConstantRange ConstantRange::overflowingBinaryOp(Instruction::BinaryOps BinOp,1017 const ConstantRange &Other,1018 unsigned NoWrapKind) const {1019 assert(Instruction::isBinaryOp(BinOp) && "Binary operators only!");1020 1021 switch (BinOp) {1022 case Instruction::Add:1023 return addWithNoWrap(Other, NoWrapKind);1024 case Instruction::Sub:1025 return subWithNoWrap(Other, NoWrapKind);1026 case Instruction::Mul:1027 return multiplyWithNoWrap(Other, NoWrapKind);1028 case Instruction::Shl:1029 return shlWithNoWrap(Other, NoWrapKind);1030 default:1031 // Don't know about this Overflowing Binary Operation.1032 // Conservatively fallback to plain binop handling.1033 return binaryOp(BinOp, Other);1034 }1035}1036 1037bool ConstantRange::isIntrinsicSupported(Intrinsic::ID IntrinsicID) {1038 switch (IntrinsicID) {1039 case Intrinsic::uadd_sat:1040 case Intrinsic::usub_sat:1041 case Intrinsic::sadd_sat:1042 case Intrinsic::ssub_sat:1043 case Intrinsic::umin:1044 case Intrinsic::umax:1045 case Intrinsic::smin:1046 case Intrinsic::smax:1047 case Intrinsic::abs:1048 case Intrinsic::ctlz:1049 case Intrinsic::cttz:1050 case Intrinsic::ctpop:1051 return true;1052 default:1053 return false;1054 }1055}1056 1057ConstantRange ConstantRange::intrinsic(Intrinsic::ID IntrinsicID,1058 ArrayRef<ConstantRange> Ops) {1059 switch (IntrinsicID) {1060 case Intrinsic::uadd_sat:1061 return Ops[0].uadd_sat(Ops[1]);1062 case Intrinsic::usub_sat:1063 return Ops[0].usub_sat(Ops[1]);1064 case Intrinsic::sadd_sat:1065 return Ops[0].sadd_sat(Ops[1]);1066 case Intrinsic::ssub_sat:1067 return Ops[0].ssub_sat(Ops[1]);1068 case Intrinsic::umin:1069 return Ops[0].umin(Ops[1]);1070 case Intrinsic::umax:1071 return Ops[0].umax(Ops[1]);1072 case Intrinsic::smin:1073 return Ops[0].smin(Ops[1]);1074 case Intrinsic::smax:1075 return Ops[0].smax(Ops[1]);1076 case Intrinsic::abs: {1077 const APInt *IntMinIsPoison = Ops[1].getSingleElement();1078 assert(IntMinIsPoison && "Must be known (immarg)");1079 assert(IntMinIsPoison->getBitWidth() == 1 && "Must be boolean");1080 return Ops[0].abs(IntMinIsPoison->getBoolValue());1081 }1082 case Intrinsic::ctlz: {1083 const APInt *ZeroIsPoison = Ops[1].getSingleElement();1084 assert(ZeroIsPoison && "Must be known (immarg)");1085 assert(ZeroIsPoison->getBitWidth() == 1 && "Must be boolean");1086 return Ops[0].ctlz(ZeroIsPoison->getBoolValue());1087 }1088 case Intrinsic::cttz: {1089 const APInt *ZeroIsPoison = Ops[1].getSingleElement();1090 assert(ZeroIsPoison && "Must be known (immarg)");1091 assert(ZeroIsPoison->getBitWidth() == 1 && "Must be boolean");1092 return Ops[0].cttz(ZeroIsPoison->getBoolValue());1093 }1094 case Intrinsic::ctpop:1095 return Ops[0].ctpop();1096 default:1097 assert(!isIntrinsicSupported(IntrinsicID) && "Shouldn't be supported");1098 llvm_unreachable("Unsupported intrinsic");1099 }1100}1101 1102ConstantRange1103ConstantRange::add(const ConstantRange &Other) const {1104 if (isEmptySet() || Other.isEmptySet())1105 return getEmpty();1106 if (isFullSet() || Other.isFullSet())1107 return getFull();1108 1109 APInt NewLower = getLower() + Other.getLower();1110 APInt NewUpper = getUpper() + Other.getUpper() - 1;1111 if (NewLower == NewUpper)1112 return getFull();1113 1114 ConstantRange X = ConstantRange(std::move(NewLower), std::move(NewUpper));1115 if (X.isSizeStrictlySmallerThan(*this) ||1116 X.isSizeStrictlySmallerThan(Other))1117 // We've wrapped, therefore, full set.1118 return getFull();1119 return X;1120}1121 1122ConstantRange ConstantRange::addWithNoWrap(const ConstantRange &Other,1123 unsigned NoWrapKind,1124 PreferredRangeType RangeType) const {1125 // Calculate the range for "X + Y" which is guaranteed not to wrap(overflow).1126 // (X is from this, and Y is from Other)1127 if (isEmptySet() || Other.isEmptySet())1128 return getEmpty();1129 if (isFullSet() && Other.isFullSet())1130 return getFull();1131 1132 using OBO = OverflowingBinaryOperator;1133 ConstantRange Result = add(Other);1134 1135 // If an overflow happens for every value pair in these two constant ranges,1136 // we must return Empty set. In this case, we get that for free, because we1137 // get lucky that intersection of add() with uadd_sat()/sadd_sat() results1138 // in an empty set.1139 1140 if (NoWrapKind & OBO::NoSignedWrap)1141 Result = Result.intersectWith(sadd_sat(Other), RangeType);1142 1143 if (NoWrapKind & OBO::NoUnsignedWrap)1144 Result = Result.intersectWith(uadd_sat(Other), RangeType);1145 1146 return Result;1147}1148 1149ConstantRange1150ConstantRange::sub(const ConstantRange &Other) const {1151 if (isEmptySet() || Other.isEmptySet())1152 return getEmpty();1153 if (isFullSet() || Other.isFullSet())1154 return getFull();1155 1156 APInt NewLower = getLower() - Other.getUpper() + 1;1157 APInt NewUpper = getUpper() - Other.getLower();1158 if (NewLower == NewUpper)1159 return getFull();1160 1161 ConstantRange X = ConstantRange(std::move(NewLower), std::move(NewUpper));1162 if (X.isSizeStrictlySmallerThan(*this) ||1163 X.isSizeStrictlySmallerThan(Other))1164 // We've wrapped, therefore, full set.1165 return getFull();1166 return X;1167}1168 1169ConstantRange ConstantRange::subWithNoWrap(const ConstantRange &Other,1170 unsigned NoWrapKind,1171 PreferredRangeType RangeType) const {1172 // Calculate the range for "X - Y" which is guaranteed not to wrap(overflow).1173 // (X is from this, and Y is from Other)1174 if (isEmptySet() || Other.isEmptySet())1175 return getEmpty();1176 if (isFullSet() && Other.isFullSet())1177 return getFull();1178 1179 using OBO = OverflowingBinaryOperator;1180 ConstantRange Result = sub(Other);1181 1182 // If an overflow happens for every value pair in these two constant ranges,1183 // we must return Empty set. In signed case, we get that for free, because we1184 // get lucky that intersection of sub() with ssub_sat() results in an1185 // empty set. But for unsigned we must perform the overflow check manually.1186 1187 if (NoWrapKind & OBO::NoSignedWrap)1188 Result = Result.intersectWith(ssub_sat(Other), RangeType);1189 1190 if (NoWrapKind & OBO::NoUnsignedWrap) {1191 if (getUnsignedMax().ult(Other.getUnsignedMin()))1192 return getEmpty(); // Always overflows.1193 Result = Result.intersectWith(usub_sat(Other), RangeType);1194 }1195 1196 return Result;1197}1198 1199ConstantRange1200ConstantRange::multiply(const ConstantRange &Other) const {1201 // TODO: If either operand is a single element and the multiply is known to1202 // be non-wrapping, round the result min and max value to the appropriate1203 // multiple of that element. If wrapping is possible, at least adjust the1204 // range according to the greatest power-of-two factor of the single element.1205 1206 if (isEmptySet() || Other.isEmptySet())1207 return getEmpty();1208 1209 if (const APInt *C = getSingleElement()) {1210 if (C->isOne())1211 return Other;1212 if (C->isAllOnes())1213 return ConstantRange(APInt::getZero(getBitWidth())).sub(Other);1214 }1215 1216 if (const APInt *C = Other.getSingleElement()) {1217 if (C->isOne())1218 return *this;1219 if (C->isAllOnes())1220 return ConstantRange(APInt::getZero(getBitWidth())).sub(*this);1221 }1222 1223 // Multiplication is signedness-independent. However different ranges can be1224 // obtained depending on how the input ranges are treated. These different1225 // ranges are all conservatively correct, but one might be better than the1226 // other. We calculate two ranges; one treating the inputs as unsigned1227 // and the other signed, then return the smallest of these ranges.1228 1229 // Unsigned range first.1230 APInt this_min = getUnsignedMin().zext(getBitWidth() * 2);1231 APInt this_max = getUnsignedMax().zext(getBitWidth() * 2);1232 APInt Other_min = Other.getUnsignedMin().zext(getBitWidth() * 2);1233 APInt Other_max = Other.getUnsignedMax().zext(getBitWidth() * 2);1234 1235 ConstantRange Result_zext = ConstantRange(this_min * Other_min,1236 this_max * Other_max + 1);1237 ConstantRange UR = Result_zext.truncate(getBitWidth());1238 1239 // If the unsigned range doesn't wrap, and isn't negative then it's a range1240 // from one positive number to another which is as good as we can generate.1241 // In this case, skip the extra work of generating signed ranges which aren't1242 // going to be better than this range.1243 if (!UR.isUpperWrapped() &&1244 (UR.getUpper().isNonNegative() || UR.getUpper().isMinSignedValue()))1245 return UR;1246 1247 // Now the signed range. Because we could be dealing with negative numbers1248 // here, the lower bound is the smallest of the cartesian product of the1249 // lower and upper ranges; for example:1250 // [-1,4) * [-2,3) = min(-1*-2, -1*2, 3*-2, 3*2) = -6.1251 // Similarly for the upper bound, swapping min for max.1252 1253 this_min = getSignedMin().sext(getBitWidth() * 2);1254 this_max = getSignedMax().sext(getBitWidth() * 2);1255 Other_min = Other.getSignedMin().sext(getBitWidth() * 2);1256 Other_max = Other.getSignedMax().sext(getBitWidth() * 2);1257 1258 auto L = {this_min * Other_min, this_min * Other_max,1259 this_max * Other_min, this_max * Other_max};1260 auto Compare = [](const APInt &A, const APInt &B) { return A.slt(B); };1261 ConstantRange Result_sext(std::min(L, Compare), std::max(L, Compare) + 1);1262 ConstantRange SR = Result_sext.truncate(getBitWidth());1263 1264 return UR.isSizeStrictlySmallerThan(SR) ? UR : SR;1265}1266 1267ConstantRange1268ConstantRange::multiplyWithNoWrap(const ConstantRange &Other,1269 unsigned NoWrapKind,1270 PreferredRangeType RangeType) const {1271 if (isEmptySet() || Other.isEmptySet())1272 return getEmpty();1273 if (isFullSet() && Other.isFullSet())1274 return getFull();1275 1276 ConstantRange Result = multiply(Other);1277 1278 if (NoWrapKind & OverflowingBinaryOperator::NoSignedWrap)1279 Result = Result.intersectWith(smul_sat(Other), RangeType);1280 1281 if (NoWrapKind & OverflowingBinaryOperator::NoUnsignedWrap)1282 Result = Result.intersectWith(umul_sat(Other), RangeType);1283 1284 // mul nsw nuw X, Y s>= 0 if X s> 1 or Y s> 11285 if ((NoWrapKind == (OverflowingBinaryOperator::NoSignedWrap |1286 OverflowingBinaryOperator::NoUnsignedWrap)) &&1287 !Result.isAllNonNegative()) {1288 if (getSignedMin().sgt(1) || Other.getSignedMin().sgt(1))1289 Result = Result.intersectWith(1290 getNonEmpty(APInt::getZero(getBitWidth()),1291 APInt::getSignedMinValue(getBitWidth())),1292 RangeType);1293 }1294 1295 return Result;1296}1297 1298ConstantRange ConstantRange::smul_fast(const ConstantRange &Other) const {1299 if (isEmptySet() || Other.isEmptySet())1300 return getEmpty();1301 1302 APInt Min = getSignedMin();1303 APInt Max = getSignedMax();1304 APInt OtherMin = Other.getSignedMin();1305 APInt OtherMax = Other.getSignedMax();1306 1307 bool O1, O2, O3, O4;1308 auto Muls = {Min.smul_ov(OtherMin, O1), Min.smul_ov(OtherMax, O2),1309 Max.smul_ov(OtherMin, O3), Max.smul_ov(OtherMax, O4)};1310 if (O1 || O2 || O3 || O4)1311 return getFull();1312 1313 auto Compare = [](const APInt &A, const APInt &B) { return A.slt(B); };1314 return getNonEmpty(std::min(Muls, Compare), std::max(Muls, Compare) + 1);1315}1316 1317ConstantRange1318ConstantRange::smax(const ConstantRange &Other) const {1319 // X smax Y is: range(smax(X_smin, Y_smin),1320 // smax(X_smax, Y_smax))1321 if (isEmptySet() || Other.isEmptySet())1322 return getEmpty();1323 APInt NewL = APIntOps::smax(getSignedMin(), Other.getSignedMin());1324 APInt NewU = APIntOps::smax(getSignedMax(), Other.getSignedMax()) + 1;1325 ConstantRange Res = getNonEmpty(std::move(NewL), std::move(NewU));1326 if (isSignWrappedSet() || Other.isSignWrappedSet())1327 return Res.intersectWith(unionWith(Other, Signed), Signed);1328 return Res;1329}1330 1331ConstantRange1332ConstantRange::umax(const ConstantRange &Other) const {1333 // X umax Y is: range(umax(X_umin, Y_umin),1334 // umax(X_umax, Y_umax))1335 if (isEmptySet() || Other.isEmptySet())1336 return getEmpty();1337 APInt NewL = APIntOps::umax(getUnsignedMin(), Other.getUnsignedMin());1338 APInt NewU = APIntOps::umax(getUnsignedMax(), Other.getUnsignedMax()) + 1;1339 ConstantRange Res = getNonEmpty(std::move(NewL), std::move(NewU));1340 if (isWrappedSet() || Other.isWrappedSet())1341 return Res.intersectWith(unionWith(Other, Unsigned), Unsigned);1342 return Res;1343}1344 1345ConstantRange1346ConstantRange::smin(const ConstantRange &Other) const {1347 // X smin Y is: range(smin(X_smin, Y_smin),1348 // smin(X_smax, Y_smax))1349 if (isEmptySet() || Other.isEmptySet())1350 return getEmpty();1351 APInt NewL = APIntOps::smin(getSignedMin(), Other.getSignedMin());1352 APInt NewU = APIntOps::smin(getSignedMax(), Other.getSignedMax()) + 1;1353 ConstantRange Res = getNonEmpty(std::move(NewL), std::move(NewU));1354 if (isSignWrappedSet() || Other.isSignWrappedSet())1355 return Res.intersectWith(unionWith(Other, Signed), Signed);1356 return Res;1357}1358 1359ConstantRange1360ConstantRange::umin(const ConstantRange &Other) const {1361 // X umin Y is: range(umin(X_umin, Y_umin),1362 // umin(X_umax, Y_umax))1363 if (isEmptySet() || Other.isEmptySet())1364 return getEmpty();1365 APInt NewL = APIntOps::umin(getUnsignedMin(), Other.getUnsignedMin());1366 APInt NewU = APIntOps::umin(getUnsignedMax(), Other.getUnsignedMax()) + 1;1367 ConstantRange Res = getNonEmpty(std::move(NewL), std::move(NewU));1368 if (isWrappedSet() || Other.isWrappedSet())1369 return Res.intersectWith(unionWith(Other, Unsigned), Unsigned);1370 return Res;1371}1372 1373ConstantRange1374ConstantRange::udiv(const ConstantRange &RHS) const {1375 if (isEmptySet() || RHS.isEmptySet() || RHS.getUnsignedMax().isZero())1376 return getEmpty();1377 1378 APInt Lower = getUnsignedMin().udiv(RHS.getUnsignedMax());1379 1380 APInt RHS_umin = RHS.getUnsignedMin();1381 if (RHS_umin.isZero()) {1382 // We want the lowest value in RHS excluding zero. Usually that would be 11383 // except for a range in the form of [X, 1) in which case it would be X.1384 if (RHS.getUpper() == 1)1385 RHS_umin = RHS.getLower();1386 else1387 RHS_umin = 1;1388 }1389 1390 APInt Upper = getUnsignedMax().udiv(RHS_umin) + 1;1391 return getNonEmpty(std::move(Lower), std::move(Upper));1392}1393 1394ConstantRange ConstantRange::sdiv(const ConstantRange &RHS) const {1395 APInt Zero = APInt::getZero(getBitWidth());1396 APInt SignedMin = APInt::getSignedMinValue(getBitWidth());1397 1398 // We split up the LHS and RHS into positive and negative components1399 // and then also compute the positive and negative components of the result1400 // separately by combining division results with the appropriate signs.1401 auto [PosL, NegL] = splitPosNeg();1402 auto [PosR, NegR] = RHS.splitPosNeg();1403 1404 ConstantRange PosRes = getEmpty();1405 if (!PosL.isEmptySet() && !PosR.isEmptySet())1406 // pos / pos = pos.1407 PosRes = ConstantRange(PosL.Lower.sdiv(PosR.Upper - 1),1408 (PosL.Upper - 1).sdiv(PosR.Lower) + 1);1409 1410 if (!NegL.isEmptySet() && !NegR.isEmptySet()) {1411 // neg / neg = pos.1412 //1413 // We need to deal with one tricky case here: SignedMin / -1 is UB on the1414 // IR level, so we'll want to exclude this case when calculating bounds.1415 // (For APInts the operation is well-defined and yields SignedMin.) We1416 // handle this by dropping either SignedMin from the LHS or -1 from the RHS.1417 APInt Lo = (NegL.Upper - 1).sdiv(NegR.Lower);1418 if (NegL.Lower.isMinSignedValue() && NegR.Upper.isZero()) {1419 // Remove -1 from the LHS. Skip if it's the only element, as this would1420 // leave us with an empty set.1421 if (!NegR.Lower.isAllOnes()) {1422 APInt AdjNegRUpper;1423 if (RHS.Lower.isAllOnes())1424 // Negative part of [-1, X] without -1 is [SignedMin, X].1425 AdjNegRUpper = RHS.Upper;1426 else1427 // [X, -1] without -1 is [X, -2].1428 AdjNegRUpper = NegR.Upper - 1;1429 1430 PosRes = PosRes.unionWith(1431 ConstantRange(Lo, NegL.Lower.sdiv(AdjNegRUpper - 1) + 1));1432 }1433 1434 // Remove SignedMin from the RHS. Skip if it's the only element, as this1435 // would leave us with an empty set.1436 if (NegL.Upper != SignedMin + 1) {1437 APInt AdjNegLLower;1438 if (Upper == SignedMin + 1)1439 // Negative part of [X, SignedMin] without SignedMin is [X, -1].1440 AdjNegLLower = Lower;1441 else1442 // [SignedMin, X] without SignedMin is [SignedMin + 1, X].1443 AdjNegLLower = NegL.Lower + 1;1444 1445 PosRes = PosRes.unionWith(1446 ConstantRange(std::move(Lo),1447 AdjNegLLower.sdiv(NegR.Upper - 1) + 1));1448 }1449 } else {1450 PosRes = PosRes.unionWith(1451 ConstantRange(std::move(Lo), NegL.Lower.sdiv(NegR.Upper - 1) + 1));1452 }1453 }1454 1455 ConstantRange NegRes = getEmpty();1456 if (!PosL.isEmptySet() && !NegR.isEmptySet())1457 // pos / neg = neg.1458 NegRes = ConstantRange((PosL.Upper - 1).sdiv(NegR.Upper - 1),1459 PosL.Lower.sdiv(NegR.Lower) + 1);1460 1461 if (!NegL.isEmptySet() && !PosR.isEmptySet())1462 // neg / pos = neg.1463 NegRes = NegRes.unionWith(1464 ConstantRange(NegL.Lower.sdiv(PosR.Lower),1465 (NegL.Upper - 1).sdiv(PosR.Upper - 1) + 1));1466 1467 // Prefer a non-wrapping signed range here.1468 ConstantRange Res = NegRes.unionWith(PosRes, PreferredRangeType::Signed);1469 1470 // Preserve the zero that we dropped when splitting the LHS by sign.1471 if (contains(Zero) && (!PosR.isEmptySet() || !NegR.isEmptySet()))1472 Res = Res.unionWith(ConstantRange(Zero));1473 return Res;1474}1475 1476ConstantRange ConstantRange::urem(const ConstantRange &RHS) const {1477 if (isEmptySet() || RHS.isEmptySet() || RHS.getUnsignedMax().isZero())1478 return getEmpty();1479 1480 if (const APInt *RHSInt = RHS.getSingleElement()) {1481 // UREM by null is UB.1482 if (RHSInt->isZero())1483 return getEmpty();1484 // Use APInt's implementation of UREM for single element ranges.1485 if (const APInt *LHSInt = getSingleElement())1486 return {LHSInt->urem(*RHSInt)};1487 }1488 1489 // L % R for L < R is L.1490 if (getUnsignedMax().ult(RHS.getUnsignedMin()))1491 return *this;1492 1493 // L % R is <= L and < R.1494 APInt Upper = APIntOps::umin(getUnsignedMax(), RHS.getUnsignedMax() - 1) + 1;1495 return getNonEmpty(APInt::getZero(getBitWidth()), std::move(Upper));1496}1497 1498ConstantRange ConstantRange::srem(const ConstantRange &RHS) const {1499 if (isEmptySet() || RHS.isEmptySet())1500 return getEmpty();1501 1502 if (const APInt *RHSInt = RHS.getSingleElement()) {1503 // SREM by null is UB.1504 if (RHSInt->isZero())1505 return getEmpty();1506 // Use APInt's implementation of SREM for single element ranges.1507 if (const APInt *LHSInt = getSingleElement())1508 return {LHSInt->srem(*RHSInt)};1509 }1510 1511 ConstantRange AbsRHS = RHS.abs();1512 APInt MinAbsRHS = AbsRHS.getUnsignedMin();1513 APInt MaxAbsRHS = AbsRHS.getUnsignedMax();1514 1515 // Modulus by zero is UB.1516 if (MaxAbsRHS.isZero())1517 return getEmpty();1518 1519 if (MinAbsRHS.isZero())1520 ++MinAbsRHS;1521 1522 APInt MinLHS = getSignedMin(), MaxLHS = getSignedMax();1523 1524 if (MinLHS.isNonNegative()) {1525 // L % R for L < R is L.1526 if (MaxLHS.ult(MinAbsRHS))1527 return *this;1528 1529 // L % R is <= L and < R.1530 APInt Upper = APIntOps::umin(MaxLHS, MaxAbsRHS - 1) + 1;1531 return ConstantRange(APInt::getZero(getBitWidth()), std::move(Upper));1532 }1533 1534 // Same basic logic as above, but the result is negative.1535 if (MaxLHS.isNegative()) {1536 if (MinLHS.ugt(-MinAbsRHS))1537 return *this;1538 1539 APInt Lower = APIntOps::umax(MinLHS, -MaxAbsRHS + 1);1540 return ConstantRange(std::move(Lower), APInt(getBitWidth(), 1));1541 }1542 1543 // LHS range crosses zero.1544 APInt Lower = APIntOps::umax(MinLHS, -MaxAbsRHS + 1);1545 APInt Upper = APIntOps::umin(MaxLHS, MaxAbsRHS - 1) + 1;1546 return ConstantRange(std::move(Lower), std::move(Upper));1547}1548 1549ConstantRange ConstantRange::binaryNot() const {1550 return ConstantRange(APInt::getAllOnes(getBitWidth())).sub(*this);1551}1552 1553/// Estimate the 'bit-masked AND' operation's lower bound.1554///1555/// E.g., given two ranges as follows (single quotes are separators and1556/// have no meaning here),1557///1558/// LHS = [10'00101'1, ; LLo1559/// 10'10000'0] ; LHi1560/// RHS = [10'11111'0, ; RLo1561/// 10'11111'1] ; RHi1562///1563/// we know that the higher 2 bits of the result is always 10; and we also1564/// notice that RHS[1:6] are always 1, so the result[1:6] cannot be less than1565/// LHS[1:6] (i.e., 00101). Thus, the lower bound is 10'00101'0.1566///1567/// The algorithm is as follows,1568/// 1. we first calculate a mask to find the higher common bits by1569/// Mask = ~((LLo ^ LHi) | (RLo ^ RHi) | (LLo ^ RLo));1570/// Mask = clear all non-leading-ones bits in Mask;1571/// in the example, the Mask is set to 11'00000'0;1572/// 2. calculate a new mask by setting all common leading bits to 1 in RHS, and1573/// keeping the longest leading ones (i.e., 11'11111'0 in the example);1574/// 3. return (LLo & new mask) as the lower bound;1575/// 4. repeat the step 2 and 3 with LHS and RHS swapped, and update the lower1576/// bound with the larger one.1577static APInt estimateBitMaskedAndLowerBound(const ConstantRange &LHS,1578 const ConstantRange &RHS) {1579 auto BitWidth = LHS.getBitWidth();1580 // If either is full set or unsigned wrapped, then the range must contain '0'1581 // which leads the lower bound to 0.1582 if ((LHS.isFullSet() || RHS.isFullSet()) ||1583 (LHS.isWrappedSet() || RHS.isWrappedSet()))1584 return APInt::getZero(BitWidth);1585 1586 auto LLo = LHS.getLower();1587 auto LHi = LHS.getUpper() - 1;1588 auto RLo = RHS.getLower();1589 auto RHi = RHS.getUpper() - 1;1590 1591 // Calculate the mask for the higher common bits.1592 auto Mask = ~((LLo ^ LHi) | (RLo ^ RHi) | (LLo ^ RLo));1593 unsigned LeadingOnes = Mask.countLeadingOnes();1594 Mask.clearLowBits(BitWidth - LeadingOnes);1595 1596 auto estimateBound = [BitWidth, &Mask](APInt ALo, const APInt &BLo,1597 const APInt &BHi) {1598 unsigned LeadingOnes = ((BLo & BHi) | Mask).countLeadingOnes();1599 unsigned StartBit = BitWidth - LeadingOnes;1600 ALo.clearLowBits(StartBit);1601 return ALo;1602 };1603 1604 auto LowerBoundByLHS = estimateBound(LLo, RLo, RHi);1605 auto LowerBoundByRHS = estimateBound(RLo, LLo, LHi);1606 1607 return APIntOps::umax(LowerBoundByLHS, LowerBoundByRHS);1608}1609 1610ConstantRange ConstantRange::binaryAnd(const ConstantRange &Other) const {1611 if (isEmptySet() || Other.isEmptySet())1612 return getEmpty();1613 1614 ConstantRange KnownBitsRange =1615 fromKnownBits(toKnownBits() & Other.toKnownBits(), false);1616 auto LowerBound = estimateBitMaskedAndLowerBound(*this, Other);1617 ConstantRange UMinUMaxRange = getNonEmpty(1618 LowerBound, APIntOps::umin(Other.getUnsignedMax(), getUnsignedMax()) + 1);1619 return KnownBitsRange.intersectWith(UMinUMaxRange);1620}1621 1622ConstantRange ConstantRange::binaryOr(const ConstantRange &Other) const {1623 if (isEmptySet() || Other.isEmptySet())1624 return getEmpty();1625 1626 ConstantRange KnownBitsRange =1627 fromKnownBits(toKnownBits() | Other.toKnownBits(), false);1628 1629 // ~a & ~b >= x1630 // <=> ~(~a & ~b) <= ~x1631 // <=> a | b <= ~x1632 // <=> a | b < ~x + 1 = -x1633 // thus, UpperBound(a | b) == -LowerBound(~a & ~b)1634 auto UpperBound =1635 -estimateBitMaskedAndLowerBound(binaryNot(), Other.binaryNot());1636 // Upper wrapped range.1637 ConstantRange UMaxUMinRange = getNonEmpty(1638 APIntOps::umax(getUnsignedMin(), Other.getUnsignedMin()), UpperBound);1639 return KnownBitsRange.intersectWith(UMaxUMinRange);1640}1641 1642ConstantRange ConstantRange::binaryXor(const ConstantRange &Other) const {1643 if (isEmptySet() || Other.isEmptySet())1644 return getEmpty();1645 1646 // Use APInt's implementation of XOR for single element ranges.1647 if (isSingleElement() && Other.isSingleElement())1648 return {*getSingleElement() ^ *Other.getSingleElement()};1649 1650 // Special-case binary complement, since we can give a precise answer.1651 if (Other.isSingleElement() && Other.getSingleElement()->isAllOnes())1652 return binaryNot();1653 if (isSingleElement() && getSingleElement()->isAllOnes())1654 return Other.binaryNot();1655 1656 KnownBits LHSKnown = toKnownBits();1657 KnownBits RHSKnown = Other.toKnownBits();1658 KnownBits Known = LHSKnown ^ RHSKnown;1659 ConstantRange CR = fromKnownBits(Known, /*IsSigned*/ false);1660 // Typically the following code doesn't improve the result if BW = 1.1661 if (getBitWidth() == 1)1662 return CR;1663 1664 // If LHS is known to be the subset of RHS, treat LHS ^ RHS as RHS -nuw/nsw1665 // LHS. If RHS is known to be the subset of LHS, treat LHS ^ RHS as LHS1666 // -nuw/nsw RHS.1667 if ((~LHSKnown.Zero).isSubsetOf(RHSKnown.One))1668 CR = CR.intersectWith(Other.sub(*this), PreferredRangeType::Unsigned);1669 else if ((~RHSKnown.Zero).isSubsetOf(LHSKnown.One))1670 CR = CR.intersectWith(this->sub(Other), PreferredRangeType::Unsigned);1671 return CR;1672}1673 1674ConstantRange1675ConstantRange::shl(const ConstantRange &Other) const {1676 if (isEmptySet() || Other.isEmptySet())1677 return getEmpty();1678 1679 APInt Min = getUnsignedMin();1680 APInt Max = getUnsignedMax();1681 if (const APInt *RHS = Other.getSingleElement()) {1682 unsigned BW = getBitWidth();1683 if (RHS->uge(BW))1684 return getEmpty();1685 1686 unsigned EqualLeadingBits = (Min ^ Max).countl_zero();1687 if (RHS->ule(EqualLeadingBits))1688 return getNonEmpty(Min << *RHS, (Max << *RHS) + 1);1689 1690 return getNonEmpty(APInt::getZero(BW),1691 APInt::getBitsSetFrom(BW, RHS->getZExtValue()) + 1);1692 }1693 1694 APInt OtherMax = Other.getUnsignedMax();1695 if (isAllNegative() && OtherMax.ule(Min.countl_one())) {1696 // For negative numbers, if the shift does not overflow in a signed sense,1697 // a larger shift will make the number smaller.1698 Max <<= Other.getUnsignedMin();1699 Min <<= OtherMax;1700 return ConstantRange::getNonEmpty(std::move(Min), std::move(Max) + 1);1701 }1702 1703 // There's overflow!1704 if (OtherMax.ugt(Max.countl_zero()))1705 return getFull();1706 1707 // FIXME: implement the other tricky cases1708 1709 Min <<= Other.getUnsignedMin();1710 Max <<= OtherMax;1711 1712 return ConstantRange::getNonEmpty(std::move(Min), std::move(Max) + 1);1713}1714 1715static ConstantRange computeShlNUW(const ConstantRange &LHS,1716 const ConstantRange &RHS) {1717 unsigned BitWidth = LHS.getBitWidth();1718 bool Overflow;1719 APInt LHSMin = LHS.getUnsignedMin();1720 unsigned RHSMin = RHS.getUnsignedMin().getLimitedValue(BitWidth);1721 APInt MinShl = LHSMin.ushl_ov(RHSMin, Overflow);1722 if (Overflow)1723 return ConstantRange::getEmpty(BitWidth);1724 APInt LHSMax = LHS.getUnsignedMax();1725 unsigned RHSMax = RHS.getUnsignedMax().getLimitedValue(BitWidth);1726 APInt MaxShl = MinShl;1727 unsigned MaxShAmt = LHSMax.countLeadingZeros();1728 if (RHSMin <= MaxShAmt)1729 MaxShl = LHSMax << std::min(RHSMax, MaxShAmt);1730 RHSMin = std::max(RHSMin, MaxShAmt + 1);1731 RHSMax = std::min(RHSMax, LHSMin.countLeadingZeros());1732 if (RHSMin <= RHSMax)1733 MaxShl = APIntOps::umax(MaxShl,1734 APInt::getHighBitsSet(BitWidth, BitWidth - RHSMin));1735 return ConstantRange::getNonEmpty(MinShl, MaxShl + 1);1736}1737 1738static ConstantRange computeShlNSWWithNNegLHS(const APInt &LHSMin,1739 const APInt &LHSMax,1740 unsigned RHSMin,1741 unsigned RHSMax) {1742 unsigned BitWidth = LHSMin.getBitWidth();1743 bool Overflow;1744 APInt MinShl = LHSMin.sshl_ov(RHSMin, Overflow);1745 if (Overflow)1746 return ConstantRange::getEmpty(BitWidth);1747 APInt MaxShl = MinShl;1748 unsigned MaxShAmt = LHSMax.countLeadingZeros() - 1;1749 if (RHSMin <= MaxShAmt)1750 MaxShl = LHSMax << std::min(RHSMax, MaxShAmt);1751 RHSMin = std::max(RHSMin, MaxShAmt + 1);1752 RHSMax = std::min(RHSMax, LHSMin.countLeadingZeros() - 1);1753 if (RHSMin <= RHSMax)1754 MaxShl = APIntOps::umax(MaxShl,1755 APInt::getBitsSet(BitWidth, RHSMin, BitWidth - 1));1756 return ConstantRange::getNonEmpty(MinShl, MaxShl + 1);1757}1758 1759static ConstantRange computeShlNSWWithNegLHS(const APInt &LHSMin,1760 const APInt &LHSMax,1761 unsigned RHSMin, unsigned RHSMax) {1762 unsigned BitWidth = LHSMin.getBitWidth();1763 bool Overflow;1764 APInt MaxShl = LHSMax.sshl_ov(RHSMin, Overflow);1765 if (Overflow)1766 return ConstantRange::getEmpty(BitWidth);1767 APInt MinShl = MaxShl;1768 unsigned MaxShAmt = LHSMin.countLeadingOnes() - 1;1769 if (RHSMin <= MaxShAmt)1770 MinShl = LHSMin.shl(std::min(RHSMax, MaxShAmt));1771 RHSMin = std::max(RHSMin, MaxShAmt + 1);1772 RHSMax = std::min(RHSMax, LHSMax.countLeadingOnes() - 1);1773 if (RHSMin <= RHSMax)1774 MinShl = APInt::getSignMask(BitWidth);1775 return ConstantRange::getNonEmpty(MinShl, MaxShl + 1);1776}1777 1778static ConstantRange computeShlNSW(const ConstantRange &LHS,1779 const ConstantRange &RHS) {1780 unsigned BitWidth = LHS.getBitWidth();1781 unsigned RHSMin = RHS.getUnsignedMin().getLimitedValue(BitWidth);1782 unsigned RHSMax = RHS.getUnsignedMax().getLimitedValue(BitWidth);1783 APInt LHSMin = LHS.getSignedMin();1784 APInt LHSMax = LHS.getSignedMax();1785 if (LHSMin.isNonNegative())1786 return computeShlNSWWithNNegLHS(LHSMin, LHSMax, RHSMin, RHSMax);1787 else if (LHSMax.isNegative())1788 return computeShlNSWWithNegLHS(LHSMin, LHSMax, RHSMin, RHSMax);1789 return computeShlNSWWithNNegLHS(APInt::getZero(BitWidth), LHSMax, RHSMin,1790 RHSMax)1791 .unionWith(computeShlNSWWithNegLHS(LHSMin, APInt::getAllOnes(BitWidth),1792 RHSMin, RHSMax),1793 ConstantRange::Signed);1794}1795 1796ConstantRange ConstantRange::shlWithNoWrap(const ConstantRange &Other,1797 unsigned NoWrapKind,1798 PreferredRangeType RangeType) const {1799 if (isEmptySet() || Other.isEmptySet())1800 return getEmpty();1801 1802 switch (NoWrapKind) {1803 case 0:1804 return shl(Other);1805 case OverflowingBinaryOperator::NoSignedWrap:1806 return computeShlNSW(*this, Other);1807 case OverflowingBinaryOperator::NoUnsignedWrap:1808 return computeShlNUW(*this, Other);1809 case OverflowingBinaryOperator::NoSignedWrap |1810 OverflowingBinaryOperator::NoUnsignedWrap:1811 return computeShlNSW(*this, Other)1812 .intersectWith(computeShlNUW(*this, Other), RangeType);1813 default:1814 llvm_unreachable("Invalid NoWrapKind");1815 }1816}1817 1818ConstantRange1819ConstantRange::lshr(const ConstantRange &Other) const {1820 if (isEmptySet() || Other.isEmptySet())1821 return getEmpty();1822 1823 APInt max = getUnsignedMax().lshr(Other.getUnsignedMin()) + 1;1824 APInt min = getUnsignedMin().lshr(Other.getUnsignedMax());1825 return getNonEmpty(std::move(min), std::move(max));1826}1827 1828ConstantRange1829ConstantRange::ashr(const ConstantRange &Other) const {1830 if (isEmptySet() || Other.isEmptySet())1831 return getEmpty();1832 1833 // May straddle zero, so handle both positive and negative cases.1834 // 'PosMax' is the upper bound of the result of the ashr1835 // operation, when Upper of the LHS of ashr is a non-negative.1836 // number. Since ashr of a non-negative number will result in a1837 // smaller number, the Upper value of LHS is shifted right with1838 // the minimum value of 'Other' instead of the maximum value.1839 APInt PosMax = getSignedMax().ashr(Other.getUnsignedMin()) + 1;1840 1841 // 'PosMin' is the lower bound of the result of the ashr1842 // operation, when Lower of the LHS is a non-negative number.1843 // Since ashr of a non-negative number will result in a smaller1844 // number, the Lower value of LHS is shifted right with the1845 // maximum value of 'Other'.1846 APInt PosMin = getSignedMin().ashr(Other.getUnsignedMax());1847 1848 // 'NegMax' is the upper bound of the result of the ashr1849 // operation, when Upper of the LHS of ashr is a negative number.1850 // Since 'ashr' of a negative number will result in a bigger1851 // number, the Upper value of LHS is shifted right with the1852 // maximum value of 'Other'.1853 APInt NegMax = getSignedMax().ashr(Other.getUnsignedMax()) + 1;1854 1855 // 'NegMin' is the lower bound of the result of the ashr1856 // operation, when Lower of the LHS of ashr is a negative number.1857 // Since 'ashr' of a negative number will result in a bigger1858 // number, the Lower value of LHS is shifted right with the1859 // minimum value of 'Other'.1860 APInt NegMin = getSignedMin().ashr(Other.getUnsignedMin());1861 1862 APInt max, min;1863 if (getSignedMin().isNonNegative()) {1864 // Upper and Lower of LHS are non-negative.1865 min = PosMin;1866 max = PosMax;1867 } else if (getSignedMax().isNegative()) {1868 // Upper and Lower of LHS are negative.1869 min = NegMin;1870 max = NegMax;1871 } else {1872 // Upper is non-negative and Lower is negative.1873 min = NegMin;1874 max = PosMax;1875 }1876 return getNonEmpty(std::move(min), std::move(max));1877}1878 1879ConstantRange ConstantRange::uadd_sat(const ConstantRange &Other) const {1880 if (isEmptySet() || Other.isEmptySet())1881 return getEmpty();1882 1883 APInt NewL = getUnsignedMin().uadd_sat(Other.getUnsignedMin());1884 APInt NewU = getUnsignedMax().uadd_sat(Other.getUnsignedMax()) + 1;1885 return getNonEmpty(std::move(NewL), std::move(NewU));1886}1887 1888ConstantRange ConstantRange::sadd_sat(const ConstantRange &Other) const {1889 if (isEmptySet() || Other.isEmptySet())1890 return getEmpty();1891 1892 APInt NewL = getSignedMin().sadd_sat(Other.getSignedMin());1893 APInt NewU = getSignedMax().sadd_sat(Other.getSignedMax()) + 1;1894 return getNonEmpty(std::move(NewL), std::move(NewU));1895}1896 1897ConstantRange ConstantRange::usub_sat(const ConstantRange &Other) const {1898 if (isEmptySet() || Other.isEmptySet())1899 return getEmpty();1900 1901 APInt NewL = getUnsignedMin().usub_sat(Other.getUnsignedMax());1902 APInt NewU = getUnsignedMax().usub_sat(Other.getUnsignedMin()) + 1;1903 return getNonEmpty(std::move(NewL), std::move(NewU));1904}1905 1906ConstantRange ConstantRange::ssub_sat(const ConstantRange &Other) const {1907 if (isEmptySet() || Other.isEmptySet())1908 return getEmpty();1909 1910 APInt NewL = getSignedMin().ssub_sat(Other.getSignedMax());1911 APInt NewU = getSignedMax().ssub_sat(Other.getSignedMin()) + 1;1912 return getNonEmpty(std::move(NewL), std::move(NewU));1913}1914 1915ConstantRange ConstantRange::umul_sat(const ConstantRange &Other) const {1916 if (isEmptySet() || Other.isEmptySet())1917 return getEmpty();1918 1919 APInt NewL = getUnsignedMin().umul_sat(Other.getUnsignedMin());1920 APInt NewU = getUnsignedMax().umul_sat(Other.getUnsignedMax()) + 1;1921 return getNonEmpty(std::move(NewL), std::move(NewU));1922}1923 1924ConstantRange ConstantRange::smul_sat(const ConstantRange &Other) const {1925 if (isEmptySet() || Other.isEmptySet())1926 return getEmpty();1927 1928 // Because we could be dealing with negative numbers here, the lower bound is1929 // the smallest of the cartesian product of the lower and upper ranges;1930 // for example:1931 // [-1,4) * [-2,3) = min(-1*-2, -1*2, 3*-2, 3*2) = -6.1932 // Similarly for the upper bound, swapping min for max.1933 1934 APInt Min = getSignedMin();1935 APInt Max = getSignedMax();1936 APInt OtherMin = Other.getSignedMin();1937 APInt OtherMax = Other.getSignedMax();1938 1939 auto L = {Min.smul_sat(OtherMin), Min.smul_sat(OtherMax),1940 Max.smul_sat(OtherMin), Max.smul_sat(OtherMax)};1941 auto Compare = [](const APInt &A, const APInt &B) { return A.slt(B); };1942 return getNonEmpty(std::min(L, Compare), std::max(L, Compare) + 1);1943}1944 1945ConstantRange ConstantRange::ushl_sat(const ConstantRange &Other) const {1946 if (isEmptySet() || Other.isEmptySet())1947 return getEmpty();1948 1949 APInt NewL = getUnsignedMin().ushl_sat(Other.getUnsignedMin());1950 APInt NewU = getUnsignedMax().ushl_sat(Other.getUnsignedMax()) + 1;1951 return getNonEmpty(std::move(NewL), std::move(NewU));1952}1953 1954ConstantRange ConstantRange::sshl_sat(const ConstantRange &Other) const {1955 if (isEmptySet() || Other.isEmptySet())1956 return getEmpty();1957 1958 APInt Min = getSignedMin(), Max = getSignedMax();1959 APInt ShAmtMin = Other.getUnsignedMin(), ShAmtMax = Other.getUnsignedMax();1960 APInt NewL = Min.sshl_sat(Min.isNonNegative() ? ShAmtMin : ShAmtMax);1961 APInt NewU = Max.sshl_sat(Max.isNegative() ? ShAmtMin : ShAmtMax) + 1;1962 return getNonEmpty(std::move(NewL), std::move(NewU));1963}1964 1965ConstantRange ConstantRange::inverse() const {1966 if (isFullSet())1967 return getEmpty();1968 if (isEmptySet())1969 return getFull();1970 return ConstantRange(Upper, Lower);1971}1972 1973ConstantRange ConstantRange::abs(bool IntMinIsPoison) const {1974 if (isEmptySet())1975 return getEmpty();1976 1977 if (isSignWrappedSet()) {1978 APInt Lo;1979 // Check whether the range crosses zero.1980 if (Upper.isStrictlyPositive() || !Lower.isStrictlyPositive())1981 Lo = APInt::getZero(getBitWidth());1982 else1983 Lo = APIntOps::umin(Lower, -Upper + 1);1984 1985 // If SignedMin is not poison, then it is included in the result range.1986 if (IntMinIsPoison)1987 return ConstantRange(Lo, APInt::getSignedMinValue(getBitWidth()));1988 else1989 return ConstantRange(Lo, APInt::getSignedMinValue(getBitWidth()) + 1);1990 }1991 1992 APInt SMin = getSignedMin(), SMax = getSignedMax();1993 1994 // Skip SignedMin if it is poison.1995 if (IntMinIsPoison && SMin.isMinSignedValue()) {1996 // The range may become empty if it *only* contains SignedMin.1997 if (SMax.isMinSignedValue())1998 return getEmpty();1999 ++SMin;2000 }2001 2002 // All non-negative.2003 if (SMin.isNonNegative())2004 return ConstantRange(SMin, SMax + 1);2005 2006 // All negative.2007 if (SMax.isNegative())2008 return ConstantRange(-SMax, -SMin + 1);2009 2010 // Range crosses zero.2011 return ConstantRange::getNonEmpty(APInt::getZero(getBitWidth()),2012 APIntOps::umax(-SMin, SMax) + 1);2013}2014 2015ConstantRange ConstantRange::ctlz(bool ZeroIsPoison) const {2016 if (isEmptySet())2017 return getEmpty();2018 2019 APInt Zero = APInt::getZero(getBitWidth());2020 if (ZeroIsPoison && contains(Zero)) {2021 // ZeroIsPoison is set, and zero is contained. We discern three cases, in2022 // which a zero can appear:2023 // 1) Lower is zero, handling cases of kind [0, 1), [0, 2), etc.2024 // 2) Upper is zero, wrapped set, handling cases of kind [3, 0], etc.2025 // 3) Zero contained in a wrapped set, e.g., [3, 2), [3, 1), etc.2026 2027 if (getLower().isZero()) {2028 if ((getUpper() - 1).isZero()) {2029 // We have in input interval of kind [0, 1). In this case we cannot2030 // really help but return empty-set.2031 return getEmpty();2032 }2033 2034 // Compute the resulting range by excluding zero from Lower.2035 return ConstantRange(2036 APInt(getBitWidth(), (getUpper() - 1).countl_zero()),2037 APInt(getBitWidth(), (getLower() + 1).countl_zero() + 1));2038 } else if ((getUpper() - 1).isZero()) {2039 // Compute the resulting range by excluding zero from Upper.2040 return ConstantRange(Zero,2041 APInt(getBitWidth(), getLower().countl_zero() + 1));2042 } else {2043 return ConstantRange(Zero, APInt(getBitWidth(), getBitWidth()));2044 }2045 }2046 2047 // Zero is either safe or not in the range. The output range is composed by2048 // the result of countLeadingZero of the two extremes.2049 return getNonEmpty(APInt(getBitWidth(), getUnsignedMax().countl_zero()),2050 APInt(getBitWidth(), getUnsignedMin().countl_zero()) + 1);2051}2052 2053static ConstantRange getUnsignedCountTrailingZerosRange(const APInt &Lower,2054 const APInt &Upper) {2055 assert(!ConstantRange(Lower, Upper).isWrappedSet() &&2056 "Unexpected wrapped set.");2057 assert(Lower != Upper && "Unexpected empty set.");2058 unsigned BitWidth = Lower.getBitWidth();2059 if (Lower + 1 == Upper)2060 return ConstantRange(APInt(BitWidth, Lower.countr_zero()));2061 if (Lower.isZero())2062 return ConstantRange(APInt::getZero(BitWidth),2063 APInt(BitWidth, BitWidth + 1));2064 2065 // Calculate longest common prefix.2066 unsigned LCPLength = (Lower ^ (Upper - 1)).countl_zero();2067 // If Lower is {LCP, 000...}, the maximum is Lower.countr_zero().2068 // Otherwise, the maximum is BitWidth - LCPLength - 1 ({LCP, 100...}).2069 return ConstantRange(2070 APInt::getZero(BitWidth),2071 APInt(BitWidth,2072 std::max(BitWidth - LCPLength - 1, Lower.countr_zero()) + 1));2073}2074 2075ConstantRange ConstantRange::cttz(bool ZeroIsPoison) const {2076 if (isEmptySet())2077 return getEmpty();2078 2079 unsigned BitWidth = getBitWidth();2080 APInt Zero = APInt::getZero(BitWidth);2081 if (ZeroIsPoison && contains(Zero)) {2082 // ZeroIsPoison is set, and zero is contained. We discern three cases, in2083 // which a zero can appear:2084 // 1) Lower is zero, handling cases of kind [0, 1), [0, 2), etc.2085 // 2) Upper is zero, wrapped set, handling cases of kind [3, 0], etc.2086 // 3) Zero contained in a wrapped set, e.g., [3, 2), [3, 1), etc.2087 2088 if (Lower.isZero()) {2089 if (Upper == 1) {2090 // We have in input interval of kind [0, 1). In this case we cannot2091 // really help but return empty-set.2092 return getEmpty();2093 }2094 2095 // Compute the resulting range by excluding zero from Lower.2096 return getUnsignedCountTrailingZerosRange(APInt(BitWidth, 1), Upper);2097 } else if (Upper == 1) {2098 // Compute the resulting range by excluding zero from Upper.2099 return getUnsignedCountTrailingZerosRange(Lower, Zero);2100 } else {2101 ConstantRange CR1 = getUnsignedCountTrailingZerosRange(Lower, Zero);2102 ConstantRange CR2 =2103 getUnsignedCountTrailingZerosRange(APInt(BitWidth, 1), Upper);2104 return CR1.unionWith(CR2);2105 }2106 }2107 2108 if (isFullSet())2109 return getNonEmpty(Zero, APInt(BitWidth, BitWidth) + 1);2110 if (!isWrappedSet())2111 return getUnsignedCountTrailingZerosRange(Lower, Upper);2112 // The range is wrapped. We decompose it into two ranges, [0, Upper) and2113 // [Lower, 0).2114 // Handle [Lower, 0)2115 ConstantRange CR1 = getUnsignedCountTrailingZerosRange(Lower, Zero);2116 // Handle [0, Upper)2117 ConstantRange CR2 = getUnsignedCountTrailingZerosRange(Zero, Upper);2118 return CR1.unionWith(CR2);2119}2120 2121static ConstantRange getUnsignedPopCountRange(const APInt &Lower,2122 const APInt &Upper) {2123 assert(!ConstantRange(Lower, Upper).isWrappedSet() &&2124 "Unexpected wrapped set.");2125 assert(Lower != Upper && "Unexpected empty set.");2126 unsigned BitWidth = Lower.getBitWidth();2127 if (Lower + 1 == Upper)2128 return ConstantRange(APInt(BitWidth, Lower.popcount()));2129 2130 APInt Max = Upper - 1;2131 // Calculate longest common prefix.2132 unsigned LCPLength = (Lower ^ Max).countl_zero();2133 unsigned LCPPopCount = Lower.getHiBits(LCPLength).popcount();2134 // If Lower is {LCP, 000...}, the minimum is the popcount of LCP.2135 // Otherwise, the minimum is the popcount of LCP + 1.2136 unsigned MinBits =2137 LCPPopCount + (Lower.countr_zero() < BitWidth - LCPLength ? 1 : 0);2138 // If Max is {LCP, 111...}, the maximum is the popcount of LCP + (BitWidth -2139 // length of LCP).2140 // Otherwise, the minimum is the popcount of LCP + (BitWidth -2141 // length of LCP - 1).2142 unsigned MaxBits = LCPPopCount + (BitWidth - LCPLength) -2143 (Max.countr_one() < BitWidth - LCPLength ? 1 : 0);2144 return ConstantRange(APInt(BitWidth, MinBits), APInt(BitWidth, MaxBits + 1));2145}2146 2147ConstantRange ConstantRange::ctpop() const {2148 if (isEmptySet())2149 return getEmpty();2150 2151 unsigned BitWidth = getBitWidth();2152 APInt Zero = APInt::getZero(BitWidth);2153 if (isFullSet())2154 return getNonEmpty(Zero, APInt(BitWidth, BitWidth) + 1);2155 if (!isWrappedSet())2156 return getUnsignedPopCountRange(Lower, Upper);2157 // The range is wrapped. We decompose it into two ranges, [0, Upper) and2158 // [Lower, 0).2159 // Handle [Lower, 0) == [Lower, Max]2160 ConstantRange CR1 = ConstantRange(APInt(BitWidth, Lower.countl_one()),2161 APInt(BitWidth, BitWidth + 1));2162 // Handle [0, Upper)2163 ConstantRange CR2 = getUnsignedPopCountRange(Zero, Upper);2164 return CR1.unionWith(CR2);2165}2166 2167ConstantRange::OverflowResult ConstantRange::unsignedAddMayOverflow(2168 const ConstantRange &Other) const {2169 if (isEmptySet() || Other.isEmptySet())2170 return OverflowResult::MayOverflow;2171 2172 APInt Min = getUnsignedMin(), Max = getUnsignedMax();2173 APInt OtherMin = Other.getUnsignedMin(), OtherMax = Other.getUnsignedMax();2174 2175 // a u+ b overflows high iff a u> ~b.2176 if (Min.ugt(~OtherMin))2177 return OverflowResult::AlwaysOverflowsHigh;2178 if (Max.ugt(~OtherMax))2179 return OverflowResult::MayOverflow;2180 return OverflowResult::NeverOverflows;2181}2182 2183ConstantRange::OverflowResult ConstantRange::signedAddMayOverflow(2184 const ConstantRange &Other) const {2185 if (isEmptySet() || Other.isEmptySet())2186 return OverflowResult::MayOverflow;2187 2188 APInt Min = getSignedMin(), Max = getSignedMax();2189 APInt OtherMin = Other.getSignedMin(), OtherMax = Other.getSignedMax();2190 2191 APInt SignedMin = APInt::getSignedMinValue(getBitWidth());2192 APInt SignedMax = APInt::getSignedMaxValue(getBitWidth());2193 2194 // a s+ b overflows high iff a s>=0 && b s>= 0 && a s> smax - b.2195 // a s+ b overflows low iff a s< 0 && b s< 0 && a s< smin - b.2196 if (Min.isNonNegative() && OtherMin.isNonNegative() &&2197 Min.sgt(SignedMax - OtherMin))2198 return OverflowResult::AlwaysOverflowsHigh;2199 if (Max.isNegative() && OtherMax.isNegative() &&2200 Max.slt(SignedMin - OtherMax))2201 return OverflowResult::AlwaysOverflowsLow;2202 2203 if (Max.isNonNegative() && OtherMax.isNonNegative() &&2204 Max.sgt(SignedMax - OtherMax))2205 return OverflowResult::MayOverflow;2206 if (Min.isNegative() && OtherMin.isNegative() &&2207 Min.slt(SignedMin - OtherMin))2208 return OverflowResult::MayOverflow;2209 2210 return OverflowResult::NeverOverflows;2211}2212 2213ConstantRange::OverflowResult ConstantRange::unsignedSubMayOverflow(2214 const ConstantRange &Other) const {2215 if (isEmptySet() || Other.isEmptySet())2216 return OverflowResult::MayOverflow;2217 2218 APInt Min = getUnsignedMin(), Max = getUnsignedMax();2219 APInt OtherMin = Other.getUnsignedMin(), OtherMax = Other.getUnsignedMax();2220 2221 // a u- b overflows low iff a u< b.2222 if (Max.ult(OtherMin))2223 return OverflowResult::AlwaysOverflowsLow;2224 if (Min.ult(OtherMax))2225 return OverflowResult::MayOverflow;2226 return OverflowResult::NeverOverflows;2227}2228 2229ConstantRange::OverflowResult ConstantRange::signedSubMayOverflow(2230 const ConstantRange &Other) const {2231 if (isEmptySet() || Other.isEmptySet())2232 return OverflowResult::MayOverflow;2233 2234 APInt Min = getSignedMin(), Max = getSignedMax();2235 APInt OtherMin = Other.getSignedMin(), OtherMax = Other.getSignedMax();2236 2237 APInt SignedMin = APInt::getSignedMinValue(getBitWidth());2238 APInt SignedMax = APInt::getSignedMaxValue(getBitWidth());2239 2240 // a s- b overflows high iff a s>=0 && b s< 0 && a s> smax + b.2241 // a s- b overflows low iff a s< 0 && b s>= 0 && a s< smin + b.2242 if (Min.isNonNegative() && OtherMax.isNegative() &&2243 Min.sgt(SignedMax + OtherMax))2244 return OverflowResult::AlwaysOverflowsHigh;2245 if (Max.isNegative() && OtherMin.isNonNegative() &&2246 Max.slt(SignedMin + OtherMin))2247 return OverflowResult::AlwaysOverflowsLow;2248 2249 if (Max.isNonNegative() && OtherMin.isNegative() &&2250 Max.sgt(SignedMax + OtherMin))2251 return OverflowResult::MayOverflow;2252 if (Min.isNegative() && OtherMax.isNonNegative() &&2253 Min.slt(SignedMin + OtherMax))2254 return OverflowResult::MayOverflow;2255 2256 return OverflowResult::NeverOverflows;2257}2258 2259ConstantRange::OverflowResult ConstantRange::unsignedMulMayOverflow(2260 const ConstantRange &Other) const {2261 if (isEmptySet() || Other.isEmptySet())2262 return OverflowResult::MayOverflow;2263 2264 APInt Min = getUnsignedMin(), Max = getUnsignedMax();2265 APInt OtherMin = Other.getUnsignedMin(), OtherMax = Other.getUnsignedMax();2266 bool Overflow;2267 2268 (void) Min.umul_ov(OtherMin, Overflow);2269 if (Overflow)2270 return OverflowResult::AlwaysOverflowsHigh;2271 2272 (void) Max.umul_ov(OtherMax, Overflow);2273 if (Overflow)2274 return OverflowResult::MayOverflow;2275 2276 return OverflowResult::NeverOverflows;2277}2278 2279void ConstantRange::print(raw_ostream &OS) const {2280 if (isFullSet())2281 OS << "full-set";2282 else if (isEmptySet())2283 OS << "empty-set";2284 else2285 OS << "[" << Lower << "," << Upper << ")";2286}2287 2288#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)2289LLVM_DUMP_METHOD void ConstantRange::dump() const {2290 print(dbgs());2291}2292#endif2293 2294ConstantRange llvm::getConstantRangeFromMetadata(const MDNode &Ranges) {2295 const unsigned NumRanges = Ranges.getNumOperands() / 2;2296 assert(NumRanges >= 1 && "Must have at least one range!");2297 assert(Ranges.getNumOperands() % 2 == 0 && "Must be a sequence of pairs");2298 2299 auto *FirstLow = mdconst::extract<ConstantInt>(Ranges.getOperand(0));2300 auto *FirstHigh = mdconst::extract<ConstantInt>(Ranges.getOperand(1));2301 2302 ConstantRange CR(FirstLow->getValue(), FirstHigh->getValue());2303 2304 for (unsigned i = 1; i < NumRanges; ++i) {2305 auto *Low = mdconst::extract<ConstantInt>(Ranges.getOperand(2 * i + 0));2306 auto *High = mdconst::extract<ConstantInt>(Ranges.getOperand(2 * i + 1));2307 2308 // Note: unionWith will potentially create a range that contains values not2309 // contained in any of the original N ranges.2310 CR = CR.unionWith(ConstantRange(Low->getValue(), High->getValue()));2311 }2312 2313 return CR;2314}2315