LLVM 17.0.0git
llvm::ConstantRange Class Reference

This class represents a range of values. More...

#include "llvm/IR/ConstantRange.h"

Public Types

enum  PreferredRangeType { Smallest , Unsigned , Signed }
If represented precisely, the result of some range operations may consist of multiple disjoint ranges. More...

enum class  OverflowResult { AlwaysOverflowsLow , AlwaysOverflowsHigh , MayOverflow , NeverOverflows }
Represents whether an operation on the given constant range is known to always or never overflow. More...

Public Member Functions

ConstantRange (uint32_t BitWidth, bool isFullSet)
Initialize a full or empty set for the specified bit width.

ConstantRange (APInt Value)
Initialize a range to hold the single specified value.

ConstantRange (APInt Lower, APInt Upper)
Initialize a range of values explicitly.

bool icmp (CmpInst::Predicate Pred, const ConstantRange &Other) const
Does the predicate Pred hold between ranges this and Other? NOTE: false does not mean that inverse predicate holds!

bool getEquivalentICmp (CmpInst::Predicate &Pred, APInt &RHS) const
Set up Pred and RHS such that ConstantRange::makeExactICmpRegion(Pred, RHS) == *this.

void getEquivalentICmp (CmpInst::Predicate &Pred, APInt &RHS, APInt &Offset) const
Set up Pred, RHS and Offset such that (V + Offset) Pred RHS is true iff V is in the range.

const APIntgetLower () const
Return the lower value for this range.

const APIntgetUpper () const
Return the upper value for this range.

uint32_t getBitWidth () const
Get the bit width of this ConstantRange.

bool isFullSet () const
Return true if this set contains all of the elements possible for this data-type.

bool isEmptySet () const
Return true if this set contains no members.

bool isWrappedSet () const
Return true if this set wraps around the unsigned domain.

bool isUpperWrapped () const
Return true if the exclusive upper bound wraps around the unsigned domain.

bool isSignWrappedSet () const
Return true if this set wraps around the signed domain.

bool isUpperSignWrapped () const
Return true if the (exclusive) upper bound wraps around the signed domain.

bool contains (const APInt &Val) const
Return true if the specified value is in the set.

bool contains (const ConstantRange &CR) const
Return true if the other range is a subset of this one.

const APIntgetSingleElement () const
If this set contains a single element, return it, otherwise return null.

const APIntgetSingleMissingElement () const
If this set contains all but a single element, return it, otherwise return null.

bool isSingleElement () const
Return true if this set contains exactly one member.

bool isSizeStrictlySmallerThan (const ConstantRange &CR) const
Compare set size of this range with the range CR.

bool isSizeLargerThan (uint64_t MaxSize) const
Compare set size of this range with Value.

bool isAllNegative () const
Return true if all values in this range are negative.

bool isAllNonNegative () const
Return true if all values in this range are non-negative.

APInt getUnsignedMax () const
Return the largest unsigned value contained in the ConstantRange.

APInt getUnsignedMin () const
Return the smallest unsigned value contained in the ConstantRange.

APInt getSignedMax () const
Return the largest signed value contained in the ConstantRange.

APInt getSignedMin () const
Return the smallest signed value contained in the ConstantRange.

bool operator== (const ConstantRange &CR) const
Return true if this range is equal to another range.

bool operator!= (const ConstantRange &CR) const

unsigned getActiveBits () const
Compute the maximal number of active bits needed to represent every value in this range.

unsigned getMinSignedBits () const
Compute the maximal number of bits needed to represent every value in this signed range.

ConstantRange subtract (const APInt &CI) const
Subtract the specified constant from the endpoints of this constant range.

ConstantRange difference (const ConstantRange &CR) const
Subtract the specified range from this range (aka relative complement of the sets).

ConstantRange intersectWith (const ConstantRange &CR, PreferredRangeType Type=Smallest) const
Return the range that results from the intersection of this range with another range.

ConstantRange unionWith (const ConstantRange &CR, PreferredRangeType Type=Smallest) const
Return the range that results from the union of this range with another range.

std::optional< ConstantRangeexactIntersectWith (const ConstantRange &CR) const
Intersect the two ranges and return the result if it can be represented exactly, otherwise return std::nullopt.

std::optional< ConstantRangeexactUnionWith (const ConstantRange &CR) const
Union the two ranges and return the result if it can be represented exactly, otherwise return std::nullopt.

ConstantRange castOp (Instruction::CastOps CastOp, uint32_t BitWidth) const
Return a new range representing the possible values resulting from an application of the specified cast operator to this range.

ConstantRange zeroExtend (uint32_t BitWidth) const
Return a new range in the specified integer type, which must be strictly larger than the current type.

ConstantRange signExtend (uint32_t BitWidth) const
Return a new range in the specified integer type, which must be strictly larger than the current type.

ConstantRange truncate (uint32_t BitWidth) const
Return a new range in the specified integer type, which must be strictly smaller than the current type.

ConstantRange zextOrTrunc (uint32_t BitWidth) const
Make this range have the bit width given by BitWidth.

ConstantRange sextOrTrunc (uint32_t BitWidth) const
Make this range have the bit width given by BitWidth.

ConstantRange binaryOp (Instruction::BinaryOps BinOp, const ConstantRange &Other) const
Return a new range representing the possible values resulting from an application of the specified binary operator to an left hand side of this range and a right hand side of Other.

ConstantRange overflowingBinaryOp (Instruction::BinaryOps BinOp, const ConstantRange &Other, unsigned NoWrapKind) const
Return a new range representing the possible values resulting from an application of the specified overflowing binary operator to a left hand side of this range and a right hand side of Other given the provided knowledge about lack of wrapping NoWrapKind.

ConstantRange add (const ConstantRange &Other) const
Return a new range representing the possible values resulting from an addition of a value in this range and a value in Other.

ConstantRange addWithNoWrap (const ConstantRange &Other, unsigned NoWrapKind, PreferredRangeType RangeType=Smallest) const
Return a new range representing the possible values resulting from an addition with wrap type NoWrapKind of a value in this range and a value in Other.

ConstantRange sub (const ConstantRange &Other) const
Return a new range representing the possible values resulting from a subtraction of a value in this range and a value in Other.

ConstantRange subWithNoWrap (const ConstantRange &Other, unsigned NoWrapKind, PreferredRangeType RangeType=Smallest) const
Return a new range representing the possible values resulting from an subtraction with wrap type NoWrapKind of a value in this range and a value in Other.

ConstantRange multiply (const ConstantRange &Other) const
Return a new range representing the possible values resulting from a multiplication of a value in this range and a value in Other, treating both this and Other as unsigned ranges.

ConstantRange smul_fast (const ConstantRange &Other) const
Return range of possible values for a signed multiplication of this and Other.

ConstantRange smax (const ConstantRange &Other) const
Return a new range representing the possible values resulting from a signed maximum of a value in this range and a value in Other.

ConstantRange umax (const ConstantRange &Other) const
Return a new range representing the possible values resulting from an unsigned maximum of a value in this range and a value in Other.

ConstantRange smin (const ConstantRange &Other) const
Return a new range representing the possible values resulting from a signed minimum of a value in this range and a value in Other.

ConstantRange umin (const ConstantRange &Other) const
Return a new range representing the possible values resulting from an unsigned minimum of a value in this range and a value in Other.

ConstantRange udiv (const ConstantRange &Other) const
Return a new range representing the possible values resulting from an unsigned division of a value in this range and a value in Other.

ConstantRange sdiv (const ConstantRange &Other) const
Return a new range representing the possible values resulting from a signed division of a value in this range and a value in Other.

ConstantRange urem (const ConstantRange &Other) const
Return a new range representing the possible values resulting from an unsigned remainder operation of a value in this range and a value in Other.

ConstantRange srem (const ConstantRange &Other) const
Return a new range representing the possible values resulting from a signed remainder operation of a value in this range and a value in Other.

ConstantRange binaryNot () const
Return a new range representing the possible values resulting from a binary-xor of a value in this range by an all-one value, aka bitwise complement operation.

ConstantRange binaryAnd (const ConstantRange &Other) const
Return a new range representing the possible values resulting from a binary-and of a value in this range by a value in Other.

ConstantRange binaryOr (const ConstantRange &Other) const
Return a new range representing the possible values resulting from a binary-or of a value in this range by a value in Other.

ConstantRange binaryXor (const ConstantRange &Other) const
Return a new range representing the possible values resulting from a binary-xor of a value in this range by a value in Other.

ConstantRange shl (const ConstantRange &Other) const
Return a new range representing the possible values resulting from a left shift of a value in this range by a value in Other.

ConstantRange lshr (const ConstantRange &Other) const
Return a new range representing the possible values resulting from a logical right shift of a value in this range and a value in Other.

ConstantRange ashr (const ConstantRange &Other) const
Return a new range representing the possible values resulting from a arithmetic right shift of a value in this range and a value in Other.

ConstantRange uadd_sat (const ConstantRange &Other) const
Perform an unsigned saturating addition of two constant ranges.

ConstantRange sadd_sat (const ConstantRange &Other) const
Perform a signed saturating addition of two constant ranges.

ConstantRange usub_sat (const ConstantRange &Other) const
Perform an unsigned saturating subtraction of two constant ranges.

ConstantRange ssub_sat (const ConstantRange &Other) const
Perform a signed saturating subtraction of two constant ranges.

ConstantRange umul_sat (const ConstantRange &Other) const
Perform an unsigned saturating multiplication of two constant ranges.

ConstantRange smul_sat (const ConstantRange &Other) const
Perform a signed saturating multiplication of two constant ranges.

ConstantRange ushl_sat (const ConstantRange &Other) const
Perform an unsigned saturating left shift of this constant range by a value in Other.

ConstantRange sshl_sat (const ConstantRange &Other) const
Perform a signed saturating left shift of this constant range by a value in Other.

ConstantRange inverse () const
Return a new range that is the logical not of the current set.

ConstantRange abs (bool IntMinIsPoison=false) const
Calculate absolute value range.

OverflowResult unsignedAddMayOverflow (const ConstantRange &Other) const
Return whether unsigned add of the two ranges always/never overflows.

OverflowResult signedAddMayOverflow (const ConstantRange &Other) const
Return whether signed add of the two ranges always/never overflows.

OverflowResult unsignedSubMayOverflow (const ConstantRange &Other) const
Return whether unsigned sub of the two ranges always/never overflows.

OverflowResult signedSubMayOverflow (const ConstantRange &Other) const
Return whether signed sub of the two ranges always/never overflows.

OverflowResult unsignedMulMayOverflow (const ConstantRange &Other) const
Return whether unsigned mul of the two ranges always/never overflows.

KnownBits toKnownBits () const
Return known bits for values in this range.

void print (raw_ostream &OS) const
Print out the bounds to a stream.

void dump () const
Allow printing from a debugger easily.

Static Public Member Functions

static ConstantRange getEmpty (uint32_t BitWidth)
Create empty constant range with the given bit width.

static ConstantRange getFull (uint32_t BitWidth)
Create full constant range with the given bit width.

static ConstantRange getNonEmpty (APInt Lower, APInt Upper)
Create non-empty constant range with the given bounds.

static ConstantRange fromKnownBits (const KnownBits &Known, bool IsSigned)
Initialize a range based on a known bits constraint.

static ConstantRange makeAllowedICmpRegion (CmpInst::Predicate Pred, const ConstantRange &Other)
Produce the smallest range such that all values that may satisfy the given predicate with any value contained within Other is contained in the returned range.

static ConstantRange makeSatisfyingICmpRegion (CmpInst::Predicate Pred, const ConstantRange &Other)
Produce the largest range such that all values in the returned range satisfy the given predicate with all values contained within Other.

static ConstantRange makeExactICmpRegion (CmpInst::Predicate Pred, const APInt &Other)
Produce the exact range such that all values in the returned range satisfy the given predicate with any value contained within Other.

static bool areInsensitiveToSignednessOfICmpPredicate (const ConstantRange &CR1, const ConstantRange &CR2)
Return true iff CR1 ult CR2 is equivalent to CR1 slt CR2.

static bool areInsensitiveToSignednessOfInvertedICmpPredicate (const ConstantRange &CR1, const ConstantRange &CR2)
Return true iff CR1 ult CR2 is equivalent to CR1 sge CR2.

static CmpInst::Predicate getEquivalentPredWithFlippedSignedness (CmpInst::Predicate Pred, const ConstantRange &CR1, const ConstantRange &CR2)
If the comparison between constant ranges this and Other is insensitive to the signedness of the comparison predicate, return a predicate equivalent to Pred, with flipped signedness (i.e.

static ConstantRange makeGuaranteedNoWrapRegion (Instruction::BinaryOps BinOp, const ConstantRange &Other, unsigned NoWrapKind)
Produce the largest range containing all X such that "X BinOp Y" is guaranteed not to wrap (overflow) for all Y in Other.

static ConstantRange makeExactNoWrapRegion (Instruction::BinaryOps BinOp, const APInt &Other, unsigned NoWrapKind)
Produce the range that contains X if and only if "X BinOp Other" does not wrap.

static bool isIntrinsicSupported (Intrinsic::ID IntrinsicID)
Returns true if ConstantRange calculations are supported for intrinsic with IntrinsicID.

static ConstantRange intrinsic (Intrinsic::ID IntrinsicID, ArrayRef< ConstantRange > Ops)
Compute range of intrinsic result for the given operand ranges.

Detailed Description

This class represents a range of values.

Definition at line 47 of file ConstantRange.h.

◆ OverflowResult

 enum class llvm::ConstantRange::OverflowResult
strong

Represents whether an operation on the given constant range is known to always or never overflow.

Enumerator
AlwaysOverflowsLow

Always overflows in the direction of signed/unsigned min value.

AlwaysOverflowsHigh

Always overflows in the direction of signed/unsigned max value.

MayOverflow

May or may not overflow.

NeverOverflows

Never overflows.

Definition at line 531 of file ConstantRange.h.

◆ PreferredRangeType

If represented precisely, the result of some range operations may consist of multiple disjoint ranges.

As only a single range may be returned, any range covering these disjoint ranges constitutes a valid result, but some may be more useful than others depending on context. The preferred range type specifies whether a range that is non-wrapping in the unsigned or signed domain, or has the smallest size, is preferred. If a signedness is preferred but all ranges are non-wrapping or all wrapping, then the smallest set size is preferred. If there are multiple smallest sets, any one of them may be returned.

Enumerator
Smallest
Unsigned
Signed

Definition at line 319 of file ConstantRange.h.

◆ ConstantRange() [1/3]

 ConstantRange::ConstantRange ( uint32_t BitWidth, bool isFullSet )
explicit

Initialize a full or empty set for the specified bit width.

Definition at line 44 of file ConstantRange.cpp.

◆ ConstantRange() [2/3]

 ConstantRange::ConstantRange ( APInt Value )

Initialize a range to hold the single specified value.

Definition at line 48 of file ConstantRange.cpp.

◆ ConstantRange() [3/3]

 ConstantRange::ConstantRange ( APInt Lower, APInt Upper )

Initialize a range of values explicitly.

This will assert out if Lower==Upper and Lower != Min or Max value for its type. It will also assert out if the two APInt's are not the same bit width.

Definition at line 51 of file ConstantRange.cpp.

◆ abs()

 ConstantRange ConstantRange::abs ( bool IntMinIsPoison = false ) const

Calculate absolute value range.

If the original range contains signed min, then the resulting range will contain signed min if and only if IntMinIsPoison is false.

Definition at line 1628 of file ConstantRange.cpp.

Referenced by processSRem().

 ConstantRange ConstantRange::add ( const ConstantRange & Other ) const

Return a new range representing the possible values resulting from an addition of a value in this range and a value in Other.

Definition at line 986 of file ConstantRange.cpp.

References getLower(), getUpper(), isEmptySet(), isFullSet(), llvm::Other, and X.

 ConstantRange ConstantRange::addWithNoWrap ( const ConstantRange & Other, unsigned NoWrapKind, PreferredRangeType RangeType = Smallest ) const

Return a new range representing the possible values resulting from an addition with wrap type NoWrapKind of a value in this range and a value in Other.

If the result range is disjoint, the preferred range is determined by the PreferredRangeType.

Definition at line 1005 of file ConstantRange.cpp.

Referenced by overflowingBinaryOp().

◆ areInsensitiveToSignednessOfICmpPredicate()

 bool ConstantRange::areInsensitiveToSignednessOfICmpPredicate ( const ConstantRange & CR1, const ConstantRange & CR2 )
static

Return true iff CR1 ult CR2 is equivalent to CR1 slt CR2.

Does not depend on strictness/direction of the predicate.

Definition at line 169 of file ConstantRange.cpp.

References isAllNegative(), isAllNonNegative(), and isEmptySet().

Referenced by getEquivalentPredWithFlippedSignedness().

◆ areInsensitiveToSignednessOfInvertedICmpPredicate()

 bool ConstantRange::areInsensitiveToSignednessOfInvertedICmpPredicate ( const ConstantRange & CR1, const ConstantRange & CR2 )
static

Return true iff CR1 ult CR2 is equivalent to CR1 sge CR2.

Does not depend on strictness/direction of the predicate.

Definition at line 178 of file ConstantRange.cpp.

References isAllNegative(), isAllNonNegative(), and isEmptySet().

Referenced by getEquivalentPredWithFlippedSignedness().

◆ ashr()

 ConstantRange ConstantRange::ashr ( const ConstantRange & Other ) const

Return a new range representing the possible values resulting from a arithmetic right shift of a value in this range and a value in Other.

Definition at line 1484 of file ConstantRange.cpp.

Referenced by binaryOp(), and makeGuaranteedNoWrapRegion().

◆ binaryAnd()

 ConstantRange ConstantRange::binaryAnd ( const ConstantRange & Other ) const

Return a new range representing the possible values resulting from a binary-and of a value in this range by a value in Other.

Definition at line 1397 of file ConstantRange.cpp.

Referenced by binaryOp(), and canScalarizeAccess().

◆ binaryNot()

 ConstantRange ConstantRange::binaryNot ( ) const

Return a new range representing the possible values resulting from a binary-xor of a value in this range by an all-one value, aka bitwise complement operation.

Definition at line 1393 of file ConstantRange.cpp.

References llvm::APInt::getAllOnes(), getBitWidth(), and sub().

Referenced by binaryXor().

◆ binaryOp()

 ConstantRange ConstantRange::binaryOp ( Instruction::BinaryOps BinOp, const ConstantRange & Other ) const

Return a new range representing the possible values resulting from an application of the specified binary operator to an left hand side of this range and a right hand side of Other.

Definition at line 875 of file ConstantRange.cpp.

Referenced by overflowingBinaryOp().

◆ binaryOr()

 ConstantRange ConstantRange::binaryOr ( const ConstantRange & Other ) const

Return a new range representing the possible values resulting from a binary-or of a value in this range by a value in Other.

Definition at line 1409 of file ConstantRange.cpp.

Referenced by binaryOp().

◆ binaryXor()

 ConstantRange ConstantRange::binaryXor ( const ConstantRange & Other ) const

Return a new range representing the possible values resulting from a binary-xor of a value in this range by a value in Other.

Definition at line 1422 of file ConstantRange.cpp.

Referenced by binaryOp().

◆ castOp()

 ConstantRange ConstantRange::castOp ( Instruction::CastOps CastOp, uint32_t BitWidth ) const

Return a new range representing the possible values resulting from an application of the specified cast operator to this range.

BitWidth is the target bitwidth of the cast. For casts which don't change bitwidth, it must be the same as the source bitwidth. For casts which do change bitwidth, the bitwidth must be consistent with the requested cast and source bitwidth.

Definition at line 717 of file ConstantRange.cpp.

◆ contains() [1/2]

 bool ConstantRange::contains ( const APInt & Val ) const

Return true if the specified value is in the set.

Definition at line 446 of file ConstantRange.cpp.

References isFullSet(), isUpperWrapped(), llvm::APInt::ule(), and llvm::APInt::ult().

◆ contains() [2/2]

 bool ConstantRange::contains ( const ConstantRange & CR ) const

Return true if the other range is a subset of this one.

Definition at line 455 of file ConstantRange.cpp.

References isEmptySet(), isFullSet(), isUpperWrapped(), llvm::Other, and llvm::APInt::ule().

◆ difference()

 ConstantRange ConstantRange::difference ( const ConstantRange & CR ) const

Subtract the specified range from this range (aka relative complement of the sets).

Definition at line 496 of file ConstantRange.cpp.

References intersectWith(), and inverse().

◆ dump()

 LLVM_DUMP_METHOD void ConstantRange::dump ( ) const

Allow printing from a debugger easily.

Definition at line 1792 of file ConstantRange.cpp.

References llvm::dbgs(), and print().

◆ exactIntersectWith()

 std::optional< ConstantRange > ConstantRange::exactIntersectWith ( const ConstantRange & CR ) const

Intersect the two ranges and return the result if it can be represented exactly, otherwise return std::nullopt.

Definition at line 700 of file ConstantRange.cpp.

References intersectWith(), inverse(), and unionWith().

◆ exactUnionWith()

 std::optional< ConstantRange > ConstantRange::exactUnionWith ( const ConstantRange & CR ) const

Union the two ranges and return the result if it can be represented exactly, otherwise return std::nullopt.

Definition at line 709 of file ConstantRange.cpp.

References intersectWith(), inverse(), and unionWith().

◆ fromKnownBits()

 ConstantRange ConstantRange::fromKnownBits ( const KnownBits & Known, bool IsSigned )
static

Initialize a range based on a known bits constraint.

The IsSigned flag indicates whether the constant range should not wrap in the signed or unsigned domain.

Definition at line 59 of file ConstantRange.cpp.

◆ getActiveBits()

 unsigned ConstantRange::getActiveBits ( ) const

Compute the maximal number of active bits needed to represent every value in this range.

Definition at line 473 of file ConstantRange.cpp.

References llvm::APInt::getActiveBits(), getUnsignedMax(), and isEmptySet().

Referenced by narrowUDivOrURem().

◆ getBitWidth()

 uint32_t llvm::ConstantRange::getBitWidth ( ) const
inline

Get the bit width of this ConstantRange.

Definition at line 204 of file ConstantRange.h.

◆ getEmpty()

 static ConstantRange llvm::ConstantRange::getEmpty ( uint32_t BitWidth )
inlinestatic

Create empty constant range with the given bit width.

Definition at line 73 of file ConstantRange.h.

References llvm::BitWidth.

◆ getEquivalentICmp() [1/2]

 bool ConstantRange::getEquivalentICmp ( CmpInst::Predicate & Pred, APInt & RHS ) const

Set up Pred and RHS such that ConstantRange::makeExactICmpRegion(Pred, RHS) == *this.

Return true if successful.

Definition at line 235 of file ConstantRange.cpp.

References getEquivalentICmp(), llvm::Offset, and RHS.

Referenced by getEquivalentICmp(), and llvm::ScalarEvolution::SimplifyICmpOperands().

◆ getEquivalentICmp() [2/2]

 void ConstantRange::getEquivalentICmp ( CmpInst::Predicate & Pred, APInt & RHS, APInt & Offset ) const

Set up Pred, RHS and Offset such that (V + Offset) Pred RHS is true iff V is in the range.

Prefers using Offset == 0 if possible.

Definition at line 205 of file ConstantRange.cpp.

◆ getEquivalentPredWithFlippedSignedness()

 CmpInst::Predicate ConstantRange::getEquivalentPredWithFlippedSignedness ( CmpInst::Predicate Pred, const ConstantRange & CR1, const ConstantRange & CR2 )
static

If the comparison between constant ranges this and Other is insensitive to the signedness of the comparison predicate, return a predicate equivalent to Pred, with flipped signedness (i.e.

unsigned instead of signed or vice versa), and maybe inverted, otherwise returns CmpInst::Predicate::BAD_ICMP_PREDICATE.

Definition at line 187 of file ConstantRange.cpp.

Referenced by processICmp().

◆ getFull()

 static ConstantRange llvm::ConstantRange::getFull ( uint32_t BitWidth )
inlinestatic

Create full constant range with the given bit width.

Definition at line 78 of file ConstantRange.h.

References llvm::BitWidth.

◆ getLower()

 const APInt & llvm::ConstantRange::getLower ( ) const
inline

Return the lower value for this range.

Definition at line 198 of file ConstantRange.h.

◆ getMinSignedBits()

 unsigned ConstantRange::getMinSignedBits ( ) const

Compute the maximal number of bits needed to represent every value in this signed range.

Definition at line 480 of file ConstantRange.cpp.

References getMinSignedBits(), getSignedMax(), getSignedMin(), and isEmptySet().

Referenced by getMinSignedBits(), and narrowSDivOrSRem().

◆ getNonEmpty()

 static ConstantRange llvm::ConstantRange::getNonEmpty ( APInt Lower, APInt Upper )
inlinestatic

Create non-empty constant range with the given bounds.

If Lower and Upper are the same, a full range is returned.

Definition at line 84 of file ConstantRange.h.

References llvm::Upper.

◆ getSignedMax()

 APInt ConstantRange::getSignedMax ( ) const

Return the largest signed value contained in the ConstantRange.

Definition at line 434 of file ConstantRange.cpp.

◆ getSignedMin()

 APInt ConstantRange::getSignedMin ( ) const

Return the smallest signed value contained in the ConstantRange.

Definition at line 440 of file ConstantRange.cpp.

◆ getSingleElement()

 const APInt * llvm::ConstantRange::getSingleElement ( ) const
inline

If this set contains a single element, return it, otherwise return null.

Definition at line 246 of file ConstantRange.h.

References llvm::Upper.

◆ getSingleMissingElement()

 const APInt * llvm::ConstantRange::getSingleMissingElement ( ) const
inline

If this set contains all but a single element, return it, otherwise return null.

Definition at line 254 of file ConstantRange.h.

References llvm::Upper.

Referenced by getEquivalentICmp().

◆ getUnsignedMax()

 APInt ConstantRange::getUnsignedMax ( ) const

Return the largest unsigned value contained in the ConstantRange.

Definition at line 422 of file ConstantRange.cpp.

References getBitWidth(), llvm::APInt::getMaxValue(), getUpper(), isFullSet(), and isUpperWrapped().

◆ getUnsignedMin()

 APInt ConstantRange::getUnsignedMin ( ) const

Return the smallest unsigned value contained in the ConstantRange.

Definition at line 428 of file ConstantRange.cpp.

References getBitWidth(), getLower(), llvm::APInt::getMinValue(), isFullSet(), and isWrappedSet().

◆ getUpper()

 const APInt & llvm::ConstantRange::getUpper ( ) const
inline

Return the upper value for this range.

Definition at line 201 of file ConstantRange.h.

References llvm::Upper.

◆ icmp()

 bool ConstantRange::icmp ( CmpInst::Predicate Pred, const ConstantRange & Other ) const

Does the predicate Pred hold between ranges this and Other? NOTE: false does not mean that inverse predicate holds!

Definition at line 242 of file ConstantRange.cpp.

References contains(), makeSatisfyingICmpRegion(), and llvm::Other.

Referenced by expandUDivOrURem(), getDomain(), and processSRem().

◆ intersectWith()

 ConstantRange ConstantRange::intersectWith ( const ConstantRange & CR, PreferredRangeType Type = Smallest ) const

Return the range that results from the intersection of this range with another range.

If the intersection is disjoint, such that two results are possible, the preferred range is determined by the PreferredRangeType.

Definition at line 520 of file ConstantRange.cpp.

◆ intrinsic()

 ConstantRange ConstantRange::intrinsic ( Intrinsic::ID IntrinsicID, ArrayRef< ConstantRange > Ops )
static

Compute range of intrinsic result for the given operand ranges.

Definition at line 954 of file ConstantRange.cpp.

◆ inverse()

 ConstantRange ConstantRange::inverse ( ) const

Return a new range that is the logical not of the current set.

Definition at line 1620 of file ConstantRange.cpp.

References isEmptySet(), and isFullSet().

◆ isAllNegative()

 bool ConstantRange::isAllNegative ( ) const

Return true if all values in this range are negative.

Definition at line 407 of file ConstantRange.cpp.

◆ isAllNonNegative()

 bool ConstantRange::isAllNonNegative ( ) const

Return true if all values in this range are non-negative.

Definition at line 417 of file ConstantRange.cpp.

References llvm::APInt::isNonNegative(), and isSignWrappedSet().

◆ isEmptySet()

 bool ConstantRange::isEmptySet ( ) const

◆ isFullSet()

 bool ConstantRange::isFullSet ( ) const

Return true if this set contains all of the elements possible for this data-type.

Definition at line 363 of file ConstantRange.cpp.

References llvm::APInt::isMaxValue().

◆ isIntrinsicSupported()

 bool ConstantRange::isIntrinsicSupported ( Intrinsic::ID IntrinsicID )
static

Returns true if ConstantRange calculations are supported for intrinsic with IntrinsicID.

Definition at line 937 of file ConstantRange.cpp.

Referenced by intrinsic().

◆ isSignWrappedSet()

 bool ConstantRange::isSignWrappedSet ( ) const

Return true if this set wraps around the signed domain.

Special cases:

• Empty set: Not wrapped.
• Full set: Not wrapped.
• [X, SignedMin) == [X, SignedMax]: Not wrapped.

Definition at line 379 of file ConstantRange.cpp.

References llvm::APInt::isMinSignedValue(), and llvm::APInt::sgt().

Referenced by abs(), getPreferredRange(), getSignedMin(), isAllNonNegative(), signExtend(), smax(), and smin().

◆ isSingleElement()

 bool llvm::ConstantRange::isSingleElement ( ) const
inline

Return true if this set contains exactly one member.

Definition at line 261 of file ConstantRange.h.

◆ isSizeLargerThan()

 bool ConstantRange::isSizeLargerThan ( uint64_t MaxSize ) const

Compare set size of this range with Value.

Definition at line 398 of file ConstantRange.cpp.

References getBitWidth(), llvm::APInt::getMaxValue(), isFullSet(), and llvm::APInt::ugt().

◆ isSizeStrictlySmallerThan()

 bool ConstantRange::isSizeStrictlySmallerThan ( const ConstantRange & CR ) const

Compare set size of this range with the range CR.

Definition at line 388 of file ConstantRange.cpp.

References assert(), getBitWidth(), isFullSet(), and llvm::Other.

Referenced by getPreferredRange(), and multiply().

◆ isUpperSignWrapped()

 bool ConstantRange::isUpperSignWrapped ( ) const

Return true if the (exclusive) upper bound wraps around the signed domain.

Special cases:

• Empty set: Not wrapped.
• Full set: Not wrapped.
• [X, SignedMin): Wrapped.

Definition at line 383 of file ConstantRange.cpp.

References llvm::APInt::sgt().

Referenced by getSignedMax(), and isAllNegative().

◆ isUpperWrapped()

 bool ConstantRange::isUpperWrapped ( ) const

Return true if the exclusive upper bound wraps around the unsigned domain.

Special cases:

• Empty set: Not wrapped.
• Full set: Not wrapped.
• [X, 0): Wrapped.

Definition at line 375 of file ConstantRange.cpp.

References llvm::APInt::ugt().

◆ isWrappedSet()

 bool ConstantRange::isWrappedSet ( ) const

Return true if this set wraps around the unsigned domain.

Special cases:

• Empty set: Not wrapped.
• Full set: Not wrapped.
• [X, 0) == [X, Max]: Not wrapped.

Definition at line 371 of file ConstantRange.cpp.

References llvm::APInt::isZero(), and llvm::APInt::ugt().

Referenced by getPreferredRange(), getUnsignedMin(), umax(), and umin().

◆ lshr()

 ConstantRange ConstantRange::lshr ( const ConstantRange & Other ) const

Return a new range representing the possible values resulting from a logical right shift of a value in this range and a value in Other.

Definition at line 1474 of file ConstantRange.cpp.

Referenced by binaryOp(), and makeGuaranteedNoWrapRegion().

◆ makeAllowedICmpRegion()

 ConstantRange ConstantRange::makeAllowedICmpRegion ( CmpInst::Predicate Pred, const ConstantRange & Other )
static

Produce the smallest range such that all values that may satisfy the given predicate with any value contained within Other is contained in the returned range.

Formally, this returns a superset of 'union over all y in Other . { x : icmp op x y is true }'. If the exact answer is not representable as a ConstantRange, the return value will be a proper superset of the above.

Example: Pred = ult and Other = i8 [2, 5) returns Result = [0, 4)

Definition at line 97 of file ConstantRange.cpp.

◆ makeExactICmpRegion()

 ConstantRange ConstantRange::makeExactICmpRegion ( CmpInst::Predicate Pred, const APInt & Other )
static

Produce the exact range such that all values in the returned range satisfy the given predicate with any value contained within Other.

Formally, this returns the exact answer when the superset of 'union over all y in Other is exactly same as the subset of intersection over all y in Other. { x : icmp op x y is true}'.

Example: Pred = ult and Other = i8 3 returns [0, 3)

Definition at line 157 of file ConstantRange.cpp.

◆ makeExactNoWrapRegion()

 ConstantRange ConstantRange::makeExactNoWrapRegion ( Instruction::BinaryOps BinOp, const APInt & Other, unsigned NoWrapKind )
static

Produce the range that contains X if and only if "X BinOp Other" does not wrap.

Definition at line 355 of file ConstantRange.cpp.

References makeGuaranteedNoWrapRegion(), and llvm::Other.

Referenced by getValueFromOverflowCondition().

◆ makeGuaranteedNoWrapRegion()

 ConstantRange ConstantRange::makeGuaranteedNoWrapRegion ( Instruction::BinaryOps BinOp, const ConstantRange & Other, unsigned NoWrapKind )
static

Produce the largest range containing all X such that "X BinOp Y" is guaranteed not to wrap (overflow) for all Y in Other.

However, there may be some Y in Other for which additional X not contained in the result also do not overflow.

NoWrapKind must be one of OBO::NoUnsignedWrap or OBO::NoSignedWrap.

Examples: typedef OverflowingBinaryOperator OBO; #define MGNR makeGuaranteedNoWrapRegion MGNR(Add, [i8 1, 2), OBO::NoSignedWrap) == [-128, 127) MGNR(Add, [i8 1, 2), OBO::NoUnsignedWrap) == [0, -1) MGNR(Add, [i8 0, 1), OBO::NoUnsignedWrap) == Full Set MGNR(Add, [i8 -1, 6), OBO::NoSignedWrap) == [INT_MIN+1, INT_MAX-4) MGNR(Sub, [i8 1, 2), OBO::NoSignedWrap) == [-127, 128) MGNR(Sub, [i8 1, 2), OBO::NoUnsignedWrap) == [1, 0)

Definition at line 285 of file ConstantRange.cpp.

◆ makeSatisfyingICmpRegion()

 ConstantRange ConstantRange::makeSatisfyingICmpRegion ( CmpInst::Predicate Pred, const ConstantRange & Other )
static

Produce the largest range such that all values in the returned range satisfy the given predicate with all values contained within Other.

Formally, this returns a subset of 'intersection over all y in Other . { x : icmp op x y is true }'. If the exact answer is not representable as a ConstantRange, the return value will be a proper subset of the above.

Example: Pred = ult and Other = i8 [2, 5) returns [0, 2)

Definition at line 147 of file ConstantRange.cpp.

References llvm::CmpInst::getInversePredicate(), inverse(), and makeAllowedICmpRegion().

Referenced by icmp(), and makeExactICmpRegion().

◆ multiply()

 ConstantRange ConstantRange::multiply ( const ConstantRange & Other ) const

Return a new range representing the possible values resulting from a multiplication of a value in this range and a value in Other, treating both this and Other as unsigned ranges.

Definition at line 1083 of file ConstantRange.cpp.

Referenced by binaryOp().

◆ operator!=()

 bool llvm::ConstantRange::operator!= ( const ConstantRange & CR ) const
inline

Definition at line 291 of file ConstantRange.h.

References operator==().

◆ operator==()

 bool llvm::ConstantRange::operator== ( const ConstantRange & CR ) const
inline

Return true if this range is equal to another range.

Definition at line 288 of file ConstantRange.h.

References llvm::Upper.

◆ overflowingBinaryOp()

 ConstantRange ConstantRange::overflowingBinaryOp ( Instruction::BinaryOps BinOp, const ConstantRange & Other, unsigned NoWrapKind ) const

Return a new range representing the possible values resulting from an application of the specified overflowing binary operator to a left hand side of this range and a right hand side of Other given the provided knowledge about lack of wrapping NoWrapKind.

Definition at line 920 of file ConstantRange.cpp.

◆ print()

 void ConstantRange::print ( raw_ostream & OS ) const

Print out the bounds to a stream.

Definition at line 1782 of file ConstantRange.cpp.

References isEmptySet(), and isFullSet().

Referenced by dump(), llvm::operator<<(), and llvm::ScalarEvolution::print().

 ConstantRange ConstantRange::sadd_sat ( const ConstantRange & Other ) const

Perform a signed saturating addition of two constant ranges.

Definition at line 1543 of file ConstantRange.cpp.

◆ sdiv()

 ConstantRange ConstantRange::sdiv ( const ConstantRange & Other ) const

Return a new range representing the possible values resulting from a signed division of a value in this range and a value in Other.

Division by zero and division of SignedMin by -1 are considered undefined behavior, in line with IR, and do not contribute towards the result.

Definition at line 1232 of file ConstantRange.cpp.

Referenced by binaryOp(), and sdiv().

◆ sextOrTrunc()

 ConstantRange ConstantRange::sextOrTrunc ( uint32_t BitWidth ) const

Make this range have the bit width given by BitWidth.

The value is sign extended, truncated, or left alone to make it that width.

Definition at line 866 of file ConstantRange.cpp.

References getBitWidth(), signExtend(), and truncate().

Referenced by llvm::ScalarEvolution::getSignExtendExprImpl().

◆ shl()

 ConstantRange ConstantRange::shl ( const ConstantRange & Other ) const

Return a new range representing the possible values resulting from a left shift of a value in this range by a value in Other.

TODO: This isn't fully implemented yet.

Definition at line 1440 of file ConstantRange.cpp.

Referenced by binaryOp().

 ConstantRange::OverflowResult ConstantRange::signedAddMayOverflow ( const ConstantRange & Other ) const

Return whether signed add of the two ranges always/never overflows.

Definition at line 1686 of file ConstantRange.cpp.

◆ signedSubMayOverflow()

 ConstantRange::OverflowResult ConstantRange::signedSubMayOverflow ( const ConstantRange & Other ) const

Return whether signed sub of the two ranges always/never overflows.

Definition at line 1732 of file ConstantRange.cpp.

Referenced by llvm::computeOverflowForSignedSub().

◆ signExtend()

 ConstantRange ConstantRange::signExtend ( uint32_t BitWidth ) const

Return a new range in the specified integer type, which must be strictly larger than the current type.

The returned range will correspond to the possible range of values if the source range had been sign extended to BitWidth.

Definition at line 785 of file ConstantRange.cpp.

◆ smax()

 ConstantRange ConstantRange::smax ( const ConstantRange & Other ) const

Return a new range representing the possible values resulting from a signed maximum of a value in this range and a value in Other.

Definition at line 1156 of file ConstantRange.cpp.

◆ smin()

 ConstantRange ConstantRange::smin ( const ConstantRange & Other ) const

Return a new range representing the possible values resulting from a signed minimum of a value in this range and a value in Other.

Definition at line 1184 of file ConstantRange.cpp.

◆ smul_fast()

 ConstantRange ConstantRange::smul_fast ( const ConstantRange & Other ) const

Return range of possible values for a signed multiplication of this and Other.

However, if overflow is possible always return a full range rather than trying to determine a more precise result.

Definition at line 1136 of file ConstantRange.cpp.

References A, B, getNonEmpty(), getSignedMax(), getSignedMin(), isEmptySet(), llvm::Other, and llvm::APInt::smul_ov().

◆ smul_sat()

 ConstantRange ConstantRange::smul_sat ( const ConstantRange & Other ) const

Perform a signed saturating multiplication of two constant ranges.

Definition at line 1579 of file ConstantRange.cpp.

◆ srem()

 ConstantRange ConstantRange::srem ( const ConstantRange & Other ) const

Return a new range representing the possible values resulting from a signed remainder operation of a value in this range and a value in Other.

Definition at line 1342 of file ConstantRange.cpp.

Referenced by binaryOp().

◆ sshl_sat()

 ConstantRange ConstantRange::sshl_sat ( const ConstantRange & Other ) const

Perform a signed saturating left shift of this constant range by a value in Other.

Definition at line 1609 of file ConstantRange.cpp.

◆ ssub_sat()

 ConstantRange ConstantRange::ssub_sat ( const ConstantRange & Other ) const

Perform a signed saturating subtraction of two constant ranges.

Definition at line 1561 of file ConstantRange.cpp.

Referenced by subWithNoWrap().

◆ sub()

 ConstantRange ConstantRange::sub ( const ConstantRange & Other ) const

Return a new range representing the possible values resulting from a subtraction of a value in this range and a value in Other.

Definition at line 1033 of file ConstantRange.cpp.

References getLower(), getUpper(), isEmptySet(), isFullSet(), llvm::Other, and X.

Referenced by llvm::ScalarEvolution::applyLoopGuards(), binaryNot(), binaryOp(), and subWithNoWrap().

◆ subtract()

 ConstantRange ConstantRange::subtract ( const APInt & CI ) const

Subtract the specified constant from the endpoints of this constant range.

Definition at line 488 of file ConstantRange.cpp.

References assert(), llvm::APInt::getBitWidth(), and getBitWidth().

◆ subWithNoWrap()

 ConstantRange ConstantRange::subWithNoWrap ( const ConstantRange & Other, unsigned NoWrapKind, PreferredRangeType RangeType = Smallest ) const

Return a new range representing the possible values resulting from an subtraction with wrap type NoWrapKind of a value in this range and a value in Other.

If the result range is disjoint, the preferred range is determined by the PreferredRangeType.

Definition at line 1052 of file ConstantRange.cpp.

References getUnsignedMax(), isEmptySet(), isFullSet(), llvm::Other, ssub_sat(), sub(), and usub_sat().

Referenced by overflowingBinaryOp().

◆ toKnownBits()

 KnownBits ConstantRange::toKnownBits ( ) const

Return known bits for values in this range.

Definition at line 79 of file ConstantRange.cpp.

Referenced by binaryAnd(), binaryOr(), and binaryXor().

◆ truncate()

 ConstantRange ConstantRange::truncate ( uint32_t BitWidth ) const

Return a new range in the specified integer type, which must be strictly smaller than the current type.

The returned range will correspond to the possible range of values if the source range had been truncated to the specified type.

Definition at line 803 of file ConstantRange.cpp.

 ConstantRange ConstantRange::uadd_sat ( const ConstantRange & Other ) const

Perform an unsigned saturating addition of two constant ranges.

Definition at line 1534 of file ConstantRange.cpp.

◆ udiv()

 ConstantRange ConstantRange::udiv ( const ConstantRange & Other ) const

Return a new range representing the possible values resulting from an unsigned division of a value in this range and a value in Other.

Definition at line 1212 of file ConstantRange.cpp.

Referenced by binaryOp().

◆ umax()

 ConstantRange ConstantRange::umax ( const ConstantRange & Other ) const

Return a new range representing the possible values resulting from an unsigned maximum of a value in this range and a value in Other.

Definition at line 1170 of file ConstantRange.cpp.

◆ umin()

 ConstantRange ConstantRange::umin ( const ConstantRange & Other ) const

Return a new range representing the possible values resulting from an unsigned minimum of a value in this range and a value in Other.

Definition at line 1198 of file ConstantRange.cpp.

◆ umul_sat()

 ConstantRange ConstantRange::umul_sat ( const ConstantRange & Other ) const

Perform an unsigned saturating multiplication of two constant ranges.

Definition at line 1570 of file ConstantRange.cpp.

Referenced by expandUDivOrURem().

◆ unionWith()

 ConstantRange ConstantRange::unionWith ( const ConstantRange & CR, PreferredRangeType Type = Smallest ) const

Return the range that results from the union of this range with another range.

The resultant range is guaranteed to include the elements of both sets, but may contain more. For example, [3, 9) union [12,15) is [3, 15), which includes 9, 10, and 11, which were not included in either set before.

Definition at line 626 of file ConstantRange.cpp.

 ConstantRange::OverflowResult ConstantRange::unsignedAddMayOverflow ( const ConstantRange & Other ) const

Return whether unsigned add of the two ranges always/never overflows.

Definition at line 1670 of file ConstantRange.cpp.

◆ unsignedMulMayOverflow()

 ConstantRange::OverflowResult ConstantRange::unsignedMulMayOverflow ( const ConstantRange & Other ) const

Return whether unsigned mul of the two ranges always/never overflows.

Definition at line 1762 of file ConstantRange.cpp.

Referenced by llvm::computeOverflowForUnsignedMul().

◆ unsignedSubMayOverflow()

 ConstantRange::OverflowResult ConstantRange::unsignedSubMayOverflow ( const ConstantRange & Other ) const

Return whether unsigned sub of the two ranges always/never overflows.

Definition at line 1716 of file ConstantRange.cpp.

Referenced by llvm::computeOverflowForUnsignedSub().

◆ urem()

 ConstantRange ConstantRange::urem ( const ConstantRange & Other ) const

Return a new range representing the possible values resulting from an unsigned remainder operation of a value in this range and a value in Other.

Definition at line 1320 of file ConstantRange.cpp.

Referenced by binaryOp(), and canScalarizeAccess().

◆ ushl_sat()

 ConstantRange ConstantRange::ushl_sat ( const ConstantRange & Other ) const

Perform an unsigned saturating left shift of this constant range by a value in Other.

Definition at line 1600 of file ConstantRange.cpp.

◆ usub_sat()

 ConstantRange ConstantRange::usub_sat ( const ConstantRange & Other ) const

Perform an unsigned saturating subtraction of two constant ranges.

Definition at line 1552 of file ConstantRange.cpp.

Referenced by subWithNoWrap().

◆ zeroExtend()

 ConstantRange ConstantRange::zeroExtend ( uint32_t BitWidth ) const

Return a new range in the specified integer type, which must be strictly larger than the current type.

The returned range will correspond to the possible range of values if the source range had been zero extended to BitWidth.

Definition at line 768 of file ConstantRange.cpp.

◆ zextOrTrunc()

 ConstantRange ConstantRange::zextOrTrunc ( uint32_t BitWidth ) const

Make this range have the bit width given by BitWidth.

The value is zero extended, truncated, or left alone to make it that width.

Definition at line 857 of file ConstantRange.cpp.

References getBitWidth(), truncate(), and zeroExtend().

Referenced by llvm::ScalarEvolution::getZeroExtendExprImpl().

The documentation for this class was generated from the following files: