|
LLVM
4.0.0
|
#include "llvm/Analysis/InstructionSimplify.h"#include "llvm/ADT/SetVector.h"#include "llvm/ADT/Statistic.h"#include "llvm/Analysis/AliasAnalysis.h"#include "llvm/Analysis/CaptureTracking.h"#include "llvm/Analysis/ConstantFolding.h"#include "llvm/Analysis/MemoryBuiltins.h"#include "llvm/Analysis/ValueTracking.h"#include "llvm/Analysis/VectorUtils.h"#include "llvm/IR/ConstantRange.h"#include "llvm/IR/DataLayout.h"#include "llvm/IR/Dominators.h"#include "llvm/IR/GetElementPtrTypeIterator.h"#include "llvm/IR/GlobalAlias.h"#include "llvm/IR/Operator.h"#include "llvm/IR/PatternMatch.h"#include "llvm/IR/ValueHandle.h"#include <algorithm>#include "llvm/IR/Instruction.def"Go to the source code of this file.
Macros | |
| #define | DEBUG_TYPE "instsimplify" |
| #define | HANDLE_CAST_INST(num, opc, clas) case Instruction::opc: |
Enumerations | |
| enum | { RecursionLimit = 3 } |
Functions | |
| STATISTIC (NumExpand,"Number of expansions") | |
| STATISTIC (NumReassoc,"Number of reassociations") | |
| static Value * | SimplifyAndInst (Value *Op0, Value *Op1, const Query &Q, unsigned MaxRecurse) |
| Given operands for an And, see if we can fold the result. More... | |
| static Value * | SimplifyBinOp (unsigned Opcode, Value *LHS, Value *RHS, const Query &Q, unsigned MaxRecurse) |
| Given operands for a BinaryOperator, see if we can fold the result. More... | |
| static Value * | SimplifyFPBinOp (unsigned Opcode, Value *LHS, Value *RHS, const FastMathFlags &FMF, const Query &Q, unsigned MaxRecurse) |
| Given operands for a BinaryOperator, see if we can fold the result. More... | |
| static Value * | SimplifyCmpInst (unsigned Predicate, Value *LHS, Value *RHS, const Query &Q, unsigned MaxRecurse) |
| Given operands for a CmpInst, see if we can fold the result. More... | |
| static Value * | SimplifyICmpInst (unsigned Predicate, Value *LHS, Value *RHS, const Query &Q, unsigned MaxRecurse) |
| Given operands for an ICmpInst, see if we can fold the result. More... | |
| static Value * | SimplifyOrInst (Value *Op0, Value *Op1, const Query &Q, unsigned MaxRecurse) |
| Given operands for an Or, see if we can fold the result. More... | |
| static Value * | SimplifyXorInst (Value *Op0, Value *Op1, const Query &Q, unsigned MaxRecurse) |
| Given operands for a Xor, see if we can fold the result. More... | |
| static Value * | SimplifyCastInst (unsigned, Value *, Type *, const Query &, unsigned) |
| static Constant * | getFalse (Type *Ty) |
| For a boolean type, or a vector of boolean type, return false, or a vector with every element false, as appropriate for the type. More... | |
| static Constant * | getTrue (Type *Ty) |
| For a boolean type, or a vector of boolean type, return true, or a vector with every element true, as appropriate for the type. More... | |
| static bool | isSameCompare (Value *V, CmpInst::Predicate Pred, Value *LHS, Value *RHS) |
| isSameCompare - Is V equivalent to the comparison "LHS Pred RHS"? More... | |
| static bool | ValueDominatesPHI (Value *V, PHINode *P, const DominatorTree *DT) |
| Does the given value dominate the specified phi node? More... | |
| static Value * | ExpandBinOp (unsigned Opcode, Value *LHS, Value *RHS, unsigned OpcToExpand, const Query &Q, unsigned MaxRecurse) |
| Simplify "A op (B op' C)" by distributing op over op', turning it into "(A op B) op' (A op C)". More... | |
| static Value * | SimplifyAssociativeBinOp (unsigned Opc, Value *LHS, Value *RHS, const Query &Q, unsigned MaxRecurse) |
| Generic simplifications for associative binary operations. More... | |
| static Value * | ThreadBinOpOverSelect (unsigned Opcode, Value *LHS, Value *RHS, const Query &Q, unsigned MaxRecurse) |
| In the case of a binary operation with a select instruction as an operand, try to simplify the binop by seeing whether evaluating it on both branches of the select results in the same value. More... | |
| static Value * | ThreadCmpOverSelect (CmpInst::Predicate Pred, Value *LHS, Value *RHS, const Query &Q, unsigned MaxRecurse) |
| In the case of a comparison with a select instruction, try to simplify the comparison by seeing whether both branches of the select result in the same value. More... | |
| static Value * | ThreadBinOpOverPHI (unsigned Opcode, Value *LHS, Value *RHS, const Query &Q, unsigned MaxRecurse) |
| In the case of a binary operation with an operand that is a PHI instruction, try to simplify the binop by seeing whether evaluating it on the incoming phi values yields the same result for every value. More... | |
| static Value * | ThreadCmpOverPHI (CmpInst::Predicate Pred, Value *LHS, Value *RHS, const Query &Q, unsigned MaxRecurse) |
| In the case of a comparison with a PHI instruction, try to simplify the comparison by seeing whether comparing with all of the incoming phi values yields the same result every time. More... | |
| static Value * | SimplifyAddInst (Value *Op0, Value *Op1, bool isNSW, bool isNUW, const Query &Q, unsigned MaxRecurse) |
| Given operands for an Add, see if we can fold the result. More... | |
| static Constant * | stripAndComputeConstantOffsets (const DataLayout &DL, Value *&V, bool AllowNonInbounds=false) |
| Compute the base pointer and cumulative constant offsets for V. More... | |
| static Constant * | computePointerDifference (const DataLayout &DL, Value *LHS, Value *RHS) |
| Compute the constant difference between two pointer values. More... | |
| static Value * | SimplifySubInst (Value *Op0, Value *Op1, bool isNSW, bool isNUW, const Query &Q, unsigned MaxRecurse) |
| Given operands for a Sub, see if we can fold the result. More... | |
| static Value * | SimplifyFAddInst (Value *Op0, Value *Op1, FastMathFlags FMF, const Query &Q, unsigned MaxRecurse) |
| Given operands for an FAdd, see if we can fold the result. More... | |
| static Value * | SimplifyFSubInst (Value *Op0, Value *Op1, FastMathFlags FMF, const Query &Q, unsigned MaxRecurse) |
| Given operands for an FSub, see if we can fold the result. More... | |
| static Value * | SimplifyFMulInst (Value *Op0, Value *Op1, FastMathFlags FMF, const Query &Q, unsigned MaxRecurse) |
| Given the operands for an FMul, see if we can fold the result. More... | |
| static Value * | SimplifyMulInst (Value *Op0, Value *Op1, const Query &Q, unsigned MaxRecurse) |
| Given operands for a Mul, see if we can fold the result. More... | |
| static Value * | SimplifyDiv (Instruction::BinaryOps Opcode, Value *Op0, Value *Op1, const Query &Q, unsigned MaxRecurse) |
| Given operands for an SDiv or UDiv, see if we can fold the result. More... | |
| static Value * | SimplifySDivInst (Value *Op0, Value *Op1, const Query &Q, unsigned MaxRecurse) |
| Given operands for an SDiv, see if we can fold the result. More... | |
| static Value * | SimplifyUDivInst (Value *Op0, Value *Op1, const Query &Q, unsigned MaxRecurse) |
| Given operands for a UDiv, see if we can fold the result. More... | |
| static Value * | SimplifyFDivInst (Value *Op0, Value *Op1, FastMathFlags FMF, const Query &Q, unsigned) |
| static Value * | SimplifyRem (Instruction::BinaryOps Opcode, Value *Op0, Value *Op1, const Query &Q, unsigned MaxRecurse) |
| Given operands for an SRem or URem, see if we can fold the result. More... | |
| static Value * | SimplifySRemInst (Value *Op0, Value *Op1, const Query &Q, unsigned MaxRecurse) |
| Given operands for an SRem, see if we can fold the result. More... | |
| static Value * | SimplifyURemInst (Value *Op0, Value *Op1, const Query &Q, unsigned MaxRecurse) |
| Given operands for a URem, see if we can fold the result. More... | |
| static Value * | SimplifyFRemInst (Value *Op0, Value *Op1, FastMathFlags FMF, const Query &, unsigned) |
| static bool | isUndefShift (Value *Amount) |
Returns true if a shift by Amount always yields undef. More... | |
| static Value * | SimplifyShift (unsigned Opcode, Value *Op0, Value *Op1, const Query &Q, unsigned MaxRecurse) |
| Given operands for an Shl, LShr or AShr, see if we can fold the result. More... | |
| static Value * | SimplifyRightShift (unsigned Opcode, Value *Op0, Value *Op1, bool isExact, const Query &Q, unsigned MaxRecurse) |
| Given operands for an Shl, LShr or AShr, see if we can fold the result. More... | |
| static Value * | SimplifyShlInst (Value *Op0, Value *Op1, bool isNSW, bool isNUW, const Query &Q, unsigned MaxRecurse) |
| Given operands for an Shl, see if we can fold the result. More... | |
| static Value * | SimplifyLShrInst (Value *Op0, Value *Op1, bool isExact, const Query &Q, unsigned MaxRecurse) |
| Given operands for an LShr, see if we can fold the result. More... | |
| static Value * | SimplifyAShrInst (Value *Op0, Value *Op1, bool isExact, const Query &Q, unsigned MaxRecurse) |
| Given operands for an AShr, see if we can fold the result. More... | |
| static Value * | simplifyUnsignedRangeCheck (ICmpInst *ZeroICmp, ICmpInst *UnsignedICmp, bool IsAnd) |
| static Value * | simplifyAndOfICmpsWithSameOperands (ICmpInst *Op0, ICmpInst *Op1) |
| Commuted variants are assumed to be handled by calling this function again with the parameters swapped. More... | |
| static Value * | SimplifyAndOfICmps (ICmpInst *Op0, ICmpInst *Op1) |
| Commuted variants are assumed to be handled by calling this function again with the parameters swapped. More... | |
| static Value * | simplifyOrOfICmpsWithSameOperands (ICmpInst *Op0, ICmpInst *Op1) |
| Commuted variants are assumed to be handled by calling this function again with the parameters swapped. More... | |
| static Value * | SimplifyOrOfICmps (ICmpInst *Op0, ICmpInst *Op1) |
| Commuted variants are assumed to be handled by calling this function again with the parameters swapped. More... | |
| static Type * | GetCompareTy (Value *Op) |
| static Value * | ExtractEquivalentCondition (Value *V, CmpInst::Predicate Pred, Value *LHS, Value *RHS) |
| Rummage around inside V looking for something equivalent to the comparison "LHS Pred RHS". More... | |
| static Constant * | computePointerICmp (const DataLayout &DL, const TargetLibraryInfo *TLI, const DominatorTree *DT, CmpInst::Predicate Pred, const Instruction *CxtI, Value *LHS, Value *RHS) |
| static Value * | simplifyICmpOfBools (CmpInst::Predicate Pred, Value *LHS, Value *RHS, const Query &Q) |
| Fold an icmp when its operands have i1 scalar type. More... | |
| static Value * | simplifyICmpWithZero (CmpInst::Predicate Pred, Value *LHS, Value *RHS, const Query &Q) |
| Try hard to fold icmp with zero RHS because this is a common case. More... | |
| static Value * | simplifyICmpWithConstant (CmpInst::Predicate Pred, Value *LHS, Value *RHS) |
| static Value * | simplifyICmpWithBinOp (CmpInst::Predicate Pred, Value *LHS, Value *RHS, const Query &Q, unsigned MaxRecurse) |
| static Value * | simplifyICmpWithMinMax (CmpInst::Predicate Pred, Value *LHS, Value *RHS, const Query &Q, unsigned MaxRecurse) |
| Simplify integer comparisons where at least one operand of the compare matches an integer min/max idiom. More... | |
| static Value * | SimplifyFCmpInst (unsigned Predicate, Value *LHS, Value *RHS, FastMathFlags FMF, const Query &Q, unsigned MaxRecurse) |
| Given operands for an FCmpInst, see if we can fold the result. More... | |
| static const Value * | SimplifyWithOpReplaced (Value *V, Value *Op, Value *RepOp, const Query &Q, unsigned MaxRecurse) |
| See if V simplifies when its operand Op is replaced with RepOp. More... | |
| static Value * | simplifySelectBitTest (Value *TrueVal, Value *FalseVal, Value *X, const APInt *Y, bool TrueWhenUnset) |
| Try to simplify a select instruction when its condition operand is an integer comparison where one operand of the compare is a constant. More... | |
| static Value * | simplifySelectWithFakeICmpEq (Value *CmpLHS, Value *TrueVal, Value *FalseVal, bool TrueWhenUnset) |
| An alternative way to test if a bit is set or not uses sgt/slt instead of eq/ne. More... | |
| static Value * | simplifySelectWithICmpCond (Value *CondVal, Value *TrueVal, Value *FalseVal, const Query &Q, unsigned MaxRecurse) |
| Try to simplify a select instruction when its condition operand is an integer comparison. More... | |
| static Value * | SimplifySelectInst (Value *CondVal, Value *TrueVal, Value *FalseVal, const Query &Q, unsigned MaxRecurse) |
| Given operands for a SelectInst, see if we can fold the result. More... | |
| static Value * | SimplifyGEPInst (Type *SrcTy, ArrayRef< Value * > Ops, const Query &Q, unsigned) |
| Given operands for an GetElementPtrInst, see if we can fold the result. More... | |
| static Value * | SimplifyInsertValueInst (Value *Agg, Value *Val, ArrayRef< unsigned > Idxs, const Query &Q, unsigned) |
| Given operands for an InsertValueInst, see if we can fold the result. More... | |
| static Value * | SimplifyExtractValueInst (Value *Agg, ArrayRef< unsigned > Idxs, const Query &, unsigned) |
| Given operands for an ExtractValueInst, see if we can fold the result. More... | |
| static Value * | SimplifyExtractElementInst (Value *Vec, Value *Idx, const Query &, unsigned) |
| Given operands for an ExtractElementInst, see if we can fold the result. More... | |
| static Value * | SimplifyPHINode (PHINode *PN, const Query &Q) |
| See if we can fold the given phi. If not, returns null. More... | |
| static bool | IsIdempotent (Intrinsic::ID ID) |
| static Value * | SimplifyRelativeLoad (Constant *Ptr, Constant *Offset, const DataLayout &DL) |
| static bool | maskIsAllZeroOrUndef (Value *Mask) |
| template<typename IterTy > | |
| static Value * | SimplifyIntrinsic (Function *F, IterTy ArgBegin, IterTy ArgEnd, const Query &Q, unsigned MaxRecurse) |
| template<typename IterTy > | |
| static Value * | SimplifyCall (Value *V, IterTy ArgBegin, IterTy ArgEnd, const Query &Q, unsigned MaxRecurse) |
| static bool | replaceAndRecursivelySimplifyImpl (Instruction *I, Value *SimpleV, const TargetLibraryInfo *TLI, const DominatorTree *DT, AssumptionCache *AC) |
| Implementation of recursive simplification through an instruction's uses. More... | |
| #define DEBUG_TYPE "instsimplify" |
Definition at line 41 of file InstructionSimplify.cpp.
| #define HANDLE_CAST_INST | ( | num, | |
| opc, | |||
| clas | |||
| ) | case Instruction::opc: |
| anonymous enum |
| Enumerator | |
|---|---|
| RecursionLimit | |
Definition at line 43 of file InstructionSimplify.cpp.
|
static |
Compute the constant difference between two pointer values.
If the difference is not a constant, returns zero.
Definition at line 647 of file InstructionSimplify.cpp.
References llvm::ConstantExpr::getSub(), and stripAndComputeConstantOffsets().
Referenced by SimplifySubInst().
|
static |
Definition at line 2077 of file InstructionSimplify.cpp.
References A, llvm::all_of(), llvm::dyn_cast(), llvm::ConstantInt::get(), llvm::ConstantExpr::getAdd(), GetCompareTy(), llvm::ConstantExpr::getICmp(), llvm::getObjectSize(), llvm::ICmpInst::getSignedPredicate(), llvm::Value::getType(), llvm::GetUnderlyingObjects(), llvm::ConstantInt::getValue(), llvm::CmpInst::ICMP_EQ, llvm::CmpInst::ICMP_NE, llvm::CmpInst::ICMP_UGE, llvm::CmpInst::ICMP_UGT, llvm::CmpInst::ICMP_ULE, llvm::CmpInst::ICMP_ULT, llvm::isAllocLikeFn(), llvm::CmpInst::isFalseWhenEqual(), llvm::isKnownNonNull(), llvm::isKnownNonNullAt(), llvm::APInt::isNegative(), llvm::isNoAliasCall(), llvm::Constant::isNullValue(), llvm::CmpInst::isTrueWhenEqual(), MI, llvm::PointerMayBeCaptured(), stripAndComputeConstantOffsets(), llvm::Value::stripPointerCasts(), and llvm::APInt::ult().
Referenced by SimplifyICmpInst().
|
static |
Simplify "A op (B op' C)" by distributing op over op', turning it into "(A op B) op' (A op C)".
Here "op" is given by Opcode and "op'" is given by OpcodeToExpand, while "A" corresponds to LHS and "B op' C" to RHS. Also performs the transform "(A op' B) op C" -> "(A op C) op' (B op C)". Returns the simplified value, or null if no simplification was performed.
Definition at line 143 of file InstructionSimplify.cpp.
References A, B, C, llvm::Instruction::isCommutative(), L, and llvm::SimplifyBinOp().
Referenced by SimplifyAndInst(), SimplifyMulInst(), and SimplifyOrInst().
|
static |
Rummage around inside V looking for something equivalent to the comparison "LHS Pred RHS".
Return such a value if found, otherwise return null. Helper function for analyzing max/min idioms.
Definition at line 2031 of file InstructionSimplify.cpp.
References llvm::dyn_cast(), llvm::SelectInst::getCondition(), llvm::User::getOperand(), llvm::CmpInst::getPredicate(), llvm::CmpInst::getSwappedPredicate(), and SI.
Referenced by simplifyICmpWithMinMax().
Definition at line 2024 of file InstructionSimplify.cpp.
References llvm::Value::getType(), and llvm::CmpInst::makeCmpResultType().
Referenced by computePointerICmp(), SimplifyFCmpInst(), SimplifyICmpInst(), simplifyICmpOfBools(), simplifyICmpWithBinOp(), simplifyICmpWithConstant(), simplifyICmpWithMinMax(), and simplifyICmpWithZero().
For a boolean type, or a vector of boolean type, return false, or a vector with every element false, as appropriate for the type.
Definition at line 79 of file InstructionSimplify.cpp.
References assert(), llvm::Constant::getNullValue(), llvm::Type::getScalarType(), and llvm::Type::isIntegerTy().
Referenced by reuseTableCompare(), SimplifyAndOfICmps(), simplifyAndOfICmpsWithSameOperands(), SimplifyFCmpInst(), simplifyICmpWithBinOp(), simplifyICmpWithMinMax(), simplifyICmpWithZero(), simplifyUnsignedRangeCheck(), and ThreadCmpOverSelect().
For a boolean type, or a vector of boolean type, return true, or a vector with every element true, as appropriate for the type.
Definition at line 87 of file InstructionSimplify.cpp.
References assert(), llvm::Constant::getAllOnesValue(), llvm::Type::getScalarType(), and llvm::Type::isIntegerTy().
Referenced by reuseTableCompare(), SimplifyFCmpInst(), simplifyICmpOfBools(), simplifyICmpWithBinOp(), simplifyICmpWithMinMax(), simplifyICmpWithZero(), SimplifyOrOfICmps(), simplifyOrOfICmpsWithSameOperands(), simplifyUnsignedRangeCheck(), and ThreadCmpOverSelect().
|
static |
Definition at line 4162 of file InstructionSimplify.cpp.
References round().
Referenced by SimplifyIntrinsic().
|
static |
isSameCompare - Is V equivalent to the comparison "LHS Pred RHS"?
Definition at line 94 of file InstructionSimplify.cpp.
References llvm::dyn_cast(), llvm::User::getOperand(), llvm::CmpInst::getPredicate(), and llvm::CmpInst::getSwappedPredicate().
Referenced by ThreadCmpOverSelect().
Returns true if a shift by Amount always yields undef.
Definition at line 1310 of file InstructionSimplify.cpp.
References C, llvm::dyn_cast(), E, llvm::Constant::getAggregateElement(), llvm::Value::getType(), llvm::Type::getVectorNumElements(), and I.
Referenced by SimplifyShift().
Definition at line 4234 of file InstructionSimplify.cpp.
References llvm::dyn_cast(), E, I, and llvm::BitmaskEnumDetail::Mask().
Referenced by SimplifyIntrinsic().
|
static |
Implementation of recursive simplification through an instruction's uses.
This is the common implementation of the recursive simplification routines. If we have a pre-simplified value in 'SimpleV', that is forcibly used to replace the instruction 'I'. Otherwise, we simply add 'I' to the list of instructions to process and attempt to simplify it using InstructionSimplify.
This routine returns 'true' only when it simplifies something. The passed in simplified value does not count toward this.
Definition at line 4570 of file InstructionSimplify.cpp.
References llvm::Instruction::eraseFromParent(), llvm::Module::getDataLayout(), llvm::Instruction::getModule(), llvm::Instruction::getParent(), I, llvm::SetVector< T, SmallVector< T, N >, SmallDenseSet< T, N > >::insert(), llvm::Instruction::isEHPad(), llvm::Instruction::mayHaveSideEffects(), llvm::Value::replaceAllUsesWith(), llvm::JumpTable::Simplified, llvm::SimplifyInstruction(), llvm::SetVector< T, SmallVector< T, N >, SmallDenseSet< T, N > >::size(), and llvm::Value::users().
Referenced by llvm::recursivelySimplifyInstruction(), and llvm::replaceAndRecursivelySimplify().
|
static |
Given operands for an Add, see if we can fold the result.
If not, this returns null.
i1 add -> xor.
Definition at line 532 of file InstructionSimplify.cpp.
References llvm::MCID::Add, llvm::ConstantFoldBinaryOpOperands(), llvm::Constant::getAllOnesValue(), llvm::Value::getType(), llvm::Type::isIntegerTy(), llvm::PatternMatch::m_Not(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_Sub(), llvm::PatternMatch::m_Undef(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::m_Zero(), llvm::PatternMatch::match(), SimplifyAssociativeBinOp(), llvm::SimplifyXorInst(), std::swap(), and Y.
Referenced by llvm::SimplifyAddInst().
|
static |
Given operands for an And, see if we can fold the result.
If not, this returns null.
Definition at line 1637 of file InstructionSimplify.cpp.
References A, llvm::APIntOps::And(), B, llvm::ConstantFoldBinaryOpOperands(), llvm::dyn_cast(), ExpandBinOp(), llvm::ConstantExpr::getCast(), llvm::Constant::getNullValue(), llvm::CmpInst::getOpcode(), llvm::Value::getType(), llvm::isKnownToBeAPowerOfTwo(), llvm::PatternMatch::m_AllOnes(), llvm::PatternMatch::m_Neg(), llvm::PatternMatch::m_Not(), llvm::PatternMatch::m_Or(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_Undef(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::m_Zero(), llvm::PatternMatch::match(), llvm::APIntOps::Or(), SimplifyAndOfICmps(), SimplifyAssociativeBinOp(), std::swap(), ThreadBinOpOverPHI(), ThreadBinOpOverSelect(), and llvm::APIntOps::Xor().
Referenced by llvm::SimplifyAndInst().
Commuted variants are assumed to be handled by calling this function again with the parameters swapped.
Definition at line 1572 of file InstructionSimplify.cpp.
References getFalse(), llvm::User::getOperand(), llvm::Value::getType(), llvm::CmpInst::ICMP_SGT, llvm::CmpInst::ICMP_SLE, llvm::CmpInst::ICMP_SLT, llvm::CmpInst::ICMP_UGT, llvm::CmpInst::ICMP_ULE, llvm::CmpInst::ICMP_ULT, llvm::PatternMatch::m_Add(), llvm::PatternMatch::m_APInt(), llvm::PatternMatch::m_ICmp(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_Value(), llvm::ConstantRange::makeAllowedICmpRegion(), llvm::PatternMatch::match(), simplifyAndOfICmpsWithSameOperands(), simplifyUnsignedRangeCheck(), and X.
Referenced by SimplifyAndInst().
Commuted variants are assumed to be handled by calling this function again with the parameters swapped.
Definition at line 1547 of file InstructionSimplify.cpp.
References A, B, getFalse(), llvm::CmpInst::getInversePredicate(), llvm::Value::getType(), llvm::CmpInst::ICMP_EQ, llvm::CmpInst::ICMP_SGT, llvm::CmpInst::ICMP_SLT, llvm::CmpInst::ICMP_UGT, llvm::CmpInst::ICMP_ULT, llvm::CmpInst::isFalseWhenEqual(), llvm::CmpInst::isImpliedTrueByMatchingCmp(), llvm::PatternMatch::m_ICmp(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_Value(), and llvm::PatternMatch::match().
Referenced by SimplifyAndOfICmps().
|
static |
Given operands for an AShr, see if we can fold the result.
If not, this returns null.
Definition at line 1472 of file InstructionSimplify.cpp.
References llvm::ComputeNumSignBits(), llvm::Type::getScalarSizeInBits(), llvm::Value::getType(), llvm::PatternMatch::m_AllOnes(), llvm::PatternMatch::m_NSWShl(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), SimplifyRightShift(), and X.
Referenced by llvm::SimplifyAShrInst().
|
static |
Generic simplifications for associative binary operations.
Returns the simpler value, or null if none was found.
Definition at line 202 of file InstructionSimplify.cpp.
References A, assert(), B, C, llvm::dyn_cast(), llvm::BinaryOperator::getOpcode(), llvm::User::getOperand(), llvm::Instruction::isAssociative(), llvm::Instruction::isCommutative(), and llvm::SimplifyBinOp().
Referenced by SimplifyAddInst(), SimplifyAndInst(), SimplifyBinOp(), SimplifyMulInst(), SimplifyOrInst(), and SimplifyXorInst().
|
static |
Given operands for a BinaryOperator, see if we can fold the result.
If not, this returns null.
Definition at line 4046 of file InstructionSimplify.cpp.
References llvm::MCID::Add, llvm::APIntOps::And(), llvm::ConstantFoldBinaryOpOperands(), llvm::Instruction::isAssociative(), llvm::APIntOps::Or(), llvm::SimplifyAddInst(), llvm::SimplifyAndInst(), llvm::SimplifyAShrInst(), SimplifyAssociativeBinOp(), llvm::SimplifyFAddInst(), llvm::SimplifyFDivInst(), llvm::SimplifyFMulInst(), llvm::SimplifyFRemInst(), llvm::SimplifyFSubInst(), llvm::SimplifyLShrInst(), llvm::SimplifyMulInst(), llvm::SimplifyOrInst(), llvm::SimplifySDivInst(), llvm::SimplifyShlInst(), llvm::SimplifySRemInst(), llvm::SimplifySubInst(), llvm::SimplifyUDivInst(), llvm::SimplifyURemInst(), llvm::SimplifyXorInst(), ThreadBinOpOverPHI(), ThreadBinOpOverSelect(), and llvm::APIntOps::Xor().
Referenced by llvm::SimplifyBinOp().
|
static |
Definition at line 4344 of file InstructionSimplify.cpp.
References C, llvm::canConstantFoldCallTo(), llvm::ConstantFoldCall(), llvm::dyn_cast(), E, F, llvm::UndefValue::get(), llvm::FunctionType::getReturnType(), llvm::Value::getType(), I, llvm::SmallVectorTemplateBase< T, isPodLike< T >::value >::push_back(), llvm::SmallVectorImpl< T >::reserve(), llvm::MipsISD::Ret, and SimplifyIntrinsic().
Referenced by llvm::SimplifyCall().
|
static |
Definition at line 3999 of file InstructionSimplify.cpp.
References C, llvm::ConstantFoldCastOperand(), llvm::Value::getType(), llvm::CastInst::isEliminableCastPair(), and llvm::Type::isPtrOrPtrVectorTy().
Referenced by llvm::SimplifyCastInst().
|
static |
Given operands for a CmpInst, see if we can fold the result.
Definition at line 4147 of file InstructionSimplify.cpp.
References llvm::CmpInst::isIntPredicate(), llvm::SimplifyFCmpInst(), and llvm::SimplifyICmpInst().
Referenced by llvm::SimplifyCmpInst().
|
static |
Given operands for an SDiv or UDiv, see if we can fold the result.
If not, this returns null.
Definition at line 1003 of file InstructionSimplify.cpp.
References llvm::ConstantFoldBinaryOpOperands(), llvm::ConstantInt::get(), llvm::UndefValue::get(), llvm::Constant::getNullValue(), llvm::Value::getType(), llvm::ConstantInt::getValue(), llvm::OverflowingBinaryOperator::hasNoSignedWrap(), llvm::OverflowingBinaryOperator::hasNoUnsignedWrap(), llvm::Type::isIntegerTy(), llvm::PatternMatch::m_ConstantInt(), llvm::PatternMatch::m_Mul(), llvm::PatternMatch::m_One(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_SRem(), llvm::PatternMatch::m_UDiv(), llvm::PatternMatch::m_Undef(), llvm::PatternMatch::m_URem(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::m_Zero(), llvm::PatternMatch::match(), std::swap(), ThreadBinOpOverPHI(), ThreadBinOpOverSelect(), llvm::APInt::umul_ov(), X, and Y.
Referenced by SimplifySDivInst(), and SimplifyUDivInst().
|
static |
Given operands for an ExtractElementInst, see if we can fold the result.
If not, this returns null.
Definition at line 3936 of file InstructionSimplify.cpp.
References llvm::ConstantFoldExtractElementInstruction(), llvm::findScalarElement(), llvm::UndefValue::get(), llvm::Value::getType(), and llvm::Type::getVectorElementType().
Referenced by llvm::SimplifyExtractElementInst().
|
static |
Given operands for an ExtractValueInst, see if we can fold the result.
If not, this returns null.
Definition at line 3901 of file InstructionSimplify.cpp.
References llvm::ConstantFoldExtractValueInstruction(), llvm::dyn_cast(), fuzzer::min(), llvm::ArrayRef< T >::size(), and llvm::ArrayRef< T >::slice().
Referenced by llvm::SimplifyExtractValueInst().
|
static |
Given operands for an FAdd, see if we can fold the result.
If not, this returns null.
Definition at line 808 of file InstructionSimplify.cpp.
References llvm::CannotBeNegativeZero(), llvm::ConstantFoldBinaryOpOperands(), llvm::Constant::getNullValue(), llvm::Value::getType(), llvm::Instruction::hasNoInfs(), llvm::Instruction::hasNoNaNs(), llvm::PatternMatch::m_AnyZero(), llvm::PatternMatch::m_FSub(), llvm::PatternMatch::m_NegZero(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_Zero(), llvm::PatternMatch::match(), llvm::FastMathFlags::noInfs(), llvm::FastMathFlags::noNaNs(), llvm::FastMathFlags::noSignedZeros(), and std::swap().
Referenced by llvm::SimplifyFAddInst().
|
static |
Given operands for an FCmpInst, see if we can fold the result.
If not, this returns null.
Definition at line 3342 of file InstructionSimplify.cpp.
References assert(), llvm::CannotBeOrderedLessThanZero(), llvm::ConstantFoldCompareInstOperands(), llvm::dyn_cast(), llvm::CmpInst::FCMP_FALSE, llvm::CmpInst::FCMP_OGT, llvm::CmpInst::FCMP_OLT, llvm::CmpInst::FCMP_ORD, llvm::CmpInst::FCMP_TRUE, llvm::CmpInst::FCMP_UGE, llvm::CmpInst::FCMP_ULE, llvm::CmpInst::FCMP_UNO, llvm::ConstantInt::get(), GetCompareTy(), getFalse(), llvm::CmpInst::getSwappedPredicate(), getTrue(), llvm::Value::getType(), llvm::ConstantFP::getValueAPF(), llvm::CmpInst::isFalseWhenEqual(), llvm::CmpInst::isFPPredicate(), llvm::APFloat::isInfinity(), llvm::APFloat::isNaN(), llvm::APFloat::isNegative(), llvm::CmpInst::isOrdered(), llvm::CmpInst::isTrueWhenEqual(), llvm::CmpInst::isUnordered(), llvm::Type::isVectorTy(), llvm::APFloat::isZero(), llvm::FastMathFlags::noNaNs(), std::swap(), ThreadCmpOverPHI(), and ThreadCmpOverSelect().
Referenced by llvm::SimplifyFCmpInst().
|
static |
Definition at line 1130 of file InstructionSimplify.cpp.
References llvm::ConstantFP::get(), llvm::BinaryOperator::getFNegArgument(), llvm::Value::getType(), llvm::BinaryOperator::isFNeg(), llvm::PatternMatch::m_AnyZero(), llvm::PatternMatch::m_FPOne(), llvm::PatternMatch::m_Undef(), llvm::PatternMatch::match(), llvm::FastMathFlags::noNaNs(), and llvm::FastMathFlags::noSignedZeros().
Referenced by llvm::SimplifyFDivInst().
|
static |
Given the operands for an FMul, see if we can fold the result.
Definition at line 881 of file InstructionSimplify.cpp.
References llvm::ConstantFoldBinaryOpOperands(), llvm::PatternMatch::m_AnyZero(), llvm::PatternMatch::m_FPOne(), llvm::PatternMatch::match(), llvm::FastMathFlags::noNaNs(), llvm::FastMathFlags::noSignedZeros(), and std::swap().
Referenced by llvm::SimplifyFMulInst().
|
static |
Given operands for a BinaryOperator, see if we can fold the result.
If not, this returns null. In contrast to SimplifyBinOp, try to use FastMathFlag when folding the result. In case we don't need FastMathFlags, simply fall to SimplifyBinOp.
Definition at line 4112 of file InstructionSimplify.cpp.
References llvm::SimplifyBinOp(), llvm::SimplifyFAddInst(), llvm::SimplifyFDivInst(), llvm::SimplifyFMulInst(), and llvm::SimplifyFSubInst().
Referenced by llvm::SimplifyFPBinOp().
|
static |
Definition at line 1281 of file InstructionSimplify.cpp.
References llvm::PatternMatch::m_AnyZero(), llvm::PatternMatch::m_Undef(), llvm::PatternMatch::match(), llvm::FastMathFlags::noNaNs(), and llvm::FastMathFlags::noSignedZeros().
Referenced by llvm::SimplifyFRemInst().
|
static |
Given operands for an FSub, see if we can fold the result.
If not, this returns null.
Definition at line 847 of file InstructionSimplify.cpp.
References llvm::CannotBeNegativeZero(), llvm::ConstantFoldBinaryOpOperands(), llvm::Constant::getNullValue(), llvm::Value::getType(), llvm::PatternMatch::m_AnyZero(), llvm::PatternMatch::m_FSub(), llvm::PatternMatch::m_NegZero(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::m_Zero(), llvm::PatternMatch::match(), llvm::FastMathFlags::noNaNs(), llvm::FastMathFlags::noSignedZeros(), and X.
Referenced by llvm::SimplifyFSubInst().
|
static |
Given operands for an GetElementPtrInst, see if we can fold the result.
If not, this returns null.
Definition at line 3745 of file InstructionSimplify.cpp.
References llvm::all_of(), llvm::ArrayRef< T >::back(), C, llvm::ConstantInt::get(), llvm::VectorType::get(), llvm::PointerType::get(), llvm::UndefValue::get(), llvm::ConstantExpr::getGetElementPtr(), llvm::GetElementPtrInst::getIndexedType(), llvm::ConstantExpr::getIntToPtr(), llvm::Constant::getNullValue(), llvm::Intrinsic::getType(), llvm::Value::getType(), i, llvm::Type::isSized(), llvm::PatternMatch::m_AllOnes(), llvm::PatternMatch::m_AShr(), llvm::PatternMatch::m_ConstantInt(), llvm::PatternMatch::m_PtrToInt(), llvm::PatternMatch::m_SDiv(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_SpecificInt(), llvm::PatternMatch::m_Sub(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::m_Xor(), llvm::PatternMatch::m_Zero(), llvm::PatternMatch::match(), P, llvm::ArrayRef< T >::size(), and llvm::ArrayRef< T >::slice().
Referenced by llvm::SimplifyGEPInst().
|
static |
Given operands for an ICmpInst, see if we can fold the result.
If not, this returns null.
Definition at line 3033 of file InstructionSimplify.cpp.
References assert(), C, llvm::computeKnownBits(), computePointerICmp(), llvm::ConstantFoldCompareInstOperands(), llvm::dyn_cast(), llvm::ConstantInt::get(), llvm::APInt::getBitWidth(), llvm::ConstantExpr::getCast(), GetCompareTy(), llvm::getConstantRangeFromMetadata(), llvm::Type::getContext(), llvm::Value::getContext(), llvm::ConstantInt::getFalse(), llvm::ConstantExpr::getGetElementPtr(), llvm::ConstantExpr::getICmp(), llvm::ConstantExpr::getIntToPtr(), llvm::CmpInst::getInversePredicate(), llvm::Constant::getNullValue(), llvm::User::getOperand(), llvm::Type::getPrimitiveSizeInBits(), llvm::ICmpInst::getSignedPredicate(), llvm::CmpInst::getSwappedPredicate(), llvm::ConstantInt::getTrue(), llvm::ConstantExpr::getTrunc(), llvm::Value::getType(), llvm::ICmpInst::getUnsignedPredicate(), 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, llvm::ICmpInst::isEquality(), llvm::CmpInst::isIntPredicate(), llvm::isKnownNonEqual(), llvm::Type::isPointerTy(), llvm::CmpInst::isTrueWhenEqual(), llvm_unreachable, llvm::PatternMatch::m_APInt(), llvm::ConstantRange::makeSatisfyingICmpRegion(), llvm::PatternMatch::match(), llvm::LLVMContext::MD_range, llvm::SimplifyICmpInst(), simplifyICmpOfBools(), simplifyICmpWithBinOp(), simplifyICmpWithConstant(), simplifyICmpWithMinMax(), simplifyICmpWithZero(), std::swap(), ThreadCmpOverPHI(), and ThreadCmpOverSelect().
Referenced by llvm::SimplifyICmpInst().
|
static |
Fold an icmp when its operands have i1 scalar type.
For signed comparison, the values for an i1 are 0 and -1 respectively. This maps into a truth table of: LHS | RHS | LHS >=s RHS | LHS implies RHS 0 | 0 | 1 (0 >= 0) | 1 0 | 1 | 1 (0 >= -1) | 1 1 | 0 | 0 (-1 >= 0) | 0 1 | 1 | 1 (-1 >= -1) | 1
Definition at line 2256 of file InstructionSimplify.cpp.
References GetCompareTy(), llvm::Type::getScalarType(), getTrue(), llvm::Value::getType(), llvm::Optional< T >::getValueOr(), llvm::CmpInst::ICMP_EQ, llvm::CmpInst::ICMP_NE, llvm::CmpInst::ICMP_SGE, llvm::CmpInst::ICMP_SLE, llvm::CmpInst::ICMP_SLT, llvm::CmpInst::ICMP_UGE, llvm::CmpInst::ICMP_UGT, llvm::CmpInst::ICMP_ULE, llvm::isImpliedCondition(), llvm::Type::isIntegerTy(), llvm::PatternMatch::m_One(), llvm::PatternMatch::m_Zero(), and llvm::PatternMatch::match().
Referenced by SimplifyICmpInst().
|
static |
Definition at line 2519 of file InstructionSimplify.cpp.
References A, llvm::MCID::Add, assert(), B, C, llvm::ComputeSignBit(), D, llvm::dyn_cast(), GetCompareTy(), llvm::Value::getContext(), getFalse(), llvm::ConstantInt::getFalse(), llvm::Constant::getNullValue(), llvm::BinaryOperator::getOpcode(), llvm::User::getOperand(), getTrue(), llvm::ConstantInt::getTrue(), llvm::Value::getType(), llvm::Instruction::hasNoSignedWrap(), llvm::Instruction::hasNoUnsignedWrap(), 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, llvm::ICmpInst::isEquality(), llvm::Instruction::isExact(), llvm::APInt::isPowerOf2(), llvm::APInt::isSignBit(), llvm::CmpInst::isSigned(), llvm::CmpInst::isUnsigned(), LLVM_FALLTHROUGH, llvm::PatternMatch::m_And(), llvm::PatternMatch::m_APInt(), llvm::PatternMatch::m_c_Or(), llvm::PatternMatch::m_CombineOr(), llvm::PatternMatch::m_LShr(), llvm::PatternMatch::m_Neg(), llvm::PatternMatch::m_Shl(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_UDiv(), llvm::PatternMatch::m_URem(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::m_ZExt(), llvm::PatternMatch::match(), llvm::SimplifyICmpInst(), and Y.
Referenced by SimplifyICmpInst().
|
static |
Definition at line 2380 of file InstructionSimplify.cpp.
References llvm::APInt::abs(), llvm::APInt::ashr(), assert(), C, llvm::ConstantRange::contains(), llvm::APInt::countLeadingOnes(), llvm::APInt::countLeadingZeros(), llvm::APInt::countTrailingZeros(), llvm::APInt::getAllOnesValue(), llvm::APInt::getBitWidth(), GetCompareTy(), llvm::getConstantRangeFromMetadata(), llvm::ConstantInt::getFalse(), llvm::APInt::getSignedMaxValue(), llvm::APInt::getSignedMinValue(), llvm::ConstantInt::getTrue(), I, llvm::ConstantRange::intersectWith(), llvm::ConstantRange::inverse(), llvm::APInt::isAllOnesValue(), llvm::ConstantRange::isEmptySet(), llvm::ConstantRange::isFullSet(), llvm::APInt::isMinSignedValue(), llvm::APInt::isNegative(), llvm::Lower, llvm::APInt::lshr(), llvm::PatternMatch::m_And(), llvm::PatternMatch::m_APInt(), llvm::PatternMatch::m_AShr(), llvm::PatternMatch::m_LShr(), llvm::PatternMatch::m_NSWShl(), llvm::PatternMatch::m_NUWAdd(), llvm::PatternMatch::m_NUWShl(), llvm::PatternMatch::m_Or(), llvm::PatternMatch::m_SDiv(), llvm::PatternMatch::m_SRem(), llvm::PatternMatch::m_UDiv(), llvm::PatternMatch::m_URem(), llvm::PatternMatch::m_Value(), llvm::ConstantRange::makeExactICmpRegion(), llvm::PatternMatch::match(), llvm::LLVMContext::MD_range, llvm::APInt::sdiv(), llvm::APInt::sgt(), llvm::APInt::shl(), std::swap(), llvm::APInt::udiv(), llvm::APInt::ult(), and llvm::Upper.
Referenced by SimplifyICmpInst().
|
static |
Simplify integer comparisons where at least one operand of the compare matches an integer min/max idiom.
Definition at line 2829 of file InstructionSimplify.cpp.
References A, B, llvm::CmpInst::BAD_ICMP_PREDICATE, C, D, ExtractEquivalentCondition(), GetCompareTy(), getFalse(), llvm::CmpInst::getInversePredicate(), llvm::CmpInst::getSwappedPredicate(), getTrue(), 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, llvm::PatternMatch::m_SMax(), llvm::PatternMatch::m_SMin(), llvm::PatternMatch::m_UMax(), llvm::PatternMatch::m_UMin(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), P, llvm::SimplifyICmpInst(), and std::swap().
Referenced by SimplifyICmpInst().
|
static |
Try hard to fold icmp with zero RHS because this is a common case.
Definition at line 2319 of file InstructionSimplify.cpp.
References llvm::ComputeSignBit(), GetCompareTy(), getFalse(), getTrue(), 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, llvm::isKnownNonZero(), llvm_unreachable, llvm::PatternMatch::m_Zero(), and llvm::PatternMatch::match().
Referenced by SimplifyICmpInst().
|
static |
Given operands for an InsertValueInst, see if we can fold the result.
If not, this returns null.
Definition at line 3864 of file InstructionSimplify.cpp.
References llvm::ConstantFoldInsertValueInstruction(), llvm::Value::getType(), llvm::PatternMatch::m_Undef(), and llvm::PatternMatch::match().
Referenced by llvm::SimplifyInsertValueInst().
|
static |
Definition at line 4251 of file InstructionSimplify.cpp.
References llvm::dyn_cast(), llvm::UndefValue::get(), llvm::Function::getIntrinsicID(), llvm::Constant::getNullValue(), llvm::Function::getReturnType(), IsIdempotent(), llvm::PatternMatch::m_Undef(), llvm::PatternMatch::m_Zero(), maskIsAllZeroOrUndef(), llvm::PatternMatch::match(), llvm::SignBitMustBeZero(), and SimplifyRelativeLoad().
Referenced by SimplifyCall().
|
static |
Given operands for an LShr, see if we can fold the result.
If not, this returns null.
Definition at line 1447 of file InstructionSimplify.cpp.
References llvm::PatternMatch::m_NUWShl(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), SimplifyRightShift(), and X.
Referenced by llvm::SimplifyLShrInst().
|
static |
Given operands for a Mul, see if we can fold the result.
If not, this returns null.
Definition at line 906 of file InstructionSimplify.cpp.
References llvm::MCID::Add, llvm::ConstantFoldBinaryOpOperands(), ExpandBinOp(), llvm::Constant::getNullValue(), llvm::Value::getType(), llvm::Type::isIntegerTy(), llvm::PatternMatch::m_Exact(), llvm::PatternMatch::m_IDiv(), llvm::PatternMatch::m_One(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_Undef(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::m_Zero(), llvm::PatternMatch::match(), llvm::SimplifyAndInst(), SimplifyAssociativeBinOp(), std::swap(), ThreadBinOpOverPHI(), ThreadBinOpOverSelect(), and X.
Referenced by llvm::SimplifyMulInst().
|
static |
Given operands for an Or, see if we can fold the result.
If not, this returns null.
Definition at line 1839 of file InstructionSimplify.cpp.
References A, llvm::APIntOps::And(), B, C, llvm::ConstantFoldBinaryOpOperands(), D, llvm::dyn_cast(), ExpandBinOp(), llvm::Constant::getAllOnesValue(), llvm::Value::getType(), llvm::ConstantInt::getValue(), llvm::PatternMatch::m_Add(), llvm::PatternMatch::m_AllOnes(), llvm::PatternMatch::m_And(), llvm::PatternMatch::m_Not(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_Undef(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::m_Zero(), llvm::MaskedValueIsZero(), llvm::PatternMatch::match(), llvm::APIntOps::Or(), SimplifyAssociativeBinOp(), SimplifyOrOfICmps(), std::swap(), ThreadBinOpOverPHI(), ThreadBinOpOverSelect(), and llvm::NVPTX::PTXLdStInstCode::V2.
Referenced by llvm::SimplifyOrInst().
Commuted variants are assumed to be handled by calling this function again with the parameters swapped.
Definition at line 1785 of file InstructionSimplify.cpp.
References llvm::User::getOperand(), getTrue(), llvm::Value::getType(), llvm::CmpInst::ICMP_SGE, llvm::CmpInst::ICMP_SGT, llvm::CmpInst::ICMP_SLE, llvm::CmpInst::ICMP_UGE, llvm::CmpInst::ICMP_UGT, llvm::CmpInst::ICMP_ULE, llvm::PatternMatch::m_Add(), llvm::PatternMatch::m_APInt(), llvm::PatternMatch::m_ICmp(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), simplifyOrOfICmpsWithSameOperands(), simplifyUnsignedRangeCheck(), and X.
Referenced by SimplifyOrInst().
Commuted variants are assumed to be handled by calling this function again with the parameters swapped.
Definition at line 1759 of file InstructionSimplify.cpp.
References A, B, llvm::CmpInst::getInversePredicate(), getTrue(), llvm::Value::getType(), llvm::CmpInst::ICMP_NE, llvm::CmpInst::ICMP_SGE, llvm::CmpInst::ICMP_SLE, llvm::CmpInst::ICMP_UGE, llvm::CmpInst::ICMP_ULE, llvm::CmpInst::isImpliedTrueByMatchingCmp(), llvm::CmpInst::isTrueWhenEqual(), llvm::PatternMatch::m_ICmp(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_Value(), and llvm::PatternMatch::match().
Referenced by SimplifyOrOfICmps().
See if we can fold the given phi. If not, returns null.
Definition at line 3967 of file InstructionSimplify.cpp.
References llvm::UndefValue::get(), llvm::Value::getType(), llvm::PHINode::incoming_values(), and ValueDominatesPHI().
Referenced by llvm::SCEVExpander::replaceCongruentIVs(), and llvm::SimplifyInstruction().
|
static |
Definition at line 4178 of file InstructionSimplify.cpp.
References C, llvm::ConstantFoldLoadFromConstPtr(), llvm::dyn_cast(), llvm::ConstantInt::get(), llvm::ConstantExpr::getBitCast(), llvm::Value::getContext(), llvm::ConstantExpr::getGetElementPtr(), llvm::Type::getInt32Ty(), llvm::Type::getInt64Ty(), llvm::Type::getInt8PtrTy(), llvm::User::getOperand(), llvm::Type::getPointerTo(), llvm::ConstantInt::getSExtValue(), Int32Ty, llvm::IsConstantOffsetFromGlobal(), and Offset.
Referenced by SimplifyIntrinsic().
|
static |
Given operands for an SRem or URem, see if we can fold the result.
If not, this returns null.
Definition at line 1179 of file InstructionSimplify.cpp.
References llvm::ConstantFoldBinaryOpOperands(), llvm::UndefValue::get(), llvm::Constant::getNullValue(), llvm::Value::getType(), llvm::Type::isIntegerTy(), llvm::PatternMatch::m_One(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_SRem(), llvm::PatternMatch::m_Undef(), llvm::PatternMatch::m_URem(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::m_Zero(), llvm::PatternMatch::match(), ThreadBinOpOverPHI(), and ThreadBinOpOverSelect().
Referenced by SimplifySRemInst(), and SimplifyURemInst().
|
static |
Given operands for an Shl, LShr or AShr, see if we can fold the result.
If not, this returns null.
Definition at line 1389 of file InstructionSimplify.cpp.
References llvm::computeKnownBits(), llvm::Constant::getNullValue(), llvm::Type::getScalarSizeInBits(), llvm::Value::getType(), llvm::PatternMatch::m_Undef(), llvm::PatternMatch::match(), and SimplifyShift().
Referenced by SimplifyAShrInst(), and SimplifyLShrInst().
|
static |
Given operands for an SDiv, see if we can fold the result.
If not, this returns null.
Definition at line 1086 of file InstructionSimplify.cpp.
References SimplifyDiv().
Referenced by llvm::SimplifySDivInst().
|
static |
Try to simplify a select instruction when its condition operand is an integer comparison where one operand of the compare is a constant.
Definition at line 3557 of file InstructionSimplify.cpp.
References C, llvm::APInt::isPowerOf2(), llvm::PatternMatch::m_And(), llvm::PatternMatch::m_APInt(), llvm::PatternMatch::m_Or(), llvm::PatternMatch::m_Specific(), and llvm::PatternMatch::match().
Referenced by simplifySelectWithFakeICmpEq(), and simplifySelectWithICmpCond().
|
static |
Given operands for a SelectInst, see if we can fold the result.
If not, this returns null.
Definition at line 3701 of file InstructionSimplify.cpp.
References simplifySelectWithICmpCond().
Referenced by llvm::SimplifySelectInst().
|
static |
An alternative way to test if a bit is set or not uses sgt/slt instead of eq/ne.
Definition at line 3592 of file InstructionSimplify.cpp.
References llvm::Type::getScalarSizeInBits(), llvm::APInt::getSignedMinValue(), llvm::Value::getType(), llvm::PatternMatch::m_Trunc(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), simplifySelectBitTest(), X, and llvm::APInt::zext().
Referenced by simplifySelectWithICmpCond().
|
static |
Try to simplify a select instruction when its condition operand is an integer comparison.
Definition at line 3622 of file InstructionSimplify.cpp.
References C, llvm::Value::hasOneUse(), llvm::CmpInst::ICMP_EQ, llvm::CmpInst::ICMP_NE, llvm::CmpInst::ICMP_SGT, llvm::CmpInst::ICMP_SLT, llvm::CmpInst::ICMP_UGT, llvm::CmpInst::ICMP_ULT, llvm::ICmpInst::isEquality(), llvm::APInt::isMaxSignedValue(), llvm::APInt::isMaxValue(), llvm::APInt::isMinSignedValue(), llvm::APInt::isMinValue(), llvm::PatternMatch::m_AllOnes(), llvm::PatternMatch::m_And(), llvm::PatternMatch::m_APInt(), llvm::PatternMatch::m_ICmp(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::m_Zero(), llvm::PatternMatch::match(), simplifySelectBitTest(), simplifySelectWithFakeICmpEq(), SimplifyWithOpReplaced(), X, and Y.
Referenced by SimplifySelectInst().
|
static |
Given operands for an Shl, LShr or AShr, see if we can fold the result.
If not, this returns null.
Definition at line 1338 of file InstructionSimplify.cpp.
References llvm::computeKnownBits(), llvm::ConstantFoldBinaryOpOperands(), llvm::UndefValue::get(), llvm::APInt::getLimitedValue(), llvm::APInt::getLowBitsSet(), llvm::Type::getScalarSizeInBits(), llvm::Value::getType(), isUndefShift(), llvm::Log2_32_Ceil(), llvm::PatternMatch::m_Zero(), llvm::PatternMatch::match(), ThreadBinOpOverPHI(), and ThreadBinOpOverSelect().
Referenced by SimplifyRightShift(), and SimplifyShlInst().
|
static |
Given operands for an Shl, see if we can fold the result.
If not, this returns null.
Definition at line 1420 of file InstructionSimplify.cpp.
References llvm::Constant::getNullValue(), llvm::Value::getType(), llvm::PatternMatch::m_Exact(), llvm::PatternMatch::m_Shr(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_Undef(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), SimplifyShift(), and X.
Referenced by llvm::SimplifyShlInst().
|
static |
Given operands for an SRem, see if we can fold the result.
If not, this returns null.
Definition at line 1237 of file InstructionSimplify.cpp.
References SimplifyRem().
Referenced by llvm::SimplifySRemInst().
|
static |
Given operands for a Sub, see if we can fold the result.
If not, this returns null.
Definition at line 666 of file InstructionSimplify.cpp.
References llvm::MCID::Add, llvm::computeKnownBits(), computePointerDifference(), llvm::ConstantFoldBinaryOpOperands(), llvm::UndefValue::get(), llvm::ConstantExpr::getIntegerCast(), llvm::Constant::getNullValue(), llvm::Type::getScalarSizeInBits(), llvm::APInt::getSignBit(), llvm::Value::getType(), llvm::Type::isIntegerTy(), llvm::PatternMatch::m_Add(), llvm::PatternMatch::m_PtrToInt(), llvm::PatternMatch::m_Sub(), llvm::PatternMatch::m_Trunc(), llvm::PatternMatch::m_Undef(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::m_Zero(), llvm::PatternMatch::match(), llvm::SimplifyBinOp(), llvm::SimplifyCastInst(), llvm::SimplifyXorInst(), X, and Y.
Referenced by llvm::SimplifySubInst().
|
static |
Given operands for a UDiv, see if we can fold the result.
If not, this returns null.
Definition at line 1104 of file InstructionSimplify.cpp.
References C, llvm::Constant::getNullValue(), llvm::Value::getType(), llvm::CmpInst::ICMP_ULT, SimplifyDiv(), and llvm::SimplifyICmpInst().
Referenced by llvm::SimplifyUDivInst().
|
static |
Definition at line 1504 of file InstructionSimplify.cpp.
References getFalse(), llvm::CmpInst::getSwappedPredicate(), getTrue(), llvm::Value::getType(), llvm::CmpInst::ICMP_EQ, llvm::CmpInst::ICMP_NE, llvm::CmpInst::ICMP_UGE, llvm::CmpInst::ICMP_ULT, llvm::ICmpInst::isEquality(), llvm::CmpInst::isUnsigned(), llvm::PatternMatch::m_ICmp(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::m_Zero(), llvm::PatternMatch::match(), X, and Y.
Referenced by SimplifyAndOfICmps(), and SimplifyOrOfICmps().
|
static |
Given operands for a URem, see if we can fold the result.
If not, this returns null.
Definition at line 1255 of file InstructionSimplify.cpp.
References C, llvm::CmpInst::ICMP_ULT, llvm::SimplifyICmpInst(), and SimplifyRem().
Referenced by llvm::SimplifyURemInst().
|
static |
See if V simplifies when its operand Op is replaced with RepOp.
Definition at line 3474 of file InstructionSimplify.cpp.
References B, C, llvm::ConstantFoldCompareInstOperands(), llvm::ConstantFoldInstOperands(), llvm::ConstantFoldLoadFromConstPtr(), llvm::dyn_cast(), I, i, llvm::SmallVectorTemplateBase< T, isPodLike< T >::value >::push_back(), llvm::SimplifyBinOp(), llvm::SimplifyCmpInst(), and llvm::SmallVectorTemplateCommon< T >::size().
Referenced by simplifySelectWithICmpCond().
|
static |
Given operands for a Xor, see if we can fold the result.
If not, this returns null.
Definition at line 1972 of file InstructionSimplify.cpp.
References llvm::ConstantFoldBinaryOpOperands(), llvm::Constant::getAllOnesValue(), llvm::Constant::getNullValue(), llvm::Value::getType(), llvm::PatternMatch::m_Not(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_Undef(), llvm::PatternMatch::m_Zero(), llvm::PatternMatch::match(), SimplifyAssociativeBinOp(), std::swap(), and llvm::APIntOps::Xor().
Referenced by llvm::SimplifyXorInst().
| STATISTIC | ( | NumExpand | , |
| "Number of expansions" | |||
| ) |
| STATISTIC | ( | NumReassoc | , |
| "Number of reassociations" | |||
| ) |
|
static |
Compute the base pointer and cumulative constant offsets for V.
This strips all constant offsets off of V, leaving it the base pointer, and accumulates the total constant offset applied in the returned constant. It returns 0 if V is not a pointer, and returns the constant '0' if there are no constant offsets applied.
This is very similar to GetPointerBaseWithConstantOffset except it doesn't follow non-inbounds geps. This allows it to remain usable for icmp ult/etc. folding.
Definition at line 603 of file InstructionSimplify.cpp.
References assert(), GEP, llvm::ConstantInt::get(), llvm::DataLayout::getIntPtrType(), llvm::APInt::getNullValue(), llvm::Operator::getOpcode(), llvm::Type::getScalarType(), llvm::ConstantVector::getSplat(), llvm::Value::getType(), llvm::Type::getVectorNumElements(), llvm::SmallPtrSetImpl< PtrType >::insert(), llvm::Type::isPointerTy(), llvm::Type::isVectorTy(), and Offset.
Referenced by computePointerDifference(), and computePointerICmp().
|
static |
In the case of a binary operation with an operand that is a PHI instruction, try to simplify the binop by seeing whether evaluating it on the incoming phi values yields the same result for every value.
If so returns the common value, otherwise returns null.
Definition at line 454 of file InstructionSimplify.cpp.
References assert(), llvm::PHINode::incoming_values(), llvm::SimplifyBinOp(), and ValueDominatesPHI().
Referenced by SimplifyAndInst(), SimplifyBinOp(), SimplifyDiv(), SimplifyMulInst(), SimplifyOrInst(), SimplifyRem(), and SimplifyShift().
|
static |
In the case of a binary operation with a select instruction as an operand, try to simplify the binop by seeing whether evaluating it on both branches of the select results in the same value.
Returns the common value if so, otherwise returns null.
Definition at line 301 of file InstructionSimplify.cpp.
References assert(), llvm::dyn_cast(), llvm::SelectInst::getFalseValue(), llvm::Instruction::getOpcode(), llvm::User::getOperand(), llvm::SelectInst::getTrueValue(), llvm::Instruction::isCommutative(), SI, llvm::JumpTable::Simplified, and llvm::SimplifyBinOp().
Referenced by SimplifyAndInst(), SimplifyBinOp(), SimplifyDiv(), SimplifyMulInst(), SimplifyOrInst(), SimplifyRem(), and SimplifyShift().
|
static |
In the case of a comparison with a PHI instruction, try to simplify the comparison by seeing whether comparing with all of the incoming phi values yields the same result every time.
If so returns the common result, otherwise returns null.
Definition at line 496 of file InstructionSimplify.cpp.
References assert(), llvm::CmpInst::getSwappedPredicate(), llvm::PHINode::incoming_values(), llvm::SimplifyCmpInst(), std::swap(), and ValueDominatesPHI().
Referenced by SimplifyFCmpInst(), and SimplifyICmpInst().
|
static |
In the case of a comparison with a select instruction, try to simplify the comparison by seeing whether both branches of the select result in the same value.
Returns the common value if so, otherwise returns null.
Definition at line 372 of file InstructionSimplify.cpp.
References assert(), llvm::Constant::getAllOnesValue(), llvm::SelectInst::getCondition(), getFalse(), llvm::SelectInst::getFalseValue(), llvm::CmpInst::getSwappedPredicate(), getTrue(), llvm::SelectInst::getTrueValue(), llvm::Value::getType(), isSameCompare(), llvm::Type::isVectorTy(), llvm::PatternMatch::m_One(), llvm::PatternMatch::m_Zero(), llvm::PatternMatch::match(), SI, llvm::SimplifyAndInst(), llvm::SimplifyCmpInst(), llvm::SimplifyOrInst(), llvm::SimplifyXorInst(), and std::swap().
Referenced by SimplifyFCmpInst(), and SimplifyICmpInst().
|
static |
Does the given value dominate the specified phi node?
Definition at line 108 of file InstructionSimplify.cpp.
References llvm::DominatorTree::dominates(), llvm::dyn_cast(), llvm::Function::getEntryBlock(), llvm::Instruction::getParent(), llvm::BasicBlock::getParent(), I, and llvm::DominatorTree::isReachableFromEntry().
Referenced by SimplifyPHINode(), ThreadBinOpOverPHI(), and ThreadCmpOverPHI().
1.8.6