|
LLVM 22.0.0git
|
#include "llvm/Analysis/ValueTracking.h"#include "llvm/ADT/APFloat.h"#include "llvm/ADT/APInt.h"#include "llvm/ADT/ArrayRef.h"#include "llvm/ADT/FloatingPointMode.h"#include "llvm/ADT/STLExtras.h"#include "llvm/ADT/ScopeExit.h"#include "llvm/ADT/SmallPtrSet.h"#include "llvm/ADT/SmallVector.h"#include "llvm/ADT/StringRef.h"#include "llvm/ADT/iterator_range.h"#include "llvm/Analysis/AliasAnalysis.h"#include "llvm/Analysis/AssumeBundleQueries.h"#include "llvm/Analysis/AssumptionCache.h"#include "llvm/Analysis/ConstantFolding.h"#include "llvm/Analysis/DomConditionCache.h"#include "llvm/Analysis/FloatingPointPredicateUtils.h"#include "llvm/Analysis/GuardUtils.h"#include "llvm/Analysis/InstructionSimplify.h"#include "llvm/Analysis/Loads.h"#include "llvm/Analysis/LoopInfo.h"#include "llvm/Analysis/TargetLibraryInfo.h"#include "llvm/Analysis/VectorUtils.h"#include "llvm/Analysis/WithCache.h"#include "llvm/IR/Argument.h"#include "llvm/IR/Attributes.h"#include "llvm/IR/BasicBlock.h"#include "llvm/IR/Constant.h"#include "llvm/IR/ConstantFPRange.h"#include "llvm/IR/ConstantRange.h"#include "llvm/IR/Constants.h"#include "llvm/IR/DerivedTypes.h"#include "llvm/IR/DiagnosticInfo.h"#include "llvm/IR/Dominators.h"#include "llvm/IR/EHPersonalities.h"#include "llvm/IR/Function.h"#include "llvm/IR/GetElementPtrTypeIterator.h"#include "llvm/IR/GlobalAlias.h"#include "llvm/IR/GlobalValue.h"#include "llvm/IR/GlobalVariable.h"#include "llvm/IR/InstrTypes.h"#include "llvm/IR/Instruction.h"#include "llvm/IR/Instructions.h"#include "llvm/IR/IntrinsicInst.h"#include "llvm/IR/Intrinsics.h"#include "llvm/IR/IntrinsicsAArch64.h"#include "llvm/IR/IntrinsicsAMDGPU.h"#include "llvm/IR/IntrinsicsRISCV.h"#include "llvm/IR/IntrinsicsX86.h"#include "llvm/IR/LLVMContext.h"#include "llvm/IR/Metadata.h"#include "llvm/IR/Module.h"#include "llvm/IR/Operator.h"#include "llvm/IR/PatternMatch.h"#include "llvm/IR/Type.h"#include "llvm/IR/User.h"#include "llvm/IR/Value.h"#include "llvm/Support/Casting.h"#include "llvm/Support/CommandLine.h"#include "llvm/Support/Compiler.h"#include "llvm/Support/ErrorHandling.h"#include "llvm/Support/KnownBits.h"#include "llvm/Support/KnownFPClass.h"#include "llvm/Support/MathExtras.h"#include "llvm/TargetParser/RISCVTargetParser.h"#include <algorithm>#include <cassert>#include <cstdint>#include <optional>#include <utility>Go to the source code of this file.
Enumerations | |
| enum class | UndefPoisonKind { PoisonOnly = (1 << 0) , UndefOnly = (1 << 1) , UndefOrPoison = PoisonOnly | UndefOnly } |
Functions | |
| static unsigned | getBitWidth (Type *Ty, const DataLayout &DL) |
| Returns the bitwidth of the given scalar or pointer type. | |
| static const Instruction * | safeCxtI (const Value *V, const Instruction *CxtI) |
| static bool | getShuffleDemandedElts (const ShuffleVectorInst *Shuf, const APInt &DemandedElts, APInt &DemandedLHS, APInt &DemandedRHS) |
| static void | computeKnownBits (const Value *V, const APInt &DemandedElts, KnownBits &Known, const SimplifyQuery &Q, unsigned Depth) |
| Determine which bits of V are known to be either zero or one and return them in the Known bit set. | |
| static bool | haveNoCommonBitsSetSpecialCases (const Value *LHS, const Value *RHS, const SimplifyQuery &SQ) |
| static bool | isKnownNonZero (const Value *V, const APInt &DemandedElts, const SimplifyQuery &Q, unsigned Depth) |
| Return true if the given value is known to be non-zero when defined. | |
| static bool | isKnownNonEqual (const Value *V1, const Value *V2, const APInt &DemandedElts, const SimplifyQuery &Q, unsigned Depth) |
| Return true if it is known that V1 != V2. | |
| static unsigned | ComputeNumSignBits (const Value *V, const APInt &DemandedElts, const SimplifyQuery &Q, unsigned Depth) |
| static unsigned | ComputeNumSignBits (const Value *V, const SimplifyQuery &Q, unsigned Depth=0) |
| static void | computeKnownBitsFromLerpPattern (const Value *Op0, const Value *Op1, const APInt &DemandedElts, KnownBits &KnownOut, const SimplifyQuery &Q, unsigned Depth) |
| Try to detect the lerp pattern: a * (b - c) + c * d where a >= 0, b >= 0, c >= 0, d >= 0, and b >= c. | |
| static void | computeKnownBitsAddSub (bool Add, const Value *Op0, const Value *Op1, bool NSW, bool NUW, const APInt &DemandedElts, KnownBits &KnownOut, KnownBits &Known2, const SimplifyQuery &Q, unsigned Depth) |
| static void | computeKnownBitsMul (const Value *Op0, const Value *Op1, bool NSW, bool NUW, const APInt &DemandedElts, KnownBits &Known, KnownBits &Known2, const SimplifyQuery &Q, unsigned Depth) |
| static bool | isEphemeralValueOf (const Instruction *I, const Value *E) |
| static bool | cmpExcludesZero (CmpInst::Predicate Pred, const Value *RHS) |
| static void | breakSelfRecursivePHI (const Use *U, const PHINode *PHI, Value *&ValOut, Instruction *&CtxIOut, const PHINode **PhiOut=nullptr) |
| static bool | isKnownNonZeroFromAssume (const Value *V, const SimplifyQuery &Q) |
| static void | computeKnownBitsFromCmp (const Value *V, CmpInst::Predicate Pred, Value *LHS, Value *RHS, KnownBits &Known, const SimplifyQuery &Q) |
| static void | computeKnownBitsFromICmpCond (const Value *V, ICmpInst *Cmp, KnownBits &Known, const SimplifyQuery &SQ, bool Invert) |
| static void | computeKnownBitsFromCond (const Value *V, Value *Cond, KnownBits &Known, const SimplifyQuery &SQ, bool Invert, unsigned Depth) |
| static void | computeKnownBitsFromShiftOperator (const Operator *I, const APInt &DemandedElts, KnownBits &Known, KnownBits &Known2, const SimplifyQuery &Q, unsigned Depth, function_ref< KnownBits(const KnownBits &, const KnownBits &, bool)> KF) |
| Compute known bits from a shift operator, including those with a non-constant shift amount. | |
| static KnownBits | getKnownBitsFromAndXorOr (const Operator *I, const APInt &DemandedElts, const KnownBits &KnownLHS, const KnownBits &KnownRHS, const SimplifyQuery &Q, unsigned Depth) |
| static KnownBits | computeKnownBitsForHorizontalOperation (const Operator *I, const APInt &DemandedElts, const SimplifyQuery &Q, unsigned Depth, const function_ref< KnownBits(const KnownBits &, const KnownBits &)> KnownBitsFunc) |
| static bool | isSignedMinMaxClamp (const Value *Select, const Value *&In, const APInt *&CLow, const APInt *&CHigh) |
| static bool | isSignedMinMaxIntrinsicClamp (const IntrinsicInst *II, const APInt *&CLow, const APInt *&CHigh) |
| static void | unionWithMinMaxIntrinsicClamp (const IntrinsicInst *II, KnownBits &Known) |
| static void | computeKnownBitsFromOperator (const Operator *I, const APInt &DemandedElts, KnownBits &Known, const SimplifyQuery &Q, unsigned Depth) |
| static bool | isPowerOfTwoRecurrence (const PHINode *PN, bool OrZero, SimplifyQuery &Q, unsigned Depth) |
| Try to detect a recurrence that the value of the induction variable is always a power of two (or zero). | |
| static bool | isImpliedToBeAPowerOfTwoFromCond (const Value *V, bool OrZero, const Value *Cond, bool CondIsTrue) |
Return true if we can infer that V is known to be a power of 2 from dominating condition Cond (e.g., ctpop(V) == 1). | |
| static bool | isGEPKnownNonNull (const GEPOperator *GEP, const SimplifyQuery &Q, unsigned Depth) |
| Test whether a GEP's result is known to be non-null. | |
| static bool | isKnownNonNullFromDominatingCondition (const Value *V, const Instruction *CtxI, const DominatorTree *DT) |
| static bool | rangeMetadataExcludesValue (const MDNode *Ranges, const APInt &Value) |
| Does the 'Range' metadata (which must be a valid MD_range operand list) ensure that the value it's attached to is never Value? | |
| static bool | isNonZeroRecurrence (const PHINode *PN) |
| Try to detect a recurrence that monotonically increases/decreases from a non-zero starting value. | |
| static bool | matchOpWithOpEqZero (Value *Op0, Value *Op1) |
| static bool | isNonZeroAdd (const APInt &DemandedElts, const SimplifyQuery &Q, unsigned BitWidth, Value *X, Value *Y, bool NSW, bool NUW, unsigned Depth) |
| static bool | isNonZeroSub (const APInt &DemandedElts, const SimplifyQuery &Q, unsigned BitWidth, Value *X, Value *Y, unsigned Depth) |
| static bool | isNonZeroMul (const APInt &DemandedElts, const SimplifyQuery &Q, unsigned BitWidth, Value *X, Value *Y, bool NSW, bool NUW, unsigned Depth) |
| static bool | isNonZeroShift (const Operator *I, const APInt &DemandedElts, const SimplifyQuery &Q, const KnownBits &KnownVal, unsigned Depth) |
| static bool | isKnownNonZeroFromOperator (const Operator *I, const APInt &DemandedElts, const SimplifyQuery &Q, unsigned Depth) |
| static std::optional< std::pair< Value *, Value * > > | getInvertibleOperands (const Operator *Op1, const Operator *Op2) |
| If the pair of operators are the same invertible function, return the the operands of the function corresponding to each input. | |
| static bool | isModifyingBinopOfNonZero (const Value *V1, const Value *V2, const APInt &DemandedElts, const SimplifyQuery &Q, unsigned Depth) |
| Return true if V1 == (binop V2, X), where X is known non-zero. | |
| static bool | isNonEqualMul (const Value *V1, const Value *V2, const APInt &DemandedElts, const SimplifyQuery &Q, unsigned Depth) |
| Return true if V2 == V1 * C, where V1 is known non-zero, C is not 0/1 and the multiplication is nuw or nsw. | |
| static bool | isNonEqualShl (const Value *V1, const Value *V2, const APInt &DemandedElts, const SimplifyQuery &Q, unsigned Depth) |
| Return true if V2 == V1 << C, where V1 is known non-zero, C is not 0 and the shift is nuw or nsw. | |
| static bool | isNonEqualPHIs (const PHINode *PN1, const PHINode *PN2, const APInt &DemandedElts, const SimplifyQuery &Q, unsigned Depth) |
| static bool | isNonEqualSelect (const Value *V1, const Value *V2, const APInt &DemandedElts, const SimplifyQuery &Q, unsigned Depth) |
| static bool | isNonEqualPointersWithRecursiveGEP (const Value *A, const Value *B, const SimplifyQuery &Q) |
| static bool | isKnownNonEqualFromContext (const Value *V1, const Value *V2, const SimplifyQuery &Q, unsigned Depth) |
| static unsigned | computeNumSignBitsVectorConstant (const Value *V, const APInt &DemandedElts, unsigned TyBits) |
| For vector constants, loop over the elements and find the constant with the minimum number of sign bits. | |
| static unsigned | ComputeNumSignBitsImpl (const Value *V, const APInt &DemandedElts, const SimplifyQuery &Q, unsigned Depth) |
| Return the number of times the sign bit of the register is replicated into the other bits. | |
| static bool | outputDenormalIsIEEEOrPosZero (const Function &F, const Type *Ty) |
| static void | computeKnownFPClassFromCond (const Value *V, Value *Cond, bool CondIsTrue, const Instruction *CxtI, KnownFPClass &KnownFromContext, unsigned Depth=0) |
| static KnownFPClass | computeKnownFPClassFromContext (const Value *V, const SimplifyQuery &Q) |
| void | computeKnownFPClass (const Value *V, const APInt &DemandedElts, FPClassTest InterestedClasses, KnownFPClass &Known, const SimplifyQuery &Q, unsigned Depth) |
| static void | computeKnownFPClass (const Value *V, KnownFPClass &Known, FPClassTest InterestedClasses, const SimplifyQuery &Q, unsigned Depth) |
| static void | computeKnownFPClassForFPTrunc (const Operator *Op, const APInt &DemandedElts, FPClassTest InterestedClasses, KnownFPClass &Known, const SimplifyQuery &Q, unsigned Depth) |
| static Value * | BuildSubAggregate (Value *From, Value *To, Type *IndexedType, SmallVectorImpl< unsigned > &Idxs, unsigned IdxSkip, BasicBlock::iterator InsertBefore) |
| static Value * | BuildSubAggregate (Value *From, ArrayRef< unsigned > idx_range, BasicBlock::iterator InsertBefore) |
| static uint64_t | GetStringLengthH (const Value *V, SmallPtrSetImpl< const PHINode * > &PHIs, unsigned CharSize) |
| If we can compute the length of the string pointed to by the specified pointer, return 'len+1'. | |
| static bool | isSameUnderlyingObjectInLoop (const PHINode *PN, const LoopInfo *LI) |
PN defines a loop-variant pointer to an object. | |
| static const Value * | getUnderlyingObjectFromInt (const Value *V) |
| This is the function that does the work of looking through basic ptrtoint+arithmetic+inttoptr sequences. | |
| static bool | onlyUsedByLifetimeMarkersOrDroppableInstsHelper (const Value *V, bool AllowLifetime, bool AllowDroppable) |
| static OverflowResult | mapOverflowResult (ConstantRange::OverflowResult OR) |
| Convert ConstantRange OverflowResult into ValueTracking OverflowResult. | |
| static OverflowResult | computeOverflowForSignedAdd (const WithCache< const Value * > &LHS, const WithCache< const Value * > &RHS, const AddOperator *Add, const SimplifyQuery &SQ) |
| static bool | shiftAmountKnownInRange (const Value *ShiftAmount) |
| Shifts return poison if shiftwidth is larger than the bitwidth. | |
| static bool | includesPoison (UndefPoisonKind Kind) |
| static bool | includesUndef (UndefPoisonKind Kind) |
| static bool | canCreateUndefOrPoison (const Operator *Op, UndefPoisonKind Kind, bool ConsiderFlagsAndMetadata) |
| static bool | directlyImpliesPoison (const Value *ValAssumedPoison, const Value *V, unsigned Depth) |
| static bool | impliesPoison (const Value *ValAssumedPoison, const Value *V, unsigned Depth) |
| static bool | programUndefinedIfUndefOrPoison (const Value *V, bool PoisonOnly) |
| static bool | isGuaranteedNotToBeUndefOrPoison (const Value *V, AssumptionCache *AC, const Instruction *CtxI, const DominatorTree *DT, unsigned Depth, UndefPoisonKind Kind) |
| template<typename CallableT> | |
| static bool | handleGuaranteedWellDefinedOps (const Instruction *I, const CallableT &Handle) |
Enumerates all operands of I that are guaranteed to not be undef or poison. | |
| template<typename CallableT> | |
| static bool | handleGuaranteedNonPoisonOps (const Instruction *I, const CallableT &Handle) |
Enumerates all operands of I that are guaranteed to not be poison. | |
| static bool | isKnownNonNaN (const Value *V, FastMathFlags FMF) |
| static bool | isKnownNonZero (const Value *V) |
| static SelectPatternResult | matchFastFloatClamp (CmpInst::Predicate Pred, Value *CmpLHS, Value *CmpRHS, Value *TrueVal, Value *FalseVal, Value *&LHS, Value *&RHS) |
| Match clamp pattern for float types without care about NaNs or signed zeros. | |
| static SelectPatternResult | matchClamp (CmpInst::Predicate Pred, Value *CmpLHS, Value *CmpRHS, Value *TrueVal, Value *FalseVal) |
| Recognize variations of: CLAMP(v,l,h) ==> ((v) < (l) ? | |
| static SelectPatternResult | matchMinMaxOfMinMax (CmpInst::Predicate Pred, Value *CmpLHS, Value *CmpRHS, Value *TVal, Value *FVal, unsigned Depth) |
| Recognize variations of: a < c ? | |
| static Value * | getNotValue (Value *V) |
| If the input value is the result of a 'not' op, constant integer, or vector splat of a constant integer, return the bitwise-not source value. | |
| static SelectPatternResult | matchMinMax (CmpInst::Predicate Pred, Value *CmpLHS, Value *CmpRHS, Value *TrueVal, Value *FalseVal, Value *&LHS, Value *&RHS, unsigned Depth) |
| Match non-obvious integer minimum and maximum sequences. | |
| static SelectPatternResult | matchSelectPattern (CmpInst::Predicate Pred, FastMathFlags FMF, Value *CmpLHS, Value *CmpRHS, Value *TrueVal, Value *FalseVal, Value *&LHS, Value *&RHS, unsigned Depth) |
| static Value * | lookThroughCastConst (CmpInst *CmpI, Type *SrcTy, Constant *C, Instruction::CastOps *CastOp) |
| static Value * | lookThroughCast (CmpInst *CmpI, Value *V1, Value *V2, Instruction::CastOps *CastOp) |
| Helps to match a select pattern in case of a type mismatch. | |
| template<typename InstTy> | |
| static bool | matchTwoInputRecurrence (const PHINode *PN, InstTy *&Inst, Value *&Init, Value *&OtherOp) |
| static bool | isTruePredicate (CmpInst::Predicate Pred, const Value *LHS, const Value *RHS) |
| Return true if "icmp Pred LHS RHS" is always true. | |
| static std::optional< bool > | isImpliedCondOperands (CmpInst::Predicate Pred, const Value *ALHS, const Value *ARHS, const Value *BLHS, const Value *BRHS) |
| Return true if "icmp Pred BLHS BRHS" is true whenever "icmp Pred
ALHS ARHS" is true. | |
| static std::optional< bool > | isImpliedCondCommonOperandWithCR (CmpPredicate LPred, const ConstantRange &LCR, CmpPredicate RPred, const ConstantRange &RCR) |
| Return true if "icmp LPred X, LCR" implies "icmp RPred X, RCR" is true. | |
| static std::optional< bool > | isImpliedCondICmps (CmpPredicate LPred, const Value *L0, const Value *L1, CmpPredicate RPred, const Value *R0, const Value *R1, const DataLayout &DL, bool LHSIsTrue) |
| Return true if LHS implies RHS (expanded to its components as "R0 RPred R1") is true. | |
| static std::optional< bool > | isImpliedCondFCmps (FCmpInst::Predicate LPred, const Value *L0, const Value *L1, FCmpInst::Predicate RPred, const Value *R0, const Value *R1, const DataLayout &DL, bool LHSIsTrue) |
| Return true if LHS implies RHS (expanded to its components as "R0 RPred R1") is true. | |
| static std::optional< bool > | isImpliedCondAndOr (const Instruction *LHS, CmpPredicate RHSPred, const Value *RHSOp0, const Value *RHSOp1, const DataLayout &DL, bool LHSIsTrue, unsigned Depth) |
| Return true if LHS implies RHS is true. | |
| static std::pair< Value *, bool > | getDomPredecessorCondition (const Instruction *ContextI) |
| static void | setLimitsForBinOp (const BinaryOperator &BO, APInt &Lower, APInt &Upper, const InstrInfoQuery &IIQ, bool PreferSignedRange) |
| static ConstantRange | getRangeForIntrinsic (const IntrinsicInst &II, bool UseInstrInfo) |
| static ConstantRange | getRangeForSelectPattern (const SelectInst &SI, const InstrInfoQuery &IIQ) |
| static void | setLimitForFPToI (const Instruction *I, APInt &Lower, APInt &Upper) |
| static void | addValueAffectedByCondition (Value *V, function_ref< void(Value *)> InsertAffected) |
Variables | |
| static cl::opt< unsigned > | DomConditionsMaxUses ("dom-conditions-max-uses", cl::Hidden, cl::init(20)) |
| static constexpr unsigned | MaxInstrsToCheckForFree = 16 |
| Maximum number of instructions to check between assume and context instruction. | |
|
strong |
| Enumerator | |
|---|---|
| PoisonOnly | |
| UndefOnly | |
| UndefOrPoison | |
Definition at line 7534 of file ValueTracking.cpp.
|
static |
Definition at line 10334 of file ValueTracking.cpp.
References assert(), llvm::dyn_cast(), I, llvm::isa(), llvm::PatternMatch::m_CombineOr(), llvm::PatternMatch::m_PtrToInt(), llvm::PatternMatch::m_Trunc(), llvm::PatternMatch::m_Value(), and llvm::PatternMatch::match().
Referenced by llvm::findValuesAffectedByCondition().
|
static |
Definition at line 783 of file ValueTracking.cpp.
References llvm::dyn_cast(), llvm::PatternMatch::m_Select(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), and PHI.
Referenced by computeKnownBitsFromOperator(), and computeKnownFPClass().
|
static |
Definition at line 6446 of file ValueTracking.cpp.
References BuildSubAggregate(), llvm::PoisonValue::get(), llvm::ExtractValueInst::getIndexedType(), llvm::Value::getType(), and llvm::SmallVectorTemplateCommon< T, typename >::size().
|
static |
Definition at line 6387 of file ValueTracking.cpp.
References llvm::ArrayRef(), BuildSubAggregate(), llvm::cast(), llvm::InsertValueInst::Create(), llvm::dyn_cast(), llvm::Instruction::eraseFromParent(), llvm::FindInsertedValue(), llvm::InsertValueInst::getAggregateOperand(), llvm::StructType::getElementType(), llvm::StructType::getNumElements(), llvm::SmallVectorTemplateBase< T, bool >::pop_back(), and llvm::SmallVectorTemplateBase< T, bool >::push_back().
Referenced by BuildSubAggregate(), BuildSubAggregate(), and llvm::FindInsertedValue().
|
static |
Definition at line 7548 of file ValueTracking.cpp.
References llvm::cast(), llvm::dyn_cast(), II, includesPoison(), llvm::is_contained(), llvm::isa(), llvm::Instruction::isBinaryOp(), llvm::PoisonMaskElem, and shiftAmountKnownInRange().
|
static |
Definition at line 752 of file ValueTracking.cpp.
References llvm::CallingConv::C, llvm::ConstantRange::contains(), llvm::dyn_cast(), llvm::APInt::getZero(), llvm::CmpInst::ICMP_NE, llvm::CmpInst::ICMP_UGT, llvm::PatternMatch::m_APInt(), llvm::PatternMatch::m_Zero(), llvm::ConstantRange::makeExactICmpRegion(), llvm::PatternMatch::match(), and RHS.
Referenced by isKnownNonNullFromDominatingCondition(), isKnownNonZeroFromAssume(), and isKnownNonZeroFromOperator().
|
static |
Determine which bits of V are known to be either zero or one and return them in the Known bit set.
NOTE: we cannot consider 'undef' to be "IsZero" here. The problem is that we cannot optimize based on the assumption that it is zero without changing it to be an explicit zero. If we don't change it to zero, other code could optimized based on the contradictory assumption that it is non-zero. Because instcombine aggressively folds operations with undef args anyway, this won't lose us code quality.
This function is defined on values with integer type, values with pointer type, and vectors of integers. In the case where V is a vector, known zero, and known one values are the same width as the vector element, and the bit is set only if it is true for all of the demanded elements in the vector specified by DemandedElts.
Definition at line 2398 of file ValueTracking.cpp.
References A(), assert(), llvm::BitWidth, llvm::CallingConv::C, llvm::computeKnownBits(), llvm::computeKnownBitsFromContext(), computeKnownBitsFromOperator(), llvm::Depth, llvm::SimplifyQuery::DL, llvm::dyn_cast(), llvm::dyn_cast_or_null(), llvm::Constant::getAggregateElement(), llvm::APInt::getBitWidth(), llvm::KnownBits::getBitWidth(), llvm::DataLayout::getPointerTypeSizeInBits(), llvm::Type::getScalarType(), llvm::DataLayout::getTypeSizeInBits(), llvm::KnownBits::hasConflict(), I, llvm::isa(), llvm::Type::isPointerTy(), llvm::Log2(), llvm::PatternMatch::m_APInt(), llvm::KnownBits::makeConstant(), llvm::PatternMatch::match(), llvm::MaxAnalysisRecursionDepth, llvm::KnownBits::One, Range, llvm::KnownBits::resetAll(), llvm::KnownBits::setAllConflict(), llvm::KnownBits::setAllZero(), llvm::APInt::setLowBits(), and llvm::KnownBits::Zero.
|
static |
Definition at line 486 of file ValueTracking.cpp.
References llvm::Add, llvm::KnownBits::computeForAddSub(), llvm::computeKnownBits(), computeKnownBitsFromLerpPattern(), llvm::SimplifyQuery::CxtI, llvm::Depth, llvm::SimplifyQuery::DL, llvm::CmpInst::ICMP_SLE, llvm::isImpliedByDomCondition(), llvm::KnownBits::isNonNegative(), llvm::KnownBits::isUnknown(), and llvm::KnownBits::makeNonNegative().
Referenced by computeKnownBitsFromOperator().
|
static |
Definition at line 1239 of file ValueTracking.cpp.
References llvm::computeKnownBits(), llvm::Depth, llvm::SimplifyQuery::DL, llvm::getHorizDemandedEltsForFirstOperand(), llvm::DataLayout::getTypeSizeInBits(), I, and llvm::APInt::isZero().
Referenced by llvm::X86TargetLowering::computeKnownBitsForTargetNode(), and computeKnownBitsFromOperator().
|
static |
Definition at line 865 of file ValueTracking.cpp.
References llvm::BitWidth, llvm::CallingConv::C, llvm::SimplifyQuery::DL, llvm::KnownBits::getBitWidth(), llvm::CmpInst::ICMP_EQ, llvm::CmpInst::ICMP_NE, llvm::CmpInst::ICMP_SGE, llvm::CmpInst::ICMP_SGT, llvm::CmpInst::ICMP_SLT, llvm::CmpInst::ICMP_UGE, llvm::CmpInst::ICMP_UGT, llvm::CmpInst::ICMP_ULE, llvm::CmpInst::ICMP_ULT, LHS, llvm::PatternMatch::m_AddLike(), llvm::PatternMatch::m_And(), llvm::PatternMatch::m_APInt(), llvm::PatternMatch::m_c_And(), llvm::PatternMatch::m_c_NUWAdd(), llvm::PatternMatch::m_c_Or(), llvm::PatternMatch::m_CombineOr(), llvm::PatternMatch::m_ConstantInt(), llvm::PatternMatch::m_NUWSub(), llvm::PatternMatch::m_Power2(), llvm::PatternMatch::m_PtrToIntSameSize(), llvm::PatternMatch::m_Shl(), llvm::PatternMatch::m_Shr(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::m_Zero(), llvm::ConstantRange::makeAllowedICmpRegion(), llvm::KnownBits::makeConstant(), llvm::KnownBits::makeNegative(), llvm::KnownBits::makeNonNegative(), llvm::PatternMatch::match(), llvm::Offset, llvm::KnownBits::One, RHS, llvm::KnownBits::setAllZero(), llvm::APInt::setHighBits(), llvm::ConstantRange::sub(), llvm::ConstantRange::toKnownBits(), llvm::KnownBits::unionWith(), Y, and llvm::KnownBits::Zero.
Referenced by computeKnownBitsFromICmpCond().
|
static |
Definition at line 993 of file ValueTracking.cpp.
References A(), llvm::KnownBits::anyext(), B(), llvm::cast(), computeKnownBitsFromCond(), computeKnownBitsFromICmpCond(), Cond, llvm::Depth, llvm::dyn_cast(), llvm::KnownBits::getBitWidth(), hasNoUnsignedWrap(), llvm::KnownBits::intersectWith(), llvm::PatternMatch::m_LogicalAnd(), llvm::PatternMatch::m_LogicalOp(), llvm::PatternMatch::m_LogicalOr(), llvm::MIPatternMatch::m_Not(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_Trunc(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), llvm::MaxAnalysisRecursionDepth, llvm::KnownBits::setAllOnes(), llvm::KnownBits::setAllZero(), llvm::KnownBits::unionWith(), and llvm::KnownBits::zext().
Referenced by llvm::adjustKnownBitsForSelectArm(), computeKnownBitsFromCond(), and llvm::computeKnownBitsFromContext().
|
static |
Definition at line 971 of file ValueTracking.cpp.
References llvm::KnownBits::anyext(), llvm::cast(), computeKnownBitsFromCmp(), llvm::KnownBits::getBitWidth(), hasNoUnsignedWrap(), LHS, llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_Trunc(), llvm::PatternMatch::match(), RHS, llvm::KnownBits::unionWith(), and llvm::KnownBits::zext().
Referenced by computeKnownBitsFromCond(), and llvm::computeKnownBitsFromContext().
|
static |
Try to detect the lerp pattern: a * (b - c) + c * d where a >= 0, b >= 0, c >= 0, d >= 0, and b >= c.
In that particular case, we can use the following chain of reasoning:
a * (b - c) + c * d <= a' * (b - c) + a' * c = a' * b where a' = max(a, d)
Since that is true for arbitrary a, b, c and d within our constraints, we can conclude that:
max(a * (b - c) + c * d) <= max(max(a), max(d)) * max(b) = U
Considering that any result of the lerp would be less or equal to U, it would have at least the number of leading 0s as in U.
While being quite a specific situation, it is fairly common in computer graphics in the shape of alpha blending.
Modifies given KnownOut in-place with the inferred information.
Definition at line 372 of file ValueTracking.cpp.
References A(), B(), llvm::BitWidth, llvm::CallingConv::C, llvm::computeKnownBits(), llvm::APInt::countl_zero(), D(), llvm::Depth, llvm::KnownBits::getMaxValue(), llvm::KnownBits::getMinValue(), llvm::Instruction::getOpcode(), llvm::Value::getType(), llvm::KnownBits::isNonNegative(), llvm::APInt::isSubsetOf(), LHS, llvm::PatternMatch::m_c_Mul(), llvm::PatternMatch::m_CombineOr(), llvm::PatternMatch::m_Instruction(), llvm::PatternMatch::m_NUWSub(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::m_Xor(), llvm::KnownBits::makeConstant(), llvm::PatternMatch::match(), RHS, llvm::APInt::setHighBits(), llvm::APIntOps::umax(), llvm::APInt::umul_ov(), and llvm::KnownBits::Zero.
Referenced by computeKnownBitsAddSub().
|
static |
Definition at line 1390 of file ValueTracking.cpp.
References llvm::KnownBits::abs(), llvm::SimplifyQuery::AC, llvm::KnownBits::add(), llvm::adjustKnownBitsForSelectArm(), llvm::KnownBits::anyextOrTrunc(), llvm::KnownBits::ashr(), assert(), llvm::bit_width(), llvm::BitWidth, breakSelfRecursivePHI(), llvm::KnownBits::byteSwap(), llvm::CallingConv::C, llvm::cast(), llvm::APInt::clearAllBits(), llvm::APInt::clearBit(), llvm::APInt::clearSignBit(), llvm::computeKnownBits(), computeKnownBitsAddSub(), computeKnownBitsForHorizontalOperation(), llvm::computeKnownBitsFromRangeMetadata(), computeKnownBitsFromShiftOperator(), computeKnownBitsMul(), llvm::computeKnownFPClass(), llvm::KnownBits::countMaxLeadingZeros(), llvm::KnownBits::countMaxPopulation(), llvm::KnownBits::countMaxTrailingZeros(), llvm::KnownBits::countMinLeadingOnes(), llvm::KnownBits::countMinLeadingZeros(), llvm::KnownBits::countMinTrailingZeros(), llvm::countr_zero(), llvm::SimplifyQuery::CxtI, llvm::RISCVVType::decodeVSEW(), llvm::Depth, llvm::SimplifyQuery::DL, llvm::SimplifyQuery::DT, llvm::dyn_cast(), llvm::KnownBits::extractBits(), llvm::fcAllFlags, llvm::fcInf, llvm::fcNan, llvm::fcNone, llvm::fcNormal, llvm::fcSubnormal, llvm::fcZero, llvm::gep_type_begin(), llvm::getAlign(), llvm::APInt::getAllOnes(), llvm::APInt::getBitWidth(), llvm::KnownBits::getBitWidth(), llvm::StructLayout::getElementOffset(), llvm::generic_gep_type_iterator< ItTy >::getIndexedType(), llvm::DataLayout::getIndexTypeSizeInBits(), llvm::ExtractValueInst::getIndices(), llvm::APFloat::getInf(), llvm::CmpInst::getInversePredicate(), getKnownBitsFromAndXorOr(), llvm::details::FixedOrScalableQuantity< LeafTy, ValueTy >::getKnownMinValue(), llvm::InstrInfoQuery::getMetadata(), llvm::ExtractValueInst::getNumIndices(), llvm::APInt::getOneBitSet(), llvm::BinaryOperator::getOpcode(), llvm::User::getOperand(), llvm::ilist_detail::node_parent_access< NodeTy, ParentTy >::getParent(), llvm::DataLayout::getPointerTypeSizeInBits(), llvm::Type::getScalarType(), llvm::generic_gep_type_iterator< ItTy >::getSequentialElementStride(), llvm::RISCVVType::getSEWLMULRatio(), llvm::getShuffleDemandedElts(), llvm::Constant::getSplatValue(), llvm::DataLayout::getStructLayout(), llvm::generic_gep_type_iterator< ItTy >::getStructTypeOrNull(), llvm::ConstantInt::getTrue(), llvm::Value::getType(), llvm::DataLayout::getTypeSizeInBits(), llvm::getVScaleRange(), llvm::SimplifyQuery::getWithInstruction(), llvm::SimplifyQuery::getWithoutCondContext(), llvm::APInt::getZero(), llvm::KnownBits::hasConflict(), llvm::InstrInfoQuery::hasNoSignedWrap(), llvm::InstrInfoQuery::hasNoUnsignedWrap(), I, II, llvm::SimplifyQuery::IIQ, llvm::KnownBits::insertBits(), llvm::KnownBits::intersectWith(), llvm::isa(), llvm::isa_and_nonnull(), llvm::KnownBits::isConstant(), llvm::InstrInfoQuery::isExact(), llvm::isGuaranteedNotToBePoison(), llvm::DataLayout::isLittleEndian(), llvm::KnownBits::isNegative(), llvm::KnownBits::isNonNegative(), llvm::Type::isPointerTy(), llvm::details::FixedOrScalableQuantity< LeafTy, ValueTy >::isScalable(), llvm::Type::isSized(), llvm::KnownBits::isUnknown(), llvm::Type::isVectorTy(), llvm::APInt::isZero(), llvm::Constant::isZeroValue(), LHS, llvm::Log2(), llvm::Log2_32(), llvm::KnownBits::lshr(), llvm::PatternMatch::m_APInt(), llvm::PatternMatch::m_BasicBlock(), llvm::PatternMatch::m_Br(), llvm::PatternMatch::m_c_ICmp(), llvm::PatternMatch::m_ElementWiseBitCast(), llvm::PatternMatch::m_One(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_Value(), llvm::KnownBits::makeConstant(), llvm::ConstantRange::makeExactICmpRegion(), llvm::KnownBits::makeNegative(), llvm::KnownBits::makeNonNegative(), llvm::PatternMatch::match(), llvm::matchSimpleRecurrence(), llvm::MaxAnalysisRecursionDepth, llvm::KnownBits::mul(), llvm::KnownBits::mulhs(), llvm::KnownBits::mulhu(), llvm::Offset, llvm::KnownBits::One, P, Range, llvm::KnownBits::resetAll(), llvm::APInt::reverseBits(), llvm::KnownBits::reverseBits(), RHS, llvm::RISCV::RVVBitsPerBlock, llvm::KnownBits::sadd_sat(), llvm::APIntOps::ScaleBitMask(), llvm::KnownBits::sdiv(), llvm::KnownBits::setAllConflict(), llvm::APInt::setBit(), llvm::APInt::setBitsFrom(), llvm::APInt::setHighBits(), llvm::APInt::setLowBits(), llvm::KnownBits::sext(), llvm::APInt::sextOrTrunc(), llvm::KnownBits::sextOrTrunc(), llvm::APInt::shl(), llvm::KnownBits::shl(), llvm::KnownBits::smax(), llvm::KnownBits::smin(), llvm::KnownBits::srem(), llvm::KnownBits::ssub_sat(), llvm::KnownBits::sub(), llvm::ConstantRange::toKnownBits(), llvm::KnownBits::trunc(), llvm::KnownBits::uadd_sat(), llvm::KnownBits::udiv(), llvm::KnownBits::umax(), llvm::KnownBits::umin(), llvm::KnownBits::unionWith(), unionWithMinMaxIntrinsicClamp(), llvm::APInt::urem(), llvm::KnownBits::urem(), llvm::KnownBits::usub_sat(), llvm::KnownBits::Zero, and llvm::KnownBits::zextOrTrunc().
Referenced by computeKnownBits().
|
static |
Compute known bits from a shift operator, including those with a non-constant shift amount.
Known is the output of this function. Known2 is a pre-allocated temporary with the same bit width as Known and on return contains the known bit of the shift value source. KF is an operator-specific function that, given the known-bits and a shift amount, compute the implied known-bits of the shift operator's result respectively for that shift amount. The results from calling KF are conservatively combined for all permitted shift amounts.
Definition at line 1153 of file ValueTracking.cpp.
References llvm::computeKnownBits(), llvm::Depth, llvm::KnownBits::getBitWidth(), llvm::KnownBits::getMaxValue(), I, llvm::isKnownNonZero(), and llvm::KnownBits::isNonZero().
Referenced by computeKnownBitsFromOperator().
|
static |
Definition at line 511 of file ValueTracking.cpp.
References llvm::SimplifyQuery::AC, llvm::computeKnownBits(), llvm::ComputeNumSignBits(), llvm::SimplifyQuery::CxtI, llvm::Depth, llvm::SimplifyQuery::DT, llvm::KnownBits::getBitWidth(), llvm::APInt::getHighBitsSet(), llvm::Type::getScalarSizeInBits(), llvm::Value::getType(), llvm::isGuaranteedNotToBeUndef(), llvm::isKnownNegative(), llvm::isKnownNonNegative(), llvm::KnownBits::isNegative(), llvm::KnownBits::isNonNegative(), llvm::KnownBits::isNonZero(), llvm::KnownBits::makeConstant(), llvm::KnownBits::makeNegative(), llvm::KnownBits::makeNonNegative(), llvm::KnownBits::mul(), llvm::KnownBits::sgt(), and llvm::KnownBits::Zero.
Referenced by computeKnownBitsFromOperator().
| void computeKnownFPClass | ( | const Value * | V, |
| const APInt & | DemandedElts, | ||
| FPClassTest | InterestedClasses, | ||
| KnownFPClass & | Known, | ||
| const SimplifyQuery & | Q, | ||
| unsigned | Depth ) |
Definition at line 4904 of file ValueTracking.cpp.
References llvm::SimplifyQuery::AC, assert(), llvm::BitWidth, breakSelfRecursivePHI(), llvm::CallingConv::C, llvm::KnownFPClass::cannotBeOrderedGreaterThanZero(), llvm::KnownFPClass::cannotBeOrderedLessThanZero(), llvm::cast(), llvm::APInt::clearBit(), llvm::computeConstantRange(), llvm::computeKnownBits(), llvm::computeKnownFPClass(), computeKnownFPClassForFPTrunc(), computeKnownFPClassFromContext(), Cond, llvm::KnownFPClass::copysign(), llvm::SimplifyQuery::CxtI, llvm::Depth, llvm::SimplifyQuery::DT, llvm::dyn_cast(), llvm::dyn_cast_or_null(), llvm::KnownBits::eq(), F, llvm::KnownFPClass::fabs(), llvm::fcAllFlags, llvm::fcInf, llvm::fcmpImpliesClass(), llvm::fcNan, llvm::fcNegative, llvm::fcNegFinite, llvm::fcNegInf, llvm::fcNegNormal, llvm::fcNegSubnormal, llvm::fcNegZero, llvm::fcNone, llvm::fcPosFinite, llvm::fcPosInf, llvm::fcPositive, llvm::fcPosNormal, llvm::fcPosSubnormal, llvm::fcPosZero, llvm::fcQNan, llvm::fcSNan, llvm::fcSubnormal, llvm::fcZero, llvm::First, llvm::KnownFPClass::fneg(), llvm::Constant::getAggregateElement(), llvm::ExtractValueInst::getAggregateOperand(), llvm::APInt::getAllOnes(), llvm::APInt::getBitWidth(), llvm::Function::getDenormalMode(), llvm::Type::getFltSemantics(), llvm::DenormalMode::getIEEE(), llvm::ExtractValueInst::getIndices(), llvm::APFloat::getInf(), llvm::Type::getIntegerBitWidth(), llvm::APFloat::getLargest(), llvm::APInt::getOneBitSet(), llvm::Type::getScalarType(), llvm::getShuffleDemandedElts(), llvm::ConstantRange::getSignedMin(), llvm::ConstantRange::getSingleElement(), llvm::Value::getType(), llvm::SimplifyQuery::getWithInstruction(), llvm::SimplifyQuery::getWithoutCondContext(), llvm::APFloat::getZero(), llvm::InstrInfoQuery::hasNoSignedZeros(), llvm::DenormalMode::IEEE, II, llvm::SimplifyQuery::IIQ, llvm::ilogb(), llvm::DenormalMode::Input, llvm::DenormalMode::inputsAreZero(), llvm::isa(), llvm::isa_and_nonnull(), llvm::ConstantRange::isAllNegative(), llvm::ConstantRange::isAllNonNegative(), llvm::KnownFPClass::isKnownNever(), llvm::KnownFPClass::isKnownNeverInfinity(), llvm::KnownFPClass::isKnownNeverLogicalNegZero(), llvm::KnownFPClass::isKnownNeverLogicalPosZero(), llvm::KnownFPClass::isKnownNeverLogicalZero(), llvm::KnownFPClass::isKnownNeverNaN(), llvm::KnownFPClass::isKnownNeverNegInfinity(), llvm::KnownFPClass::isKnownNeverNegSubnormal(), llvm::KnownFPClass::isKnownNeverNegZero(), llvm::KnownFPClass::isKnownNeverPosInfinity(), llvm::KnownFPClass::isKnownNeverPosSubnormal(), llvm::KnownFPClass::isKnownNeverPosZero(), llvm::KnownFPClass::isKnownNeverSubnormal(), llvm::APFloat::isNaN(), llvm::APFloatBase::isRepresentableAsNormalIn(), llvm::KnownFPClass::isUnknown(), llvm::APInt::isZero(), llvm::KnownFPClass::KnownFPClasses, llvm::KnownFPClass::knownNot(), LHS, llvm_unreachable, llvm::PatternMatch::m_ConstantInt(), llvm::PatternMatch::m_ElementWiseBitCast(), llvm::PatternMatch::m_FCmp(), llvm::PatternMatch::m_Intrinsic(), llvm::PatternMatch::m_Value(), llvm::make_scope_exit(), llvm::KnownBits::makeConstant(), llvm::PatternMatch::match(), llvm::MaxAnalysisRecursionDepth, Mode, Opc, llvm::KnownFPClass::OrderedGreaterThanZeroMask, llvm::KnownFPClass::OrderedLessThanZeroMask, llvm::DenormalMode::Output, outputDenormalIsIEEEOrPosZero(), llvm::DenormalMode::outputsAreZero(), P, llvm::DenormalMode::PositiveZero, llvm::KnownFPClass::propagateCanonicalizingSrc(), llvm::KnownFPClass::propagateNaN(), llvm::KnownFPClass::resetAll(), llvm::APInt::reverseBits(), RHS, llvm::APFloatBase::semanticsPrecision(), llvm::APInt::sge(), llvm::KnownFPClass::SignBit, llvm::KnownFPClass::signBitMustBeOne(), llvm::KnownFPClass::signBitMustBeZero(), llvm::ArrayRef< T >::size(), llvm::InstrInfoQuery::UseInstrInfo, and llvm::KnownBits::Zero.
|
static |
Definition at line 4871 of file ValueTracking.cpp.
References llvm::computeKnownFPClass(), llvm::Depth, llvm::dyn_cast(), and llvm::APInt::getAllOnes().
|
static |
Definition at line 4880 of file ValueTracking.cpp.
References llvm::KnownFPClass::cannotBeOrderedLessThanZero(), llvm::computeKnownFPClass(), llvm::Depth, llvm::fcNan, llvm::fcNone, llvm::KnownFPClass::knownNot(), llvm::KnownFPClass::OrderedLessThanZeroMask, and llvm::KnownFPClass::propagateNaN().
Referenced by computeKnownFPClass().
|
static |
Definition at line 4768 of file ValueTracking.cpp.
References A(), B(), computeKnownFPClassFromCond(), Cond, llvm::Depth, llvm::fcmpImpliesClass(), llvm::ilist_detail::node_parent_access< NodeTy, ParentTy >::getParent(), llvm::isSignBitCheck(), llvm::KnownFPClass::knownNot(), LHS, llvm::PatternMatch::m_APFloat(), llvm::PatternMatch::m_APInt(), llvm::PatternMatch::m_ConstantInt(), llvm::PatternMatch::m_ElementWiseBitCast(), llvm::PatternMatch::m_FCmp(), llvm::PatternMatch::m_ICmp(), llvm::PatternMatch::m_Intrinsic(), llvm::PatternMatch::m_LogicalAnd(), llvm::PatternMatch::m_LogicalOr(), llvm::MIPatternMatch::m_Not(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), llvm::MaxAnalysisRecursionDepth, RHS, llvm::KnownFPClass::signBitMustBeOne(), and llvm::KnownFPClass::signBitMustBeZero().
Referenced by computeKnownFPClassFromCond(), and computeKnownFPClassFromContext().
|
static |
Definition at line 4814 of file ValueTracking.cpp.
References llvm::SimplifyQuery::AC, llvm::CondContext::AffectedValues, assert(), llvm::AssumptionCache::assumptionsFor(), llvm::cast(), llvm::SimplifyQuery::CC, computeKnownFPClassFromCond(), Cond, llvm::CondContext::Cond, llvm::DomConditionCache::conditionsFor(), llvm::SmallPtrSetImpl< PtrType >::contains(), llvm::SimplifyQuery::CxtI, llvm::SimplifyQuery::DC, llvm::DominatorTree::dominates(), llvm::SimplifyQuery::DT, llvm::ilist_detail::node_parent_access< NodeTy, ParentTy >::getParent(), I, llvm::CondContext::Invert, and llvm::isValidAssumeForContext().
Referenced by computeKnownFPClass().
|
static |
Definition at line 4194 of file ValueTracking.cpp.
References assert(), ComputeNumSignBitsImpl(), and llvm::Depth.
Definition at line 328 of file ValueTracking.cpp.
References llvm::ComputeNumSignBits(), llvm::Depth, llvm::dyn_cast(), and llvm::APInt::getAllOnes().
|
static |
Return the number of times the sign bit of the register is replicated into the other bits.
We know that at least 1 bit is always equal to the sign bit (itself), but other cases can give us information. For example, immediately after an "ashr X, 2", we know that the top 3 bits are all equal to each other, so we return 3. For vectors, return the number of sign bits for the vector element with the minimum number of known sign bits of the demanded elements in the vector specified by DemandedElts.
Definition at line 4208 of file ValueTracking.cpp.
References assert(), llvm::cast(), llvm::APInt::ceilLogBase2(), llvm::computeKnownBits(), llvm::ComputeNumSignBits(), computeNumSignBitsVectorConstant(), llvm::KnownBits::countMinSignBits(), llvm::SimplifyQuery::CxtI, llvm::Depth, llvm::SimplifyQuery::DL, llvm::dyn_cast(), llvm::APInt::getBitWidth(), llvm::PHINode::getIncomingBlock(), llvm::PHINode::getIncomingValue(), llvm::PHINode::getNumIncomingValues(), llvm::APInt::getNumSignBits(), llvm::Operator::getOpcode(), llvm::DataLayout::getPointerTypeSizeInBits(), llvm::Type::getScalarSizeInBits(), llvm::Type::getScalarType(), llvm::getShuffleDemandedElts(), llvm::BasicBlock::getTerminator(), llvm::DataLayout::getTypeSizeInBits(), llvm::SimplifyQuery::getWithoutCondContext(), llvm::APInt::getZExtValue(), II, llvm::isa(), llvm::KnownBits::isNonNegative(), llvm::Type::isPointerTy(), isSignedMinMaxClamp(), isSignedMinMaxIntrinsicClamp(), llvm::APInt::isStrictlyPositive(), LHS, llvm::APInt::logBase2(), llvm::PatternMatch::m_APInt(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::m_ZExt(), llvm::PatternMatch::match(), llvm::MaxAnalysisRecursionDepth, RHS, llvm::APInt::uge(), X, and llvm::KnownBits::Zero.
Referenced by ComputeNumSignBits().
|
static |
For vector constants, loop over the elements and find the constant with the minimum number of sign bits.
Return 0 if the value is not a vector constant or if any element was not analyzed; otherwise, return the count for the element with the minimum number of sign bits.
Definition at line 4167 of file ValueTracking.cpp.
References llvm::cast(), llvm::dyn_cast(), llvm::dyn_cast_or_null(), and llvm::isa().
Referenced by ComputeNumSignBitsImpl().
|
static |
Definition at line 7341 of file ValueTracking.cpp.
References llvm::Add, llvm::computeConstantRangeIncludingKnownBits(), llvm::computeKnownBitsFromContext(), llvm::ComputeNumSignBits(), llvm::ConstantRange::getBitWidth(), llvm::ConstantRange::isAllNegative(), llvm::ConstantRange::isAllNonNegative(), llvm::KnownBits::isNegative(), llvm::KnownBits::isNonNegative(), LHS, mapOverflowResult(), llvm::MayOverflow, llvm::NeverOverflows, RHS, and llvm::ConstantRange::signedAddMayOverflow().
|
static |
Definition at line 7645 of file ValueTracking.cpp.
References llvm::any_of(), llvm::Depth, llvm::dyn_cast(), I, II, llvm::is_contained(), llvm::PatternMatch::m_ExtractValue(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_WithOverflowInst(), and llvm::PatternMatch::match().
Referenced by impliesPoison().
|
static |
Returns the bitwidth of the given scalar or pointer type.
For vector types, returns the element type's bitwidth.
Definition at line 99 of file ValueTracking.cpp.
References llvm::BitWidth, and DL.
Referenced by canConvertValue(), llvm::FunctionComparator::cmpTypes(), combineAnd(), combineAVX512SetCCToKMOV(), combineOr(), llvm::computeKnownBits(), llvm::computeKnownBits(), llvm::APInt::concat(), DecodeFixedType(), llvm::AAPotentialConstantValues::getAssumedMinTrailingZeros(), llvm::AMDGPULibFuncBase::Param::getFromTy(), getMangledTypeStr(), getTargetConstantBitsFromNode(), getTypeID(), llvm::MVT::getVT(), llvm::X86TTIImpl::hasConditionalLoadStoreForType(), instCombineSVECondLast(), isKnownNonZeroFromOperator(), LLVMCreateGenericValueOfInt(), llvm::ExecutionEngine::LoadValueFromMemory(), llvm::APInt::operator[](), and llvm::InstCombinerImpl::SimplifyDemandedInstructionBits().
|
static |
Definition at line 9801 of file ValueTracking.cpp.
References assert(), llvm::ilist_detail::node_parent_access< NodeTy, ParentTy >::getParent(), llvm::BasicBlock::getSinglePredecessor(), llvm::BasicBlock::getTerminator(), llvm::PatternMatch::m_Br(), llvm::PatternMatch::m_Value(), and llvm::PatternMatch::match().
Referenced by llvm::isImpliedByDomCondition(), and llvm::isImpliedByDomCondition().
|
static |
If the pair of operators are the same invertible function, return the the operands of the function corresponding to each input.
Otherwise, return std::nullopt. An invertible function is one that is 1-to-1 and maps every input value to exactly one output value. This is equivalent to saying that Op1 and Op2 are equal exactly when the specified pair of operands are equal, (except that Op1 and Op2 may be poison more often.)
Definition at line 3754 of file ValueTracking.cpp.
References llvm::cast(), getInvertibleOperands(), llvm::Operator::getOpcode(), llvm::User::getOperand(), getOperands(), llvm::ilist_detail::node_parent_access< NodeTy, ParentTy >::getParent(), llvm::Value::getType(), llvm::isa(), llvm::PatternMatch::m_c_BinOp(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), llvm::matchSimpleRecurrence(), and llvm::Other.
Referenced by getInvertibleOperands(), and isKnownNonEqual().
|
static |
Definition at line 1169 of file ValueTracking.cpp.
References llvm::BitWidth, llvm::KnownBits::blsi(), llvm::KnownBits::blsmsk(), llvm::computeKnownBits(), llvm::KnownBits::countMaxTrailingZeros(), llvm::KnownBits::countMinTrailingOnes(), llvm::Depth, llvm::KnownBits::getBitWidth(), I, llvm::APInt::isZero(), llvm_unreachable, llvm::PatternMatch::m_Add(), llvm::PatternMatch::m_AllOnes(), llvm::PatternMatch::m_c_Add(), llvm::PatternMatch::m_c_And(), llvm::PatternMatch::m_c_BinOp(), llvm::PatternMatch::m_c_Xor(), llvm::PatternMatch::m_Deferred(), llvm::MIPatternMatch::m_Neg(), llvm::PatternMatch::m_Sub(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), llvm::KnownBits::One, llvm::APInt::setBit(), X, Y, and llvm::KnownBits::Zero.
Referenced by llvm::analyzeKnownBitsFromAndXorOr(), and computeKnownBitsFromOperator().
If the input value is the result of a 'not' op, constant integer, or vector splat of a constant integer, return the bitwise-not source value.
TODO: This could be extended to handle non-splat vector integer constants.
Definition at line 8531 of file ValueTracking.cpp.
References llvm::CallingConv::C, llvm::PatternMatch::m_APInt(), llvm::MIPatternMatch::m_Not(), llvm::PatternMatch::m_Value(), and llvm::PatternMatch::match().
Referenced by matchMinMax().
|
static |
Definition at line 10076 of file ValueTracking.cpp.
References llvm::CallingConv::C, llvm::APInt::getMaxValue(), llvm::ConstantRange::getNonEmpty(), llvm::APInt::getSignedMaxValue(), llvm::APInt::getSignedMinValue(), llvm::getVScaleRange(), llvm::APInt::getZero(), II, llvm_unreachable, llvm::PatternMatch::m_APInt(), llvm::PatternMatch::m_One(), llvm::PatternMatch::match(), and llvm::Upper.
Referenced by llvm::computeConstantRange().
|
static |
Definition at line 10189 of file ValueTracking.cpp.
References llvm::BitWidth, llvm::CallingConv::C, llvm::cast(), llvm::ConstantRange::getNonEmpty(), llvm::APInt::getSignedMaxValue(), llvm::APInt::getSignedMinValue(), llvm::APInt::getZero(), llvm::InstrInfoQuery::hasNoSignedWrap(), LHS, llvm::PatternMatch::m_APInt(), llvm::MIPatternMatch::m_Neg(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::match(), llvm::matchSelectPattern(), RHS, llvm::SPF_ABS, llvm::SPF_NABS, llvm::SPF_SMAX, llvm::SPF_SMIN, llvm::SPF_UMAX, llvm::SPF_UMIN, and llvm::SPF_UNKNOWN.
Referenced by llvm::computeConstantRange().
|
static |
Definition at line 122 of file ValueTracking.cpp.
References assert(), llvm::cast(), llvm::User::getOperand(), llvm::getShuffleDemandedElts(), llvm::ShuffleVectorInst::getShuffleMask(), llvm::ShuffleVectorInst::getType(), llvm::Value::getType(), and llvm::isa().
|
static |
If we can compute the length of the string pointed to by the specified pointer, return 'len+1'.
If we can't, return 0.
Definition at line 6693 of file ValueTracking.cpp.
References llvm::dyn_cast(), E(), llvm::getConstantDataArrayInfo(), GetStringLengthH(), and llvm::SmallPtrSetImpl< PtrType >::insert().
Referenced by llvm::GetStringLength(), and GetStringLengthH().
This is the function that does the work of looking through basic ptrtoint+arithmetic+inttoptr sequences.
Definition at line 6972 of file ValueTracking.cpp.
References assert(), llvm::dyn_cast(), llvm::Operator::getOpcode(), and llvm::isa().
Referenced by llvm::getUnderlyingObjectsForCodeGen().
|
static |
Enumerates all operands of I that are guaranteed to not be poison.
Definition at line 8181 of file ValueTracking.cpp.
References handleGuaranteedWellDefinedOps(), and I.
Referenced by llvm::mustTriggerUB().
|
static |
Enumerates all operands of I that are guaranteed to not be undef or poison.
If the callback Handle returns true, stop processing and return true. Otherwise, return false.
Definition at line 8119 of file ValueTracking.cpp.
References llvm::CallBase::arg_size(), llvm::cast(), llvm::CallBase::getArgOperand(), llvm::CallBase::getCalledOperand(), getCondition(), llvm::getPointerOperand(), I, llvm::CallBase::isIndirectCall(), and llvm::CallBase::paramHasAttr().
Referenced by handleGuaranteedNonPoisonOps(), and programUndefinedIfUndefOrPoison().
|
static |
Definition at line 179 of file ValueTracking.cpp.
References A(), llvm::SimplifyQuery::AC, B(), llvm::SimplifyQuery::CxtI, llvm::SimplifyQuery::DT, llvm::isGuaranteedNotToBeUndef(), LHS, llvm::PatternMatch::m_And(), llvm::PatternMatch::m_APInt(), llvm::PatternMatch::m_c_And(), llvm::PatternMatch::m_c_Or(), llvm::PatternMatch::m_c_Xor(), llvm::PatternMatch::m_Deferred(), llvm::PatternMatch::m_LShr(), llvm::MIPatternMatch::m_Not(), llvm::PatternMatch::m_Shl(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_Sub(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::m_ZExtOrSExt(), llvm::PatternMatch::match(), RHS, and Y.
Referenced by llvm::haveNoCommonBitsSet().
Definition at line 7673 of file ValueTracking.cpp.
References llvm::all_of(), llvm::canCreatePoison(), llvm::cast(), llvm::Depth, directlyImpliesPoison(), llvm::dyn_cast(), I, and llvm::isGuaranteedNotToBePoison().
|
static |
Definition at line 7540 of file ValueTracking.cpp.
References PoisonOnly.
Referenced by canCreateUndefOrPoison(), and isGuaranteedNotToBeUndefOrPoison().
|
static |
Definition at line 7544 of file ValueTracking.cpp.
References UndefOnly.
Referenced by isGuaranteedNotToBeUndefOrPoison().
|
static |
Definition at line 608 of file ValueTracking.cpp.
References llvm::all_of(), llvm::dyn_cast(), E(), llvm::SmallVectorTemplateCommon< T, typename >::empty(), I, llvm::SmallPtrSetImpl< PtrType >::insert(), llvm::is_contained(), llvm::SmallVectorImpl< T >::pop_back_val(), and llvm::SmallVectorTemplateBase< T, bool >::push_back().
Referenced by llvm::isValidAssumeForContext().
|
static |
Test whether a GEP's result is known to be non-null.
Uses properties inherent in a GEP to try to determine whether it is known to be non-null.
Currently this routine does not support vector GEPs.
Definition at line 2820 of file ValueTracking.cpp.
References assert(), llvm::cast(), llvm::Depth, llvm::SimplifyQuery::DL, llvm::dyn_cast(), F, GEP, llvm::gep_type_begin(), llvm::gep_type_end(), llvm::StructLayout::getElementOffset(), llvm::DataLayout::getStructLayout(), llvm::ConstantInt::getZExtValue(), I, llvm::isKnownNonZero(), llvm::MaxAnalysisRecursionDepth, and llvm::NullPointerIsDefined().
Referenced by isKnownNonZeroFromOperator().
|
static |
Definition at line 7700 of file ValueTracking.cpp.
References A(), llvm::all_of(), llvm::any_of(), llvm::CallingConv::C, llvm::canCreateUndefOrPoison(), llvm::cast(), Cond, llvm::Depth, llvm::dyn_cast(), llvm::dyn_cast_or_null(), llvm::DomTreeNodeBase< NodeT >::getIDom(), llvm::getKnowledgeValidInContext(), llvm::DominatorTreeBase< NodeT, IsPostDom >::getNode(), llvm::ilist_detail::node_parent_access< NodeTy, ParentTy >::getParent(), llvm::getSplatValue(), I, includesPoison(), includesUndef(), llvm::isa(), llvm::isGuaranteedNotToBeUndefOrPoison(), llvm::MaxAnalysisRecursionDepth, llvm::programUndefinedIfUndefOrPoison(), and llvm::Splat.
|
static |
Return true if LHS implies RHS is true.
Return false if LHS implies RHS is false. Otherwise, return std::nullopt if we can't infer anything. We expect the RHS to be an icmp and the LHS to be an 'and', 'or', or a 'select' instruction.
Definition at line 9647 of file ValueTracking.cpp.
References assert(), llvm::Depth, DL, llvm::isImpliedCondition(), LHS, llvm::PatternMatch::m_LogicalAnd(), llvm::PatternMatch::m_LogicalOr(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), and llvm::MaxAnalysisRecursionDepth.
Referenced by llvm::isImpliedCondition().
|
static |
Return true if "icmp LPred X, LCR" implies "icmp RPred X, RCR" is true.
Return false if "icmp LPred X, LCR" implies "icmp RPred X, RCR" is false. Otherwise, return std::nullopt if we can't infer anything.
Definition at line 9440 of file ValueTracking.cpp.
References llvm::CmpPredicate::dropSameSign(), llvm::ICmpInst::getFlippedSignednessPredicate(), llvm::CmpInst::getInversePredicate(), llvm::CmpPredicate::hasSameSign(), llvm::ConstantRange::icmp(), and llvm::ConstantRange::makeAllowedICmpRegion().
Referenced by isImpliedCondICmps().
|
static |
Return true if LHS implies RHS (expanded to its components as "R0 RPred R1") is true.
Return false if LHS implies RHS is false. Otherwise, return std::nullopt if we can't infer anything.
Definition at line 9583 of file ValueTracking.cpp.
References DL, llvm::CmpInst::getInversePredicate(), llvm::ICmpInst::getSwappedCmpPredicate(), llvm::CmpInst::getSwappedPredicate(), llvm::PatternMatch::m_APFloat(), llvm::PatternMatch::m_ImmConstant(), llvm::ConstantFPRange::makeExactFCmpRegion(), llvm::PatternMatch::match(), and std::swap().
Referenced by llvm::isImpliedCondition().
|
static |
Return true if LHS implies RHS (expanded to its components as "R0 RPred R1") is true.
Return false if LHS implies RHS is false. Otherwise, return std::nullopt if we can't infer anything.
Definition at line 9472 of file ValueTracking.cpp.
References A(), B(), llvm::computeConstantRange(), DL, llvm::CmpPredicate::dropSameSign(), llvm::ICmpInst::getInverseCmpPredicate(), llvm::CmpPredicate::getMatching(), llvm::CmpPredicate::getPreferredSignedPredicate(), llvm::ICmpInst::getSwappedCmpPredicate(), 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_ULT, llvm::ICmpInst::isEquality(), llvm::ICmpInst::isImpliedByMatchingCmp(), isImpliedCondCommonOperandWithCR(), isImpliedCondOperands(), llvm::CmpInst::isSigned(), llvm::APInt::isZero(), llvm::PatternMatch::m_APInt(), llvm::PatternMatch::m_c_Add(), llvm::PatternMatch::m_ImmConstant(), llvm::PatternMatch::m_NonNegative(), llvm::PatternMatch::m_NonPositive(), llvm::PatternMatch::m_NSWSub(), llvm::PatternMatch::m_PtrToInt(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_Sub(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), llvm::MaxAnalysisRecursionDepth, P, and std::swap().
Referenced by llvm::isImpliedCondition().
|
static |
Return true if "icmp Pred BLHS BRHS" is true whenever "icmp Pred ALHS ARHS" is true.
Otherwise, return std::nullopt.
Definition at line 9400 of file ValueTracking.cpp.
References 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, and isTruePredicate().
Referenced by isImpliedCondICmps().
|
static |
Return true if we can infer that V is known to be a power of 2 from dominating condition Cond (e.g., ctpop(V) == 1).
Definition at line 2597 of file ValueTracking.cpp.
References Cond, llvm::CmpInst::getInversePredicate(), llvm::CmpInst::ICMP_EQ, llvm::CmpInst::ICMP_ULT, llvm::PatternMatch::m_APInt(), llvm::PatternMatch::m_ICmp(), llvm::PatternMatch::m_Intrinsic(), llvm::PatternMatch::m_Specific(), and llvm::PatternMatch::match().
Referenced by llvm::isKnownToBeAPowerOfTwo().
|
static |
Return true if it is known that V1 != V2.
Definition at line 4087 of file ValueTracking.cpp.
References A(), B(), llvm::cast(), llvm::computeKnownBits(), llvm::Depth, llvm::SimplifyQuery::DL, llvm::dyn_cast(), getInvertibleOperands(), llvm::Value::getType(), llvm::APInt::intersects(), llvm::Type::isIntOrIntVectorTy(), llvm::isKnownNonEqual(), isKnownNonEqualFromContext(), isModifyingBinopOfNonZero(), isNonEqualMul(), isNonEqualPHIs(), isNonEqualPointersWithRecursiveGEP(), isNonEqualSelect(), isNonEqualShl(), llvm::KnownBits::isUnknown(), llvm::PatternMatch::m_PtrToIntSameSize(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), llvm::MaxAnalysisRecursionDepth, llvm::KnownBits::One, and llvm::KnownBits::Zero.
|
static |
Definition at line 4029 of file ValueTracking.cpp.
References llvm::SimplifyQuery::AC, assert(), llvm::AssumptionCache::assumptionsFor(), llvm::cast(), Cond, llvm::DomConditionCache::conditionsFor(), llvm::SimplifyQuery::CxtI, llvm::SimplifyQuery::DC, llvm::Depth, llvm::SimplifyQuery::DL, llvm::DominatorTree::dominates(), llvm::SimplifyQuery::DT, llvm::Instruction::getFunction(), llvm::ilist_detail::node_parent_access< NodeTy, ParentTy >::getParent(), I, llvm::CmpInst::ICMP_NE, llvm::isImpliedCondition(), and llvm::isValidAssumeForContext().
Referenced by isKnownNonEqual().
|
static |
Definition at line 8305 of file ValueTracking.cpp.
References llvm::CallingConv::C, llvm::dyn_cast(), E(), I, llvm::isa(), and llvm::FastMathFlags::noNaNs().
Referenced by matchSelectPattern().
|
static |
Definition at line 2884 of file ValueTracking.cpp.
References assert(), llvm::cast(), cmpExcludesZero(), DomConditionsMaxUses, llvm::DominatorTree::dominates(), llvm::dyn_cast(), llvm::SmallVectorTemplateCommon< T, typename >::empty(), llvm::Instruction::getFunction(), llvm::CmpInst::getInversePredicate(), llvm::getLoadStorePointerOperand(), llvm::ilist_detail::node_parent_access< NodeTy, ParentTy >::getParent(), llvm::Type::getPointerAddressSpace(), llvm::GlobalValue::getType(), llvm::SmallPtrSetImpl< PtrType >::insert(), llvm::isa(), llvm::isGuard(), llvm::isValidAssumeForContext(), llvm::PatternMatch::m_c_ICmp(), llvm::PatternMatch::m_IDiv(), llvm::PatternMatch::m_IRem(), llvm::PatternMatch::m_LogicalAnd(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), llvm::NullPointerIsDefined(), llvm::SmallVectorImpl< T >::pop_back_val(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), RHS, and llvm::Value::users().
Referenced by isKnownNonZero().
Definition at line 8328 of file ValueTracking.cpp.
References llvm::CallingConv::C, llvm::dyn_cast(), E(), and I.
|
static |
Return true if the given value is known to be non-zero when defined.
For vectors, return true if every demanded element is known to be non-zero when defined. For pointers, if the context instruction and dominator tree are specified, perform context-sensitive analysis and return true if the pointer couldn't possibly be null at the specified instruction. Supports values with integer or pointer type and vectors of integers.
Definition at line 3641 of file ValueTracking.cpp.
References A(), assert(), llvm::CallingConv::C, llvm::SimplifyQuery::CxtI, llvm::Depth, llvm::SimplifyQuery::DT, llvm::dyn_cast(), llvm::APInt::getBitWidth(), I, llvm::isa(), isKnownNonNullFromDominatingCondition(), llvm::isKnownNonZero(), isKnownNonZeroFromAssume(), isKnownNonZeroFromOperator(), llvm::Constant::isNullValue(), llvm::MaxAnalysisRecursionDepth, llvm::NullPointerIsDefined(), Range, and llvm::stripNullTest().
|
static |
Definition at line 818 of file ValueTracking.cpp.
References llvm::SimplifyQuery::AC, assert(), llvm::AssumptionCache::assumptionsFor(), llvm::cast(), cmpExcludesZero(), llvm::SimplifyQuery::CxtI, llvm::SimplifyQuery::DT, llvm::AssumptionCache::ExprResultIdx, llvm::Instruction::getFunction(), llvm::getKnowledgeFromBundle(), llvm::Type::getPointerAddressSpace(), llvm::GlobalValue::getType(), I, llvm::isValidAssumeForContext(), llvm::PatternMatch::m_c_ICmp(), llvm::PatternMatch::m_CombineOr(), llvm::PatternMatch::m_PtrToInt(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), llvm::NullPointerIsDefined(), and RHS.
Referenced by isKnownNonZero().
|
static |
Definition at line 3176 of file ValueTracking.cpp.
References llvm::KnownBits::abs(), llvm::SimplifyQuery::AC, llvm::all_of(), llvm::BitWidth, Call, llvm::cast(), llvm::APInt::clearBit(), cmpExcludesZero(), llvm::computeKnownBits(), llvm::SimplifyQuery::CxtI, llvm::Depth, llvm::SimplifyQuery::DL, llvm::SimplifyQuery::DT, llvm::dyn_cast(), llvm::APInt::getAllOnes(), llvm::CallBase::getArgOperand(), llvm::getArgumentAliasingToReturnedPointer(), llvm::BinaryOpIntrinsic::getBinaryOp(), getBitWidth(), llvm::APInt::getBitWidth(), llvm::details::FixedOrScalableQuantity< LeafTy, ValueTy >::getFixedValue(), llvm::CmpInst::getInversePredicate(), llvm::InstrInfoQuery::getMetadata(), llvm::APInt::getOneBitSet(), llvm::Type::getScalarType(), llvm::getShuffleDemandedElts(), llvm::Value::getType(), llvm::DataLayout::getTypeSizeInBits(), llvm::SimplifyQuery::getWithoutCondContext(), llvm::APInt::getZero(), llvm::InstrInfoQuery::hasNoSignedWrap(), llvm::InstrInfoQuery::hasNoUnsignedWrap(), I, II, llvm::SimplifyQuery::IIQ, llvm::isa(), llvm::PossiblyExactOperator::isExact(), isGEPKnownNonNull(), llvm::isGuaranteedNotToBePoison(), llvm::Type::isIntOrIntVectorTy(), llvm::isKnownNonEqual(), llvm::isKnownNonZero(), llvm::KnownBits::isNegative(), llvm::KnownBits::isNonNegative(), llvm::KnownBits::isNonZero(), isNonZeroAdd(), isNonZeroMul(), isNonZeroRecurrence(), isNonZeroShift(), isNonZeroSub(), llvm::Type::isPtrOrPtrVectorTy(), llvm::KnownBits::isUnknown(), llvm::APInt::isZero(), llvm::PatternMatch::m_c_ICmp(), llvm::PatternMatch::m_ExtractValue(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::m_WithOverflowInst(), llvm::PatternMatch::match(), matchOpWithOpEqZero(), llvm::MaxAnalysisRecursionDepth, llvm::NullPointerIsDefined(), llvm::KnownBits::One, Range, rangeMetadataExcludesValue(), llvm::APInt::reverseBits(), llvm::KnownBits::uge(), llvm::InstrInfoQuery::UseInstrInfo, and X.
Referenced by isKnownNonZero().
|
static |
Return true if V1 == (binop V2, X), where X is known non-zero.
Only handle a small subset of binops where (binop V2, X) with non-zero X implies V2 != V1.
Definition at line 3870 of file ValueTracking.cpp.
References llvm::cast(), llvm::Depth, llvm::dyn_cast(), llvm::BinaryOperator::getOpcode(), llvm::User::getOperand(), and llvm::isKnownNonZero().
Referenced by isKnownNonEqual().
|
static |
Return true if V2 == V1 * C, where V1 is known non-zero, C is not 0/1 and the multiplication is nuw or nsw.
Definition at line 3899 of file ValueTracking.cpp.
References llvm::CallingConv::C, llvm::Depth, llvm::dyn_cast(), llvm::isKnownNonZero(), llvm::PatternMatch::m_APInt(), llvm::PatternMatch::m_Mul(), llvm::PatternMatch::m_Specific(), and llvm::PatternMatch::match().
Referenced by isKnownNonEqual().
|
static |
Definition at line 3926 of file ValueTracking.cpp.
References llvm::PHINode::blocks(), llvm::SimplifyQuery::CxtI, llvm::Depth, llvm::PHINode::getIncomingValueForBlock(), llvm::ilist_detail::node_parent_access< NodeTy, ParentTy >::getParent(), llvm::SimplifyQuery::getWithoutCondContext(), llvm::SmallPtrSetImpl< PtrType >::insert(), llvm::isKnownNonEqual(), llvm::PatternMatch::m_APInt(), and llvm::PatternMatch::match().
Referenced by isKnownNonEqual().
|
static |
Definition at line 3982 of file ValueTracking.cpp.
References A(), B(), llvm::SimplifyQuery::DL, llvm::dyn_cast(), llvm::DataLayout::getIndexTypeSizeInBits(), llvm::isa(), llvm::APInt::isNegative(), llvm::APInt::isStrictlyPositive(), llvm::APInt::sge(), llvm::APInt::sle(), and llvm::Value::stripAndAccumulateInBoundsConstantOffsets().
Referenced by isKnownNonEqual().
|
static |
Definition at line 3957 of file ValueTracking.cpp.
References llvm::Depth, llvm::dyn_cast(), llvm::SelectInst::getCondition(), llvm::SelectInst::getFalseValue(), llvm::SelectInst::getTrueValue(), and llvm::isKnownNonEqual().
Referenced by isKnownNonEqual().
|
static |
Return true if V2 == V1 << C, where V1 is known non-zero, C is not 0 and the shift is nuw or nsw.
Definition at line 3914 of file ValueTracking.cpp.
References llvm::CallingConv::C, llvm::Depth, llvm::dyn_cast(), llvm::isKnownNonZero(), llvm::PatternMatch::m_APInt(), llvm::PatternMatch::m_Shl(), llvm::PatternMatch::m_Specific(), and llvm::PatternMatch::match().
Referenced by isKnownNonEqual().
|
static |
Definition at line 3035 of file ValueTracking.cpp.
References llvm::KnownBits::add(), llvm::BitWidth, llvm::computeKnownBits(), llvm::Depth, llvm::APInt::getSignedMaxValue(), llvm::APInt::intersects(), llvm::isKnownNonZero(), llvm::isKnownToBeAPowerOfTwo(), llvm::KnownBits::isNegative(), llvm::KnownBits::isNonNegative(), llvm::KnownBits::isNonZero(), matchOpWithOpEqZero(), llvm::KnownBits::One, X, and Y.
Referenced by isKnownNonZeroFromOperator().
|
static |
Definition at line 3097 of file ValueTracking.cpp.
References llvm::BitWidth, llvm::computeKnownBits(), llvm::KnownBits::countMaxTrailingZeros(), llvm::Depth, llvm::isKnownNonZero(), llvm::KnownBits::isNonZero(), llvm::KnownBits::One, X, and Y.
Referenced by isKnownNonZeroFromOperator().
Try to detect a recurrence that monotonically increases/decreases from a non-zero starting value.
These are common as induction variables.
Definition at line 3000 of file ValueTracking.cpp.
References llvm::BinaryOperator::getOpcode(), llvm::Instruction::hasNoSignedWrap(), llvm::Instruction::hasNoUnsignedWrap(), llvm::Instruction::isExact(), llvm::APInt::isNegative(), llvm::APInt::isZero(), llvm::PatternMatch::m_APInt(), llvm::PatternMatch::match(), and llvm::matchSimpleRecurrence().
Referenced by isKnownNonZeroFromOperator().
|
static |
Definition at line 3125 of file ValueTracking.cpp.
References llvm::APInt::ashr(), llvm::computeKnownBits(), llvm::Depth, llvm::APInt::getAllOnes(), llvm::KnownBits::getBitWidth(), llvm::KnownBits::getMaxValue(), I, llvm::isKnownNonZero(), llvm::KnownBits::isUnknown(), llvm_unreachable, llvm::APInt::lshr(), llvm::KnownBits::One, llvm::APInt::shl(), llvm::APInt::uge(), and llvm::KnownBits::Zero.
Referenced by isKnownNonZeroFromOperator().
|
static |
Definition at line 3081 of file ValueTracking.cpp.
References llvm::BitWidth, llvm::CallingConv::C, llvm::Depth, llvm::dyn_cast(), llvm::isKnownNonZero(), matchOpWithOpEqZero(), X, and Y.
Referenced by isKnownNonZeroFromOperator().
|
static |
Try to detect a recurrence that the value of the induction variable is always a power of two (or zero).
Definition at line 2540 of file ValueTracking.cpp.
References llvm::SimplifyQuery::CxtI, llvm::Depth, llvm::PHINode::getIncomingBlock(), llvm::BinaryOperator::getOpcode(), llvm::User::getOperand(), llvm::ilist_detail::node_parent_access< NodeTy, ParentTy >::getParent(), llvm::BasicBlock::getTerminator(), llvm::InstrInfoQuery::hasNoSignedWrap(), llvm::InstrInfoQuery::hasNoUnsignedWrap(), llvm::SimplifyQuery::IIQ, llvm::InstrInfoQuery::isExact(), llvm::isKnownToBeAPowerOfTwo(), llvm::PatternMatch::m_Power2(), llvm::PatternMatch::m_SignMask(), llvm::PatternMatch::match(), llvm::matchSimpleRecurrence(), and llvm::User::operands().
Referenced by llvm::isKnownToBeAPowerOfTwo().
PN defines a loop-variant pointer to an object.
Check if the previous iteration of the loop was referring to the same object as PN.
Definition at line 6814 of file ValueTracking.cpp.
References llvm::dyn_cast(), llvm::PHINode::getIncomingValue(), llvm::LoopInfoBase< BlockT, LoopT >::getLoopFor(), llvm::PHINode::getNumIncomingValues(), and llvm::ilist_detail::node_parent_access< NodeTy, ParentTy >::getParent().
Referenced by llvm::getUnderlyingObjects().
|
static |
Definition at line 1334 of file ValueTracking.cpp.
References assert(), llvm::cast(), llvm::SelectPatternResult::Flavor, llvm::getInverseMinMaxFlavor(), getOpcode(), llvm::isa(), LHS, llvm::PatternMatch::m_APInt(), llvm::PatternMatch::match(), llvm::matchSelectPattern(), RHS, Select, llvm::APInt::sle(), llvm::SPF_SMAX, llvm::SPF_SMIN, and std::swap().
Referenced by ComputeNumSignBitsImpl().
|
static |
Definition at line 1363 of file ValueTracking.cpp.
References assert(), llvm::dyn_cast(), llvm::getInverseMinMaxIntrinsic(), II, llvm::PatternMatch::m_APInt(), llvm::PatternMatch::match(), llvm::APInt::sle(), and std::swap().
Referenced by ComputeNumSignBitsImpl(), and unionWithMinMaxIntrinsicClamp().
Return true if "icmp Pred LHS RHS" is always true.
Definition at line 9318 of file ValueTracking.cpp.
References llvm::CallingConv::C, llvm::cast(), hasNoUnsignedWrap(), llvm::CmpInst::ICMP_SLE, llvm::CmpInst::ICMP_ULE, llvm::CmpInst::isTrueWhenEqual(), LHS, llvm::PatternMatch::m_APInt(), llvm::PatternMatch::m_c_Add(), llvm::PatternMatch::m_c_And(), llvm::PatternMatch::m_c_Or(), llvm::PatternMatch::m_c_SMax(), llvm::PatternMatch::m_c_SMin(), llvm::PatternMatch::m_c_UMax(), llvm::PatternMatch::m_c_UMin(), llvm::PatternMatch::m_LShr(), llvm::PatternMatch::m_NSWAdd(), llvm::PatternMatch::m_NSWAddLike(), llvm::PatternMatch::m_NUWAddLike(), llvm::PatternMatch::m_Or(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_UDiv(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), RHS, llvm::APInt::sle(), llvm::APInt::ule(), and X.
Referenced by isImpliedCondOperands().
|
static |
Helps to match a select pattern in case of a type mismatch.
The function processes the case when type of true and false values of a select instruction differs from type of the cmp instruction operands because of a cast instruction. The function checks if it is legal to move the cast operation after "select". If yes, it returns the new second value of "select" (with the assumption that cast is moved):
Definition at line 9048 of file ValueTracking.cpp.
References assert(), llvm::CallingConv::C, llvm::dyn_cast(), llvm::User::getOperand(), llvm::Value::getType(), lookThroughCastConst(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_ZExtOrSExt(), and llvm::PatternMatch::match().
Referenced by llvm::matchDecomposedSelectPattern().
|
static |
Definition at line 8953 of file ValueTracking.cpp.
References llvm::CallingConv::C, llvm::ConstantFoldCastOperand(), DL, llvm::Instruction::getDataLayout(), llvm::User::getOperand(), llvm::ConstantExpr::getTrunc(), llvm::Value::getType(), llvm::CmpInst::isSigned(), llvm::CmpInst::isUnsigned(), llvm::PatternMatch::m_Constant(), and llvm::PatternMatch::match().
Referenced by lookThroughCast().
|
static |
Convert ConstantRange OverflowResult into ValueTracking OverflowResult.
Definition at line 7247 of file ValueTracking.cpp.
References llvm::ConstantRange::AlwaysOverflowsHigh, llvm::AlwaysOverflowsHigh, llvm::ConstantRange::AlwaysOverflowsLow, llvm::AlwaysOverflowsLow, llvm_unreachable, llvm::ConstantRange::MayOverflow, llvm::MayOverflow, llvm::ConstantRange::NeverOverflows, and llvm::NeverOverflows.
Referenced by computeOverflowForSignedAdd(), llvm::computeOverflowForSignedSub(), llvm::SelectionDAG::computeOverflowForSignedSub(), llvm::computeOverflowForUnsignedAdd(), llvm::SelectionDAG::computeOverflowForUnsignedAdd(), llvm::computeOverflowForUnsignedMul(), llvm::SelectionDAG::computeOverflowForUnsignedMul(), llvm::computeOverflowForUnsignedSub(), and llvm::SelectionDAG::computeOverflowForUnsignedSub().
|
static |
Recognize variations of: CLAMP(v,l,h) ==> ((v) < (l) ?
(l) : ((v) > (h) ? (h) : (v)))
Definition at line 8399 of file ValueTracking.cpp.
References llvm::CmpInst::getSwappedPredicate(), llvm::CmpInst::ICMP_SGT, llvm::CmpInst::ICMP_SLT, llvm::CmpInst::ICMP_UGT, llvm::CmpInst::ICMP_ULT, llvm::PatternMatch::m_APInt(), llvm::PatternMatch::m_SMax(), llvm::PatternMatch::m_SMin(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_UMax(), llvm::PatternMatch::m_UMin(), llvm::PatternMatch::match(), llvm::APInt::sgt(), llvm::APInt::slt(), llvm::SPF_SMAX, llvm::SPF_SMIN, llvm::SPF_UMAX, llvm::SPF_UMIN, llvm::SPF_UNKNOWN, llvm::SPNB_NA, std::swap(), llvm::APInt::ugt(), and llvm::APInt::ult().
Referenced by matchMinMax().
|
static |
Match clamp pattern for float types without care about NaNs or signed zeros.
Given non-min/max outer cmp/select from the clamp pattern this function recognizes if it can be substitued by a "canonical" min/max pattern.
Definition at line 8349 of file ValueTracking.cpp.
References llvm::CmpInst::FCMP_OGE, llvm::CmpInst::FCMP_OGT, llvm::CmpInst::FCMP_OLE, llvm::CmpInst::FCMP_OLT, llvm::CmpInst::FCMP_UGE, llvm::CmpInst::FCMP_UGT, llvm::CmpInst::FCMP_ULE, llvm::CmpInst::FCMP_ULT, llvm::CmpInst::getInversePredicate(), llvm::APFloat::isFinite(), LHS, llvm::PatternMatch::m_APFloat(), llvm::PatternMatch::m_OrdOrUnordFMax(), llvm::PatternMatch::m_OrdOrUnordFMin(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::match(), RHS, llvm::SPF_FMAXNUM, llvm::SPF_FMINNUM, llvm::SPF_UNKNOWN, llvm::SPNB_NA, llvm::SPNB_RETURNS_ANY, and std::swap().
Referenced by matchSelectPattern().
|
static |
Match non-obvious integer minimum and maximum sequences.
Definition at line 8544 of file ValueTracking.cpp.
References llvm::Depth, llvm::SelectPatternResult::Flavor, getNotValue(), llvm::CmpInst::ICMP_SGT, llvm::CmpInst::ICMP_SLT, llvm::CmpInst::ICMP_UGT, llvm::CmpInst::ICMP_ULT, llvm::APInt::isAllOnes(), llvm::APInt::isMaxSignedValue(), llvm::APInt::isMinSignedValue(), llvm::APInt::isZero(), LHS, llvm::PatternMatch::m_APInt(), llvm::PatternMatch::match(), matchClamp(), matchMinMaxOfMinMax(), RHS, llvm::SPF_SMAX, llvm::SPF_SMIN, llvm::SPF_UMAX, llvm::SPF_UMIN, llvm::SPF_UNKNOWN, and llvm::SPNB_NA.
Referenced by matchSelectPattern().
|
static |
Recognize variations of: a < c ?
min(a,b) : min(b,c) ==> min(min(a,b),min(b,c))
Definition at line 8435 of file ValueTracking.cpp.
References A(), assert(), B(), llvm::CallingConv::C, D(), llvm::Depth, llvm::CmpInst::getSwappedPredicate(), 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, llvm::CmpInst::isIntPredicate(), llvm::SelectPatternResult::isMinOrMax(), llvm::MIPatternMatch::m_Not(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::match(), llvm::matchSelectPattern(), llvm::SPF_SMAX, llvm::SPF_SMIN, llvm::SPF_UMAX, llvm::SPF_UMIN, llvm::SPF_UNKNOWN, llvm::SPNB_NA, and std::swap().
Referenced by matchMinMax().
Definition at line 3028 of file ValueTracking.cpp.
References llvm::CmpInst::ICMP_EQ, llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_SpecificICmp(), llvm::PatternMatch::m_Zero(), llvm::PatternMatch::m_ZExtOrSExt(), and llvm::PatternMatch::match().
Referenced by isKnownNonZeroFromOperator(), isNonZeroAdd(), and isNonZeroSub().
|
static |
Definition at line 8779 of file ValueTracking.cpp.
References llvm::cast(), llvm::Depth, llvm::CmpInst::FCMP_OGE, llvm::CmpInst::FCMP_OGT, llvm::CmpInst::FCMP_OLE, llvm::CmpInst::FCMP_OLT, llvm::CmpInst::FCMP_UGE, llvm::CmpInst::FCMP_UGT, llvm::CmpInst::FCMP_ULE, llvm::CmpInst::FCMP_ULT, llvm::getSelectPattern(), llvm::CmpInst::getSwappedPredicate(), llvm::CmpInst::ICMP_SGE, llvm::CmpInst::ICMP_SGT, llvm::CmpInst::ICMP_SLT, llvm::CmpInst::isFPPredicate(), llvm::CmpInst::isIntPredicate(), llvm::isKnownNegation(), isKnownNonNaN(), llvm::isKnownNonZero(), llvm::CmpInst::isOrdered(), LHS, llvm::PatternMatch::m_AllOnes(), llvm::PatternMatch::m_AnyZeroFP(), llvm::PatternMatch::m_CombineOr(), llvm::MIPatternMatch::m_Neg(), llvm::PatternMatch::m_One(), llvm::PatternMatch::m_SExt(), llvm::PatternMatch::m_Specific(), llvm::MIPatternMatch::m_ZeroInt(), llvm::PatternMatch::match(), matchFastFloatClamp(), matchMinMax(), llvm::FastMathFlags::noSignedZeros(), RHS, llvm::SPF_ABS, llvm::SPF_NABS, llvm::SPF_UNKNOWN, llvm::SPNB_NA, llvm::SPNB_RETURNS_ANY, llvm::SPNB_RETURNS_NAN, llvm::SPNB_RETURNS_OTHER, and std::swap().
|
static |
Definition at line 9255 of file ValueTracking.cpp.
References llvm::dyn_cast(), llvm::PHINode::getIncomingValue(), llvm::PHINode::getNumIncomingValues(), I, LHS, Operation, and RHS.
Referenced by llvm::matchSimpleBinaryIntrinsicRecurrence(), and llvm::matchSimpleRecurrence().
|
static |
Definition at line 7079 of file ValueTracking.cpp.
References llvm::dyn_cast(), II, and llvm::Value::users().
Referenced by llvm::onlyUsedByLifetimeMarkers(), and llvm::onlyUsedByLifetimeMarkersOrDroppableInsts().
Definition at line 4723 of file ValueTracking.cpp.
References F, llvm::DenormalMode::IEEE, Mode, and llvm::DenormalMode::PositiveZero.
Referenced by computeKnownFPClass().
Definition at line 8203 of file ValueTracking.cpp.
References llvm::BasicBlock::begin(), llvm::SmallPtrSetImpl< PtrType >::count(), llvm::dyn_cast(), llvm::BasicBlock::end(), llvm::Function::getEntryBlock(), llvm::BasicBlock::getFirstNonPHIIt(), llvm::ilist_node_impl< OptionsT >::getIterator(), llvm::BasicBlock::getParent(), llvm::BasicBlock::getSingleSuccessor(), handleGuaranteedWellDefinedOps(), I, llvm::SmallPtrSetImpl< PtrType >::insert(), llvm::isGuaranteedToTransferExecutionToSuccessor(), llvm::make_range(), llvm::mustTriggerUB(), PoisonOnly, and llvm::propagatesPoison().
Does the 'Range' metadata (which must be a valid MD_range operand list) ensure that the value it's attached to is never Value?
'RangeType' is is the type of the value described by the range.
Definition at line 2983 of file ValueTracking.cpp.
References assert(), llvm::mdconst::extract(), llvm::Lower, Range, and llvm::Upper.
Referenced by isKnownNonZeroFromOperator().
|
static |
Definition at line 108 of file ValueTracking.cpp.
References llvm::dyn_cast(), and llvm::ilist_detail::node_parent_access< NodeTy, ParentTy >::getParent().
Referenced by llvm::computeKnownBits(), llvm::computeKnownBits(), llvm::computeKnownBits(), llvm::ComputeNumSignBits(), and llvm::isKnownToBeAPowerOfTwo().
|
static |
Definition at line 10236 of file ValueTracking.cpp.
References llvm::BitWidth, I, llvm::isa(), llvm::Lower, and llvm::Upper.
Referenced by llvm::computeConstantRange().
|
static |
Definition at line 9851 of file ValueTracking.cpp.
References llvm::APInt::ashr(), assert(), llvm::CallingConv::C, llvm::APInt::getAllOnes(), llvm::APInt::getBitsSetFrom(), llvm::APInt::getHighBitsSet(), llvm::APInt::getMaxValue(), llvm::APInt::getOneBitSet(), llvm::BinaryOperator::getOpcode(), llvm::User::getOperand(), llvm::APInt::getSignedMaxValue(), llvm::APInt::getSignedMinValue(), llvm::InstrInfoQuery::hasNoSignedWrap(), llvm::Instruction::hasNoSignedWrap(), llvm::InstrInfoQuery::hasNoUnsignedWrap(), llvm::InstrInfoQuery::isExact(), llvm::Lower, llvm::APInt::lshr(), llvm::PatternMatch::m_APInt(), llvm::MIPatternMatch::m_Neg(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::match(), llvm::APInt::sdiv(), std::swap(), llvm::APInt::udiv(), and llvm::Upper.
Referenced by llvm::computeConstantRange().
Shifts return poison if shiftwidth is larger than the bitwidth.
Definition at line 7510 of file ValueTracking.cpp.
References llvm::all_of(), llvm::CallingConv::C, llvm::dyn_cast(), llvm::dyn_cast_or_null(), llvm::isa(), and llvm::SmallVectorTemplateBase< T, bool >::push_back().
Referenced by canCreateUndefOrPoison().
|
static |
Definition at line 1382 of file ValueTracking.cpp.
References llvm::ConstantRange::getNonEmpty(), II, isSignedMinMaxIntrinsicClamp(), and llvm::KnownBits::unionWith().
Referenced by computeKnownBitsFromOperator().
|
static |
Referenced by isKnownNonNullFromDominatingCondition().
|
staticconstexpr |
Maximum number of instructions to check between assume and context instruction.
Definition at line 95 of file ValueTracking.cpp.
Referenced by llvm::willNotFreeBetween().