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