diff options
Diffstat (limited to 'lib/IR/ConstantRange.cpp')
-rw-r--r-- | lib/IR/ConstantRange.cpp | 29 |
1 files changed, 20 insertions, 9 deletions
diff --git a/lib/IR/ConstantRange.cpp b/lib/IR/ConstantRange.cpp index 5425676e4edc..aeb1257754f3 100644 --- a/lib/IR/ConstantRange.cpp +++ b/lib/IR/ConstantRange.cpp @@ -251,7 +251,7 @@ APInt ConstantRange::getSetSize() const { } bool -ConstantRange::isSizeStrictlySmallerThanOf(const ConstantRange &Other) const { +ConstantRange::isSizeStrictlySmallerThan(const ConstantRange &Other) const { assert(getBitWidth() == Other.getBitWidth()); if (isFullSet()) return false; @@ -260,6 +260,17 @@ ConstantRange::isSizeStrictlySmallerThanOf(const ConstantRange &Other) const { return (Upper - Lower).ult(Other.Upper - Other.Lower); } +bool +ConstantRange::isSizeLargerThan(uint64_t MaxSize) const { + assert(MaxSize && "MaxSize can't be 0."); + // If this a full set, we need special handling to avoid needing an extra bit + // to represent the size. + if (isFullSet()) + return APInt::getMaxValue(getBitWidth()).ugt(MaxSize - 1); + + return (Upper - Lower).ugt(MaxSize); +} + APInt ConstantRange::getUnsignedMax() const { if (isFullSet() || isWrappedSet()) return APInt::getMaxValue(getBitWidth()); @@ -374,7 +385,7 @@ ConstantRange ConstantRange::intersectWith(const ConstantRange &CR) const { if (CR.Upper.ule(Lower)) return ConstantRange(CR.Lower, Upper); - if (isSizeStrictlySmallerThanOf(CR)) + if (isSizeStrictlySmallerThan(CR)) return *this; return CR; } @@ -389,7 +400,7 @@ ConstantRange ConstantRange::intersectWith(const ConstantRange &CR) const { if (CR.Upper.ult(Upper)) { if (CR.Lower.ult(Upper)) { - if (isSizeStrictlySmallerThanOf(CR)) + if (isSizeStrictlySmallerThan(CR)) return *this; return CR; } @@ -405,7 +416,7 @@ ConstantRange ConstantRange::intersectWith(const ConstantRange &CR) const { return ConstantRange(CR.Lower, Upper); } - if (isSizeStrictlySmallerThanOf(CR)) + if (isSizeStrictlySmallerThan(CR)) return *this; return CR; } @@ -676,8 +687,8 @@ ConstantRange::add(const ConstantRange &Other) const { return ConstantRange(getBitWidth(), /*isFullSet=*/true); ConstantRange X = ConstantRange(std::move(NewLower), std::move(NewUpper)); - if (X.isSizeStrictlySmallerThanOf(*this) || - X.isSizeStrictlySmallerThanOf(Other)) + if (X.isSizeStrictlySmallerThan(*this) || + X.isSizeStrictlySmallerThan(Other)) // We've wrapped, therefore, full set. return ConstantRange(getBitWidth(), /*isFullSet=*/true); return X; @@ -709,8 +720,8 @@ ConstantRange::sub(const ConstantRange &Other) const { return ConstantRange(getBitWidth(), /*isFullSet=*/true); ConstantRange X = ConstantRange(std::move(NewLower), std::move(NewUpper)); - if (X.isSizeStrictlySmallerThanOf(*this) || - X.isSizeStrictlySmallerThanOf(Other)) + if (X.isSizeStrictlySmallerThan(*this) || + X.isSizeStrictlySmallerThan(Other)) // We've wrapped, therefore, full set. return ConstantRange(getBitWidth(), /*isFullSet=*/true); return X; @@ -766,7 +777,7 @@ ConstantRange::multiply(const ConstantRange &Other) const { ConstantRange Result_sext(std::min(L, Compare), std::max(L, Compare) + 1); ConstantRange SR = Result_sext.truncate(getBitWidth()); - return UR.isSizeStrictlySmallerThanOf(SR) ? UR : SR; + return UR.isSizeStrictlySmallerThan(SR) ? UR : SR; } ConstantRange |