LLVM  9.0.0svn
Public Types | Public Member Functions | Static Public Member Functions | List of all members
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  OverflowResult { OverflowResult::AlwaysOverflowsLow, OverflowResult::AlwaysOverflowsHigh, OverflowResult::MayOverflow, OverflowResult::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. More...
 
 ConstantRange (APInt Value)
 Initialize a range to hold the single specified value. More...
 
 ConstantRange (APInt Lower, APInt Upper)
 Initialize a range of values explicitly. More...
 
bool getEquivalentICmp (CmpInst::Predicate &Pred, APInt &RHS) const
 Set up Pred and RHS such that ConstantRange::makeExactICmpRegion(Pred, RHS) == *this. More...
 
const APIntgetLower () const
 Return the lower value for this range. More...
 
const APIntgetUpper () const
 Return the upper value for this range. More...
 
uint32_t getBitWidth () const
 Get the bit width of this ConstantRange. More...
 
bool isFullSet () const
 Return true if this set contains all of the elements possible for this data-type. More...
 
bool isEmptySet () const
 Return true if this set contains no members. More...
 
bool isWrappedSet () const
 Return true if this set wraps around the unsigned domain. More...
 
bool isUpperWrapped () const
 Return true if the exclusive upper bound wraps around the unsigned domain. More...
 
bool isSignWrappedSet () const
 Return true if this set wraps around the signed domain. More...
 
bool isUpperSignWrapped () const
 Return true if the (exclusive) upper bound wraps around the signed domain. More...
 
bool contains (const APInt &Val) const
 Return true if the specified value is in the set. More...
 
bool contains (const ConstantRange &CR) const
 Return true if the other range is a subset of this one. More...
 
const APIntgetSingleElement () const
 If this set contains a single element, return it, otherwise return null. More...
 
const APIntgetSingleMissingElement () const
 If this set contains all but a single element, return it, otherwise return null. More...
 
bool isSingleElement () const
 Return true if this set contains exactly one member. More...
 
bool isSizeStrictlySmallerThan (const ConstantRange &CR) const
 Compare set size of this range with the range CR. More...
 
bool isSizeLargerThan (uint64_t MaxSize) const
 Compare set size of this range with Value. More...
 
bool isAllNegative () const
 Return true if all values in this range are negative. More...
 
bool isAllNonNegative () const
 Return true if all values in this range are non-negative. More...
 
APInt getUnsignedMax () const
 Return the largest unsigned value contained in the ConstantRange. More...
 
APInt getUnsignedMin () const
 Return the smallest unsigned value contained in the ConstantRange. More...
 
APInt getSignedMax () const
 Return the largest signed value contained in the ConstantRange. More...
 
APInt getSignedMin () const
 Return the smallest signed value contained in the ConstantRange. More...
 
bool operator== (const ConstantRange &CR) const
 Return true if this range is equal to another range. More...
 
bool operator!= (const ConstantRange &CR) const
 
ConstantRange subtract (const APInt &CI) const
 Subtract the specified constant from the endpoints of this constant range. More...
 
ConstantRange difference (const ConstantRange &CR) const
 Subtract the specified range from this range (aka relative complement of the sets). More...
 
ConstantRange intersectWith (const ConstantRange &CR, PreferredRangeType Type=Smallest) const
 Return the range that results from the intersection of this range with another range. More...
 
ConstantRange unionWith (const ConstantRange &CR, PreferredRangeType Type=Smallest) const
 Return the range that results from the union of this range with another range. More...
 
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. More...
 
ConstantRange zeroExtend (uint32_t BitWidth) const
 Return a new range in the specified integer type, which must be strictly larger than the current type. More...
 
ConstantRange signExtend (uint32_t BitWidth) const
 Return a new range in the specified integer type, which must be strictly larger than the current type. More...
 
ConstantRange truncate (uint32_t BitWidth) const
 Return a new range in the specified integer type, which must be strictly smaller than the current type. More...
 
ConstantRange zextOrTrunc (uint32_t BitWidth) const
 Make this range have the bit width given by BitWidth. More...
 
ConstantRange sextOrTrunc (uint32_t BitWidth) const
 Make this range have the bit width given by BitWidth. More...
 
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. More...
 
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. More...
 
ConstantRange addWithNoSignedWrap (const APInt &Other) const
 Return a new range representing the possible values resulting from a known NSW addition of a value in this range and Other constant. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
ConstantRange uadd_sat (const ConstantRange &Other) const
 Perform an unsigned saturating addition of two constant ranges. More...
 
ConstantRange sadd_sat (const ConstantRange &Other) const
 Perform a signed saturating addition of two constant ranges. More...
 
ConstantRange usub_sat (const ConstantRange &Other) const
 Perform an unsigned saturating subtraction of two constant ranges. More...
 
ConstantRange ssub_sat (const ConstantRange &Other) const
 Perform a signed saturating subtraction of two constant ranges. More...
 
ConstantRange inverse () const
 Return a new range that is the logical not of the current set. More...
 
ConstantRange abs () const
 Calculate absolute value range. More...
 
OverflowResult unsignedAddMayOverflow (const ConstantRange &Other) const
 Return whether unsigned add of the two ranges always/never overflows. More...
 
OverflowResult signedAddMayOverflow (const ConstantRange &Other) const
 Return whether signed add of the two ranges always/never overflows. More...
 
OverflowResult unsignedSubMayOverflow (const ConstantRange &Other) const
 Return whether unsigned sub of the two ranges always/never overflows. More...
 
OverflowResult signedSubMayOverflow (const ConstantRange &Other) const
 Return whether signed sub of the two ranges always/never overflows. More...
 
OverflowResult unsignedMulMayOverflow (const ConstantRange &Other) const
 Return whether unsigned mul of the two ranges always/never overflows. More...
 
void print (raw_ostream &OS) const
 Print out the bounds to a stream. More...
 
void dump () const
 Allow printing from a debugger easily. More...
 

Static Public Member Functions

static ConstantRange getEmpty (uint32_t BitWidth)
 Create empty constant range with the given bit width. More...
 
static ConstantRange getFull (uint32_t BitWidth)
 Create full constant range with the given bit width. More...
 
static ConstantRange getNonEmpty (APInt Lower, APInt Upper)
 Create non-empty constant range with the given bounds. More...
 
static ConstantRange fromKnownBits (const KnownBits &Known, bool IsSigned)
 Initialize a range based on a known bits constraint. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 

Detailed Description

This class represents a range of values.

Definition at line 47 of file ConstantRange.h.

Member Enumeration Documentation

◆ OverflowResult

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 426 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 272 of file ConstantRange.h.

Constructor & Destructor Documentation

◆ ConstantRange() [1/3]

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

◆ ConstantRange() [2/3]

ConstantRange::ConstantRange ( APInt  Value)

Initialize a range to hold the single specified value.

Definition at line 46 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 49 of file ConstantRange.cpp.

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

Member Function Documentation

◆ abs()

ConstantRange ConstantRange::abs ( ) const

Calculate absolute value range.

If the original range contains signed min, then the resulting range will also contain signed min.

Definition at line 1259 of file ConstantRange.cpp.

References ConstantRange(), getBitWidth(), llvm::APInt::getNullValue(), getSignedMax(), getSignedMin(), llvm::APInt::getSignedMinValue(), isEmptySet(), llvm::APInt::isNonNegative(), isSignWrappedSet(), llvm::APInt::isStrictlyPositive(), llvm::MipsISD::Lo, llvm::LegalizeActions::Lower, llvm::APIntOps::umax(), and llvm::APIntOps::umin().

Referenced by srem().

◆ add()

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 799 of file ConstantRange.cpp.

References ConstantRange(), getLower(), getUpper(), isEmptySet(), isFullSet(), isSizeStrictlySmallerThan(), and X.

Referenced by binaryOp(), llvm::JumpThreadingPass::ComputeValueKnownInPredecessorsImpl(), llvm::StackSafetyInfo::FunctionInfo::FunctionInfo(), GetRangeFromMetadata(), and IsKnownPredicateViaMinOrMax().

◆ addWithNoSignedWrap()

ConstantRange ConstantRange::addWithNoSignedWrap ( const APInt Other) const

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

Definition at line 818 of file ConstantRange.cpp.

References llvm::MCID::Add, ConstantRange(), intersectWith(), makeExactNoWrapRegion(), and llvm::OverflowingBinaryOperator::NoSignedWrap.

◆ 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 1165 of file ConstantRange.cpp.

References llvm::APInt::ashr(), getNonEmpty(), getSignedMax(), getSignedMin(), getUnsignedMax(), getUnsignedMin(), isEmptySet(), llvm::APInt::isNegative(), llvm::APInt::isNonNegative(), and llvm::max().

Referenced by binaryOp().

◆ 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 1108 of file ConstantRange.cpp.

References getBitWidth(), getNonEmpty(), llvm::APInt::getNullValue(), getUnsignedMax(), isEmptySet(), umin(), and llvm::APIntOps::umin().

Referenced by binaryOp().

◆ 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 755 of file ConstantRange.cpp.

References llvm::MCID::Add, add(), ashr(), assert(), binaryAnd(), binaryOr(), llvm::Instruction::isBinaryOp(), lshr(), multiply(), sdiv(), shl(), srem(), sub(), udiv(), and urem().

◆ 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 1119 of file ConstantRange.cpp.

References getBitWidth(), getNonEmpty(), llvm::APInt::getNullValue(), getUnsignedMin(), isEmptySet(), umax(), and llvm::APIntOps::umax().

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 605 of file ConstantRange.cpp.

References ConstantRange(), getBitWidth(), llvm::APInt::getMaxValue(), llvm::APInt::getMinValue(), llvm::APInt::getSignedMaxValue(), llvm::APInt::getSignedMinValue(), llvm_unreachable, llvm::APInt::sextOrSelf(), signExtend(), truncate(), zeroExtend(), and llvm::APInt::zextOrSelf().

◆ contains() [1/2]

bool ConstantRange::contains ( const APInt Val) const

◆ 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 376 of file ConstantRange.cpp.

References getLower(), getUpper(), isEmptySet(), isFullSet(), isUpperWrapped(), llvm::LegalizeActions::Lower, 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 402 of file ConstantRange.cpp.

References intersectWith(), and inverse().

Referenced by getEdgeValueLocal(), isImpliedCondMatchingImmOperands(), and processUGT_ADDCST_ADD().

◆ dump()

LLVM_DUMP_METHOD void ConstantRange::dump ( ) const

Allow printing from a debugger easily.

Definition at line 1412 of file ConstantRange.cpp.

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

◆ fromKnownBits()

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

◆ getBitWidth()

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

◆ 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.

◆ getEquivalentICmp()

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

◆ 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.

◆ getLower()

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

◆ 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::APInt::getBitWidth(), and Other.

Referenced by ashr(), binaryAnd(), binaryOr(), llvm::computeConstantRange(), getRangeForAffineARHelper(), lshr(), makeAllowedICmpRegion(), makeExactMulNUWRegion(), makeGuaranteedNoWrapRegion(), sadd_sat(), smax(), smin(), ssub_sat(), uadd_sat(), udiv(), umax(), umin(), urem(), and usub_sat().

◆ getSignedMax()

APInt ConstantRange::getSignedMax ( ) const

◆ getSignedMin()

APInt ConstantRange::getSignedMin ( ) const

◆ getSingleElement()

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

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

Definition at line 207 of file ConstantRange.h.

References llvm::Lower.

Referenced by llvm::ValueLatticeElement::asConstantInteger(), llvm::LazyValueInfo::getConstant(), llvm::LazyValueInfo::getConstantOnEdge(), getEquivalentICmp(), and processUGT_ADDCST_ADD().

◆ 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 215 of file ConstantRange.h.

References llvm::Upper.

Referenced by getEquivalentICmp().

◆ getUnsignedMax()

APInt ConstantRange::getUnsignedMax ( ) const

◆ getUnsignedMin()

APInt ConstantRange::getUnsignedMin ( ) const

◆ getUpper()

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

◆ intersectWith()

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

◆ inverse()

ConstantRange ConstantRange::inverse ( ) const

◆ isAllNegative()

bool ConstantRange::isAllNegative ( ) const

Return true if all values in this range are negative.

Definition at line 328 of file ConstantRange.cpp.

References isEmptySet(), isFullSet(), llvm::APInt::isStrictlyPositive(), and isUpperSignWrapped().

Referenced by computeOverflowForSignedAdd().

◆ isAllNonNegative()

bool ConstantRange::isAllNonNegative ( ) const

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

Definition at line 338 of file ConstantRange.cpp.

References isSignWrappedSet(), and llvm::LegalizeActions::Lower.

Referenced by computeOverflowForSignedAdd().

◆ isEmptySet()

bool ConstantRange::isEmptySet ( ) const

◆ isFullSet()

bool ConstantRange::isFullSet ( ) const

◆ 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 299 of file ConstantRange.cpp.

References llvm::APInt::isMinSignedValue(), and llvm::LegalizeActions::Lower.

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

◆ isSingleElement()

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

Return true if this set contains exactly one member.

Definition at line 222 of file ConstantRange.h.

Referenced by getPredicateResult(), hasSingleValue(), and makeAllowedICmpRegion().

◆ isSizeLargerThan()

bool ConstantRange::isSizeLargerThan ( uint64_t  MaxSize) const

Compare set size of this range with Value.

Definition at line 318 of file ConstantRange.cpp.

References assert(), getBitWidth(), llvm::APInt::getMaxValue(), isFullSet(), llvm::LegalizeActions::Lower, 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 308 of file ConstantRange.cpp.

References assert(), getBitWidth(), isFullSet(), and llvm::LegalizeActions::Lower.

Referenced by add(), getPreferredRange(), multiply(), and sub().

◆ 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 303 of file ConstantRange.cpp.

References llvm::LegalizeActions::Lower.

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 295 of file ConstantRange.cpp.

References llvm::LegalizeActions::Lower.

Referenced by contains(), getUnsignedMax(), intersectWith(), llvm::SelectionDAGBuilder::lowerRangeToAssertZExt(), multiply(), truncate(), unionWith(), and zeroExtend().

◆ 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 291 of file ConstantRange.cpp.

References llvm::APInt::isNullValue(), and llvm::LegalizeActions::Lower.

Referenced by getPreferredRange(), and getUnsignedMin().

◆ 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 1155 of file ConstantRange.cpp.

References getNonEmpty(), getUnsignedMax(), getUnsignedMin(), isEmptySet(), llvm::APInt::lshr(), and llvm::max().

Referenced by binaryOp().

◆ 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 77 of file ConstantRange.cpp.

References ConstantRange(), getBitWidth(), getLower(), llvm::APInt::getMinValue(), getNonEmpty(), llvm::APInt::getNullValue(), getSignedMax(), getSignedMin(), llvm::APInt::getSignedMinValue(), getUnsignedMax(), getUnsignedMin(), getUpper(), llvm::CmpInst::ICMP_EQ, llvm::CmpInst::ICMP_NE, llvm::CmpInst::ICMP_SGE, llvm::CmpInst::ICMP_SGT, llvm::CmpInst::ICMP_SLE, llvm::CmpInst::ICMP_SLT, llvm::CmpInst::ICMP_UGE, llvm::CmpInst::ICMP_UGT, llvm::CmpInst::ICMP_ULE, llvm::CmpInst::ICMP_ULT, isEmptySet(), isSingleElement(), llvm_unreachable, and llvm::RISCVFenceField::W.

Referenced by getValueFromICmpCondition(), isImpliedCondMatchingImmOperands(), IsKnownPredicateViaMinOrMax(), makeExactICmpRegion(), makeSatisfyingICmpRegion(), processUGT_ADDCST_ADD(), and truncateIVUse().

◆ 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 137 of file ConstantRange.cpp.

References assert(), makeAllowedICmpRegion(), and makeSatisfyingICmpRegion().

Referenced by llvm::JumpThreadingPass::ComputeValueKnownInPredecessorsImpl(), foldICmpShlOne(), llvm::ScalarEvolution::forgetValue(), getEquivalentICmp(), getPredicateResult(), isImpliedCondMatchingImmOperands(), isSupportedGuardInstruction(), processUGT_ADDCST_ADD(), simplifyAndOrOfICmpsWithConstants(), llvm::ScalarEvolution::SimplifyICmpOperands(), and simplifyICmpWithConstant().

◆ 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 275 of file ConstantRange.cpp.

References ConstantRange(), and makeGuaranteedNoWrapRegion().

Referenced by addWithNoSignedWrap(), and 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 225 of file ConstantRange.cpp.

References llvm::MCID::Add, assert(), getBitWidth(), llvm::APInt::getMinValue(), getNonEmpty(), llvm::APInt::getNullValue(), getSignedMax(), getSignedMin(), llvm::APInt::getSignedMinValue(), getUnsignedMax(), intersectWith(), llvm::Instruction::isBinaryOp(), llvm::APInt::isNegative(), llvm::APInt::isStrictlyPositive(), llvm_unreachable, makeExactMulNSWRegion(), makeExactMulNUWRegion(), and Unsigned.

Referenced by makeExactNoWrapRegion(), processBinOp(), PushDefUseChildren(), StrengthenNoWrapFlags(), and willNotOverflow().

◆ 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 127 of file ConstantRange.cpp.

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

Referenced by llvm::ValueLatticeElement::getCompare(), IsKnownPredicateViaMinOrMax(), llvm::ScalarEvolution::isLoopInvariantPredicate(), makeExactICmpRegion(), and SimplifyICmpInst().

◆ 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 849 of file ConstantRange.cpp.

References A, B, llvm::MCID::Compare, ConstantRange(), getBitWidth(), getSignedMax(), getSignedMin(), getUnsignedMax(), getUnsignedMin(), getUpper(), isEmptySet(), llvm::APInt::isMinSignedValue(), llvm::APInt::isNonNegative(), isSizeStrictlySmallerThan(), isUpperWrapped(), llvm::max(), llvm::APInt::sext(), llvm::APInt::slt(), truncate(), and llvm::APInt::zext().

Referenced by binaryOp(), and GetRangeFromMetadata().

◆ operator!=()

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

Definition at line 252 of file ConstantRange.h.

References llvm::operator==().

◆ operator==()

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

Return true if this range is equal to another range.

Definition at line 249 of file ConstantRange.h.

◆ print()

void ConstantRange::print ( raw_ostream OS) const

Print out the bounds to a stream.

Definition at line 1402 of file ConstantRange.cpp.

References isEmptySet(), isFullSet(), and llvm::LegalizeActions::Lower.

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

◆ sadd_sat()

ConstantRange ConstantRange::sadd_sat ( const ConstantRange Other) const

Perform a signed saturating addition of two constant ranges.

Definition at line 1224 of file ConstantRange.cpp.

References getNonEmpty(), getSignedMax(), getSignedMin(), isEmptySet(), and llvm::APInt::sadd_sat().

◆ 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 967 of file ConstantRange.cpp.

References ConstantRange(), contains(), getBitWidth(), llvm::APInt::getNullValue(), llvm::APInt::getSignedMinValue(), intersectWith(), llvm::APInt::isAllOnesValue(), isEmptySet(), llvm::APInt::isMinSignedValue(), llvm::APInt::isNullValue(), llvm::MipsISD::Lo, llvm::LegalizeActions::Lower, llvm::APInt::sdiv(), Signed, and unionWith().

Referenced by binaryOp().

◆ 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 746 of file ConstantRange.cpp.

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

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

◆ 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 1130 of file ConstantRange.cpp.

References ConstantRange(), llvm::APInt::countLeadingZeros(), getUnsignedMax(), getUnsignedMin(), isEmptySet(), llvm::APInt::isNullValue(), llvm::max(), and llvm::APInt::ugt().

Referenced by binaryOp().

◆ signedAddMayOverflow()

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

◆ signedSubMayOverflow()

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

◆ 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 665 of file ConstantRange.cpp.

References assert(), ConstantRange(), getBitWidth(), llvm::APInt::getHighBitsSet(), llvm::APInt::getLowBitsSet(), isEmptySet(), isFullSet(), llvm::APInt::isMinSignedValue(), isSignWrappedSet(), llvm::LegalizeActions::Lower, llvm::APInt::sext(), and llvm::APInt::zext().

Referenced by castOp(), GetRangeFromMetadata(), llvm::ScalarEvolution::getSignExtendExpr(), and sextOrTrunc().

◆ 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 903 of file ConstantRange.cpp.

References getNonEmpty(), getSignedMax(), getSignedMin(), isEmptySet(), and llvm::APIntOps::smax().

Referenced by GetRangeFromMetadata().

◆ 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 925 of file ConstantRange.cpp.

References getNonEmpty(), getSignedMax(), getSignedMin(), isEmptySet(), and llvm::APIntOps::smin().

◆ 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 1065 of file ConstantRange.cpp.

References abs(), ConstantRange(), getBitWidth(), llvm::APInt::getNullValue(), getSignedMax(), getSignedMin(), getUnsignedMax(), getUnsignedMin(), isEmptySet(), llvm::APInt::isNonNegative(), llvm::APInt::isNullValue(), llvm::LegalizeActions::Lower, llvm::APInt::ugt(), llvm::APIntOps::umax(), and llvm::APIntOps::umin().

Referenced by binaryOp().

◆ ssub_sat()

ConstantRange ConstantRange::ssub_sat ( const ConstantRange Other) const

Perform a signed saturating subtraction of two constant ranges.

Definition at line 1242 of file ConstantRange.cpp.

References getNonEmpty(), getSignedMax(), getSignedMin(), isEmptySet(), and llvm::APInt::ssub_sat().

◆ 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 829 of file ConstantRange.cpp.

References ConstantRange(), getLower(), getUpper(), isEmptySet(), isFullSet(), isSizeStrictlySmallerThan(), and X.

Referenced by binaryOp().

◆ subtract()

ConstantRange ConstantRange::subtract ( const APInt CI) const

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

Definition at line 394 of file ConstantRange.cpp.

References assert(), ConstantRange(), getBitWidth(), llvm::APInt::getBitWidth(), and llvm::LegalizeActions::Lower.

Referenced by foldICmpShlOne(), llvm::SCEVAddRecExpr::getNumIterationsInRange(), and getValueFromICmpCondition().

◆ 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 683 of file ConstantRange.cpp.

References assert(), llvm::APInt::clearBit(), ConstantRange(), llvm::APInt::countTrailingOnes(), llvm::APInt::getActiveBits(), llvm::APInt::getBitsSetFrom(), getBitWidth(), llvm::APInt::getMaxValue(), isEmptySet(), isFullSet(), isUpperWrapped(), llvm::LegalizeActions::Lower, llvm::APInt::setAllBits(), llvm::APInt::trunc(), llvm::APInt::ult(), and unionWith().

Referenced by castOp(), GetRangeFromMetadata(), llvm::ScalarEvolution::getSignExtendExpr(), llvm::ScalarEvolution::getZeroExtendExpr(), multiply(), sextOrTrunc(), and zextOrTrunc().

◆ uadd_sat()

ConstantRange ConstantRange::uadd_sat ( const ConstantRange Other) const

Perform an unsigned saturating addition of two constant ranges.

Definition at line 1215 of file ConstantRange.cpp.

References getNonEmpty(), getUnsignedMax(), getUnsignedMin(), isEmptySet(), and llvm::APInt::uadd_sat().

◆ 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 947 of file ConstantRange.cpp.

References getLower(), getNonEmpty(), getUnsignedMax(), getUnsignedMin(), getUpper(), isEmptySet(), llvm::APInt::isNullValue(), llvm::LegalizeActions::Lower, and llvm::APInt::udiv().

Referenced by binaryOp(), and GetRangeFromMetadata().

◆ 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 914 of file ConstantRange.cpp.

References getNonEmpty(), getUnsignedMax(), getUnsignedMin(), isEmptySet(), and llvm::APIntOps::umax().

Referenced by binaryOr(), and GetRangeFromMetadata().

◆ 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 936 of file ConstantRange.cpp.

References getNonEmpty(), getUnsignedMax(), getUnsignedMin(), isEmptySet(), and llvm::APIntOps::umin().

Referenced by binaryAnd().

◆ 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 532 of file ConstantRange.cpp.

References assert(), ConstantRange(), getBitWidth(), getPreferredRange(), isEmptySet(), isFullSet(), llvm::APInt::isNullValue(), isUpperWrapped(), llvm::LegalizeActions::Lower, llvm::APInt::uge(), llvm::APInt::ugt(), llvm::APInt::ule(), llvm::APInt::ult(), and unionWith().

Referenced by getEdgeValueLocal(), getRangeForAffineARHelper(), GetRangeFromMetadata(), isSupportedGuardInstruction(), mapBinOpcode(), llvm::ValueLatticeElement::mergeIn(), processUDivOrURem(), sdiv(), truncate(), tryMergeRange(), and unionWith().

◆ unsignedAddMayOverflow()

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

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

Definition at line 1290 of file ConstantRange.cpp.

References AlwaysOverflowsHigh, getUnsignedMax(), getUnsignedMin(), isEmptySet(), MayOverflow, NeverOverflows, and llvm::APInt::ugt().

Referenced by llvm::computeOverflowForUnsignedAdd().

◆ unsignedMulMayOverflow()

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

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

Definition at line 1382 of file ConstantRange.cpp.

References AlwaysOverflowsHigh, getUnsignedMax(), getUnsignedMin(), isEmptySet(), MayOverflow, NeverOverflows, and llvm::APInt::umul_ov().

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 1336 of file ConstantRange.cpp.

References AlwaysOverflowsLow, getUnsignedMax(), getUnsignedMin(), isEmptySet(), MayOverflow, NeverOverflows, and llvm::APInt::ult().

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 1052 of file ConstantRange.cpp.

References getBitWidth(), getNonEmpty(), llvm::APInt::getNullValue(), getUnsignedMax(), getUnsignedMin(), isEmptySet(), llvm::APInt::isNullValue(), llvm::APInt::ult(), and llvm::APIntOps::umin().

Referenced by binaryOp().

◆ usub_sat()

ConstantRange ConstantRange::usub_sat ( const ConstantRange Other) const

Perform an unsigned saturating subtraction of two constant ranges.

Definition at line 1233 of file ConstantRange.cpp.

References getNonEmpty(), getUnsignedMax(), getUnsignedMin(), isEmptySet(), and llvm::APInt::usub_sat().

◆ 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 648 of file ConstantRange.cpp.

References assert(), ConstantRange(), getBitWidth(), llvm::APInt::getOneBitSet(), isEmptySet(), isFullSet(), isUpperWrapped(), llvm::LegalizeActions::Lower, and llvm::APInt::zext().

Referenced by castOp(), GetRangeFromMetadata(), llvm::ScalarEvolution::getZeroExtendExpr(), and zextOrTrunc().

◆ 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 737 of file ConstantRange.cpp.

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

Referenced by llvm::StackSafetyInfo::FunctionInfo::FunctionInfo(), and llvm::ScalarEvolution::getZeroExtendExpr().


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