LLVM API Documentation
#include "llvm/Analysis/InstructionSimplify.h"
#include "llvm/ADT/SetVector.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/Analysis/ConstantFolding.h"
#include "llvm/Analysis/Dominators.h"
#include "llvm/Analysis/ValueTracking.h"
#include "llvm/Analysis/MemoryBuiltins.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/GlobalAlias.h"
#include "llvm/IR/Operator.h"
#include "llvm/Support/ConstantRange.h"
#include "llvm/Support/GetElementPtrTypeIterator.h"
#include "llvm/Support/PatternMatch.h"
#include "llvm/Support/ValueHandle.h"
Go to the source code of this file.
Classes | |
struct | Query |
Macros | |
#define | DEBUG_TYPE "instsimplify" |
Enumerations | |
enum | { RecursionLimit = 3 } |
Functions | |
STATISTIC (NumExpand,"Number of expansions") | |
STATISTIC (NumFactor,"Number of factorizations") | |
STATISTIC (NumReassoc,"Number of reassociations") | |
static Value * | SimplifyAndInst (Value *, Value *, const Query &, unsigned) |
static Value * | SimplifyBinOp (unsigned, Value *, Value *, const Query &, unsigned) |
static Value * | SimplifyCmpInst (unsigned, Value *, Value *, const Query &, unsigned) |
static Value * | SimplifyOrInst (Value *, Value *, const Query &, unsigned) |
static Value * | SimplifyXorInst (Value *, Value *, const Query &, unsigned) |
static Value * | SimplifyTruncInst (Value *, Type *, const Query &, unsigned) |
static Constant * | getFalse (Type *Ty) |
static Constant * | getTrue (Type *Ty) |
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) |
ValueDominatesPHI - 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) |
static Value * | FactorizeBinOp (unsigned Opcode, Value *LHS, Value *RHS, unsigned OpcToExtract, const Query &Q, unsigned MaxRecurse) |
static Value * | SimplifyAssociativeBinOp (unsigned Opc, Value *LHS, Value *RHS, const Query &Q, unsigned MaxRecurse) |
static Value * | ThreadBinOpOverSelect (unsigned Opcode, Value *LHS, Value *RHS, const Query &Q, unsigned MaxRecurse) |
static Value * | ThreadCmpOverSelect (CmpInst::Predicate Pred, Value *LHS, Value *RHS, const Query &Q, unsigned MaxRecurse) |
static Value * | ThreadBinOpOverPHI (unsigned Opcode, Value *LHS, Value *RHS, const Query &Q, unsigned MaxRecurse) |
static Value * | ThreadCmpOverPHI (CmpInst::Predicate Pred, Value *LHS, Value *RHS, const Query &Q, unsigned MaxRecurse) |
static Value * | SimplifyAddInst (Value *Op0, Value *Op1, bool isNSW, bool isNUW, const Query &Q, unsigned MaxRecurse) |
static Constant * | stripAndComputeConstantOffsets (const DataLayout *TD, Value *&V, bool AllowNonInbounds=false) |
Compute the base pointer and cumulative constant offsets for V. More... | |
static Constant * | computePointerDifference (const DataLayout *TD, Value *LHS, Value *RHS) |
Compute the constant difference between two pointer values. If the difference is not a constant, returns zero. More... | |
static Value * | SimplifySubInst (Value *Op0, Value *Op1, bool isNSW, bool isNUW, const Query &Q, unsigned MaxRecurse) |
static Value * | SimplifyFAddInst (Value *Op0, Value *Op1, FastMathFlags FMF, const Query &Q, unsigned MaxRecurse) |
static Value * | SimplifyFSubInst (Value *Op0, Value *Op1, FastMathFlags FMF, const Query &Q, unsigned MaxRecurse) |
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) |
static Value * | SimplifyDiv (Instruction::BinaryOps Opcode, Value *Op0, Value *Op1, const Query &Q, unsigned MaxRecurse) |
static Value * | SimplifySDivInst (Value *Op0, Value *Op1, const Query &Q, unsigned MaxRecurse) |
static Value * | SimplifyUDivInst (Value *Op0, Value *Op1, const Query &Q, unsigned MaxRecurse) |
static Value * | SimplifyFDivInst (Value *Op0, Value *Op1, const Query &Q, unsigned) |
static Value * | SimplifyRem (Instruction::BinaryOps Opcode, Value *Op0, Value *Op1, const Query &Q, unsigned MaxRecurse) |
static Value * | SimplifySRemInst (Value *Op0, Value *Op1, const Query &Q, unsigned MaxRecurse) |
static Value * | SimplifyURemInst (Value *Op0, Value *Op1, const Query &Q, unsigned MaxRecurse) |
static Value * | SimplifyFRemInst (Value *Op0, Value *Op1, const Query &, unsigned) |
static Value * | SimplifyShift (unsigned Opcode, Value *Op0, Value *Op1, const Query &Q, unsigned MaxRecurse) |
static Value * | SimplifyShlInst (Value *Op0, Value *Op1, bool isNSW, bool isNUW, const Query &Q, unsigned MaxRecurse) |
static Value * | SimplifyLShrInst (Value *Op0, Value *Op1, bool isExact, const Query &Q, unsigned MaxRecurse) |
static Value * | SimplifyAShrInst (Value *Op0, Value *Op1, bool isExact, const Query &Q, unsigned MaxRecurse) |
static Type * | GetCompareTy (Value *Op) |
static Value * | ExtractEquivalentCondition (Value *V, CmpInst::Predicate Pred, Value *LHS, Value *RHS) |
static Constant * | computePointerICmp (const DataLayout *TD, const TargetLibraryInfo *TLI, CmpInst::Predicate Pred, Value *LHS, Value *RHS) |
static Value * | SimplifyICmpInst (unsigned Predicate, Value *LHS, Value *RHS, const Query &Q, unsigned MaxRecurse) |
static Value * | SimplifyFCmpInst (unsigned Predicate, Value *LHS, Value *RHS, const Query &Q, unsigned MaxRecurse) |
static Value * | SimplifySelectInst (Value *CondVal, Value *TrueVal, Value *FalseVal, const Query &Q, unsigned MaxRecurse) |
static Value * | SimplifyGEPInst (ArrayRef< Value * > Ops, const Query &Q, unsigned) |
static Value * | SimplifyInsertValueInst (Value *Agg, Value *Val, ArrayRef< unsigned > Idxs, const Query &Q, unsigned) |
static Value * | SimplifyPHINode (PHINode *PN, const Query &Q) |
SimplifyPHINode - See if we can fold the given phi. If not, returns null. More... | |
static bool | IsIdempotent (Intrinsic::ID ID) |
template<typename IterTy > | |
static Value * | SimplifyIntrinsic (Intrinsic::ID IID, 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 DataLayout *TD, const TargetLibraryInfo *TLI, const DominatorTree *DT) |
Implementation of recursive simplification through an instructions uses. More... | |
#define DEBUG_TYPE "instsimplify" |
Definition at line 20 of file InstructionSimplify.cpp.
anonymous enum |
Enumerator | |
---|---|
RecursionLimit |
Definition at line 38 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 715 of file InstructionSimplify.cpp.
References llvm::ConstantExpr::getSub(), and stripAndComputeConstantOffsets().
Referenced by SimplifySubInst().
|
static |
Definition at line 1733 of file InstructionSimplify.cpp.
References llvm::dyn_cast(), llvm::ConstantInt::get(), llvm::ConstantExpr::getAdd(), GetCompareTy(), llvm::ConstantExpr::getICmp(), llvm::getObjectSize(), llvm::ICmpInst::getSignedPredicate(), llvm::Value::getType(), 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::isKnownNonNull(), llvm::APInt::isNegative(), llvm::Constant::isNullValue(), llvm::CmpInst::isTrueWhenEqual(), stripAndComputeConstantOffsets(), llvm::Value::stripPointerCasts(), and llvm::APInt::ult().
Referenced by SimplifyICmpInst().
|
static |
ExpandBinOp - 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 128 of file InstructionSimplify.cpp.
References llvm::ARM_PROC::A, llvm::CallingConv::C, llvm::Instruction::isCommutative(), and llvm::SimplifyBinOp().
Referenced by SimplifyAndInst(), SimplifyMulInst(), and SimplifyOrInst().
|
static |
ExtractEquivalentCondition - 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 1688 of file InstructionSimplify.cpp.
References llvm::dyn_cast(), llvm::SelectInst::getCondition(), llvm::User::getOperand(), llvm::CmpInst::getPredicate(), and llvm::CmpInst::getSwappedPredicate().
Referenced by SimplifyICmpInst().
|
static |
FactorizeBinOp - Simplify "LHS Opcode RHS" by factorizing out a common term using the operation OpCodeToExtract. For example, when Opcode is Add and OpCodeToExtract is Mul then this tries to turn "(A*B)+(A*C)" into "A*(B+C)". Returns the simplified value, or null if no simplification was performed.
Definition at line 189 of file InstructionSimplify.cpp.
References llvm::ARM_PROC::A, llvm::CallingConv::C, llvm::X86II::DD, llvm::dyn_cast(), llvm::BinaryOperator::getOpcode(), llvm::User::getOperand(), llvm::Instruction::isCommutative(), and llvm::SimplifyBinOp().
Referenced by SimplifyAddInst(), SimplifyAndInst(), SimplifyOrInst(), SimplifySubInst(), and SimplifyXorInst().
Definition at line 1681 of file InstructionSimplify.cpp.
References llvm::Value::getType(), and llvm::CmpInst::makeCmpResultType().
Referenced by computePointerICmp(), SimplifyFCmpInst(), and SimplifyICmpInst().
getFalse - 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 64 of file InstructionSimplify.cpp.
References llvm::Constant::getNullValue(), llvm::Type::getScalarType(), and llvm::Type::isIntegerTy().
Referenced by SimplifyICmpInst(), and ThreadCmpOverSelect().
getTrue - 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 72 of file InstructionSimplify.cpp.
References llvm::Constant::getAllOnesValue(), llvm::Type::getScalarType(), and llvm::Type::isIntegerTy().
Referenced by SimplifyICmpInst(), and ThreadCmpOverSelect().
|
static |
Definition at line 2951 of file InstructionSimplify.cpp.
References llvm::Intrinsic::ceil, llvm::Intrinsic::fabs, llvm::Intrinsic::floor, llvm::Intrinsic::nearbyint, llvm::Intrinsic::rint, llvm::Intrinsic::round, and llvm::Intrinsic::trunc.
Referenced by SimplifyIntrinsic().
|
static |
isSameCompare - Is V equivalent to the comparison "LHS Pred RHS"?
Definition at line 79 of file InstructionSimplify.cpp.
References llvm::dyn_cast(), llvm::User::getOperand(), llvm::CmpInst::getPredicate(), and llvm::CmpInst::getSwappedPredicate().
Referenced by ThreadCmpOverSelect().
|
static |
Implementation of recursive simplification through an instructions 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 3170 of file InstructionSimplify.cpp.
References llvm::Instruction::eraseFromParent(), llvm::Instruction::getParent(), llvm::SetVector< T, SmallVector< T, N >, SmallSet< T, N > >::insert(), llvm::Value::replaceAllUsesWith(), llvm::SimplifyInstruction(), llvm::SetVector< T, SmallVector< T, N >, SmallSet< T, N > >::size(), llvm::Value::use_begin(), and llvm::Value::use_end().
Referenced by llvm::recursivelySimplifyInstruction(), and llvm::replaceAndRecursivelySimplify().
|
static |
SimplifyAddInst - Given operands for an Add, see if we can fold the result. If not, this returns null.
i1 add -> xor.
Definition at line 592 of file InstructionSimplify.cpp.
References llvm::ConstantFoldInstOperands(), FactorizeBinOp(), 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(), Query::TD, Query::TLI, and Y.
Referenced by llvm::SimplifyAddInst().
|
static |
SimplifyAndInst - Given operands for an And, see if we can fold the result. If not, this returns null.
Definition at line 1430 of file InstructionSimplify.cpp.
References llvm::ARM_PROC::A, llvm::APIntOps::And(), llvm::ConstantFoldInstOperands(), ExpandBinOp(), FactorizeBinOp(), llvm::Constant::getNullValue(), 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(), SimplifyAssociativeBinOp(), std::swap(), Query::TD, ThreadBinOpOverPHI(), ThreadBinOpOverSelect(), Query::TLI, and llvm::APIntOps::Xor().
Referenced by llvm::SimplifyAndInst().
|
static |
SimplifyAShrInst - Given operands for an AShr, see if we can fold the result. If not, this returns null.
Definition at line 1394 of file InstructionSimplify.cpp.
References llvm::Constant::getAllOnesValue(), llvm::Constant::getNullValue(), llvm::Value::getType(), llvm::PatternMatch::m_AllOnes(), llvm::PatternMatch::m_Shl(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_Undef(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), SimplifyShift(), and llvm::X.
Referenced by llvm::SimplifyAShrInst().
|
static |
SimplifyAssociativeBinOp - Generic simplifications for associative binary operations. Returns the simpler value, or null if none was found.
Definition at line 259 of file InstructionSimplify.cpp.
References llvm::ARM_PROC::A, llvm::CallingConv::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 |
SimplifyBinOp - Given operands for a BinaryOperator, see if we can fold the result. If not, this returns null.
Definition at line 2866 of file InstructionSimplify.cpp.
References llvm::APIntOps::And(), llvm::ConstantFoldInstOperands(), llvm::Value::getType(), 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(), Query::TD, ThreadBinOpOverPHI(), ThreadBinOpOverSelect(), Query::TLI, and llvm::APIntOps::Xor().
Referenced by llvm::SimplifyBinOp().
|
static |
Definition at line 2984 of file InstructionSimplify.cpp.
References llvm::CallingConv::C, llvm::canConstantFoldCallTo(), llvm::ConstantFoldCall(), llvm::dyn_cast(), F(), llvm::UndefValue::get(), llvm::Function::getIntrinsicID(), llvm::FunctionType::getReturnType(), llvm::Value::getType(), I, llvm::SmallVectorTemplateBase< T, isPodLike< T >::value >::push_back(), llvm::SmallVectorImpl< T >::reserve(), llvm::AArch64ISD::Ret, SimplifyIntrinsic(), and Query::TLI.
Referenced by llvm::SimplifyCall().
|
static |
SimplifyCmpInst - Given operands for a CmpInst, see if we can fold the result.
Definition at line 2937 of file InstructionSimplify.cpp.
References llvm::CmpInst::isIntPredicate(), llvm::SimplifyFCmpInst(), and llvm::SimplifyICmpInst().
Referenced by llvm::SimplifyCmpInst().
|
static |
SimplifyDiv - Given operands for an SDiv or UDiv, see if we can fold the result. If not, this returns null.
Definition at line 1065 of file InstructionSimplify.cpp.
References llvm::ConstantFoldInstOperands(), llvm::ConstantInt::get(), llvm::Constant::getNullValue(), llvm::Value::getType(), llvm::OverflowingBinaryOperator::hasNoSignedWrap(), llvm::OverflowingBinaryOperator::hasNoUnsignedWrap(), llvm::Type::isIntegerTy(), llvm::PatternMatch::m_Mul(), 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(), std::swap(), Query::TD, ThreadBinOpOverPHI(), ThreadBinOpOverSelect(), Query::TLI, llvm::X, and Y.
Referenced by SimplifySDivInst(), and SimplifyUDivInst().
|
static |
Given operands for an FAdd, see if we can fold the result. If not, this returns null.
Definition at line 868 of file InstructionSimplify.cpp.
References llvm::CannotBeNegativeZero(), llvm::ConstantFoldInstOperands(), 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(), std::swap(), Query::TD, and Query::TLI.
Referenced by llvm::SimplifyFAddInst().
|
static |
SimplifyFCmpInst - Given operands for an FCmpInst, see if we can fold the result. If not, this returns null.
Definition at line 2600 of file InstructionSimplify.cpp.
References llvm::ConstantFoldCompareInstOperands(), llvm::CmpInst::FCMP_FALSE, llvm::CmpInst::FCMP_OGT, llvm::CmpInst::FCMP_OLT, llvm::CmpInst::FCMP_TRUE, llvm::CmpInst::FCMP_UGE, llvm::CmpInst::FCMP_ULE, llvm::ConstantInt::get(), llvm::UndefValue::get(), GetCompareTy(), llvm::ConstantInt::getFalse(), llvm::CmpInst::getSwappedPredicate(), llvm::ConstantInt::getTrue(), llvm::CmpInst::isFalseWhenEqual(), llvm::CmpInst::isFPPredicate(), llvm::CmpInst::isOrdered(), llvm::CmpInst::isTrueWhenEqual(), llvm::CmpInst::isUnordered(), std::swap(), Query::TD, ThreadCmpOverPHI(), ThreadCmpOverSelect(), and Query::TLI.
Referenced by llvm::SimplifyFCmpInst().
Definition at line 1167 of file InstructionSimplify.cpp.
References llvm::PatternMatch::m_Undef(), and llvm::PatternMatch::match().
Referenced by llvm::SimplifyFDivInst().
|
static |
Given the operands for an FMul, see if we can fold the result.
Definition at line 946 of file InstructionSimplify.cpp.
References llvm::ConstantFoldInstOperands(), llvm::PatternMatch::m_AnyZero(), llvm::PatternMatch::m_FPOne(), llvm::PatternMatch::match(), llvm::FastMathFlags::noNaNs(), llvm::FastMathFlags::noSignedZeros(), std::swap(), Query::TD, and Query::TLI.
Referenced by llvm::SimplifyFMulInst().
Definition at line 1272 of file InstructionSimplify.cpp.
References llvm::PatternMatch::m_Undef(), and llvm::PatternMatch::match().
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 910 of file InstructionSimplify.cpp.
References llvm::CannotBeNegativeZero(), llvm::ConstantFoldInstOperands(), 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::noInfs(), llvm::FastMathFlags::noNaNs(), llvm::FastMathFlags::noSignedZeros(), Query::TD, Query::TLI, and llvm::X.
Referenced by llvm::SimplifyFSubInst().
SimplifyGEPInst - Given operands for an GetElementPtrInst, see if we can fold the result. If not, this returns null.
Definition at line 2732 of file InstructionSimplify.cpp.
References llvm::CallingConv::C, llvm::dyn_cast(), llvm::PointerType::get(), llvm::UndefValue::get(), llvm::PointerType::getAddressSpace(), llvm::SequentialType::getElementType(), llvm::ConstantExpr::getGetElementPtr(), llvm::GetElementPtrInst::getIndexedType(), llvm::DataLayout::getTypeAllocSize(), llvm::Type::isSized(), llvm::ArrayRef< T >::size(), llvm::ArrayRef< T >::slice(), and Query::TD.
Referenced by llvm::SimplifyGEPInst().
|
static |
SimplifyICmpInst - Given operands for an ICmpInst, see if we can fold the result. If not, this returns null.
Definition at line 1861 of file InstructionSimplify.cpp.
References llvm::ARM_PROC::A, llvm::APInt::abs(), llvm::APInt::ashr(), llvm::CmpInst::BAD_ICMP_PREDICATE, llvm::CallingConv::C, computePointerICmp(), llvm::ComputeSignBit(), llvm::ConstantFoldCompareInstOperands(), llvm::ConstantRange::contains(), llvm::dyn_cast(), ExtractEquivalentCondition(), llvm::ConstantInt::get(), llvm::APInt::getAllOnesValue(), llvm::ConstantInt::getBitWidth(), llvm::ConstantExpr::getCast(), GetCompareTy(), llvm::Value::getContext(), llvm::ConstantInt::getFalse(), getFalse(), llvm::ConstantExpr::getGetElementPtr(), llvm::ConstantExpr::getICmp(), llvm::ConstantExpr::getIntToPtr(), llvm::CmpInst::getInversePredicate(), llvm::Constant::getNullValue(), llvm::BinaryOperator::getOpcode(), llvm::User::getOperand(), llvm::Type::getPrimitiveSizeInBits(), llvm::Type::getScalarType(), llvm::APInt::getSignedMaxValue(), llvm::APInt::getSignedMinValue(), llvm::ICmpInst::getSignedPredicate(), llvm::CmpInst::getSwappedPredicate(), llvm::ConstantInt::getTrue(), getTrue(), llvm::ConstantExpr::getTrunc(), llvm::Value::getType(), llvm::DataLayout::getTypeSizeInBits(), llvm::ICmpInst::getUnsignedPredicate(), llvm::ConstantInt::getValue(), llvm::BinaryOperator::hasNoSignedWrap(), llvm::BinaryOperator::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::ConstantRange::inverse(), llvm::ConstantRange::isEmptySet(), llvm::ICmpInst::isEquality(), llvm::BinaryOperator::isExact(), llvm::ConstantRange::isFullSet(), llvm::Type::isIntegerTy(), llvm::CmpInst::isIntPredicate(), llvm::isKnownNonZero(), llvm::APInt::isMinValue(), llvm::Type::isPointerTy(), llvm::CmpInst::isSigned(), llvm::CmpInst::isTrueWhenEqual(), llvm::CmpInst::isUnsigned(), llvm::ConstantInt::isZero(), LI, llvm_unreachable, llvm::APInt::lshr(), llvm::PatternMatch::m_And(), llvm::PatternMatch::m_AShr(), llvm::PatternMatch::m_ConstantInt(), llvm::PatternMatch::m_LShr(), llvm::PatternMatch::m_One(), llvm::PatternMatch::m_Or(), llvm::PatternMatch::m_SDiv(), llvm::PatternMatch::m_SMax(), llvm::PatternMatch::m_SMin(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_SRem(), llvm::PatternMatch::m_UDiv(), llvm::PatternMatch::m_UMax(), llvm::PatternMatch::m_UMin(), llvm::PatternMatch::m_URem(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::m_Zero(), llvm::ICmpInst::makeConstantRange(), llvm::PatternMatch::match(), P, llvm::APInt::sdiv(), llvm::SimplifyICmpInst(), std::swap(), Query::TD, ThreadCmpOverPHI(), ThreadCmpOverSelect(), Query::TLI, llvm::APInt::udiv(), llvm::APInt::ult(), and Y.
Referenced by llvm::SimplifyICmpInst().
|
static |
SimplifyInsertValueInst - Given operands for an InsertValueInst, see if we can fold the result. If not, this returns null.
Definition at line 2779 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 2968 of file InstructionSimplify.cpp.
References IsIdempotent().
Referenced by SimplifyCall().
|
static |
SimplifyLShrInst - Given operands for an LShr, see if we can fold the result. If not, this returns null.
Definition at line 1362 of file InstructionSimplify.cpp.
References llvm::Constant::getNullValue(), llvm::Value::getType(), llvm::PatternMatch::m_Shl(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_Undef(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), SimplifyShift(), and llvm::X.
Referenced by llvm::SimplifyLShrInst().
|
static |
SimplifyMulInst - Given operands for a Mul, see if we can fold the result. If not, this returns null.
Definition at line 974 of file InstructionSimplify.cpp.
References llvm::ConstantFoldInstOperands(), 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(), Query::TD, ThreadBinOpOverPHI(), ThreadBinOpOverSelect(), Query::TLI, and llvm::X.
Referenced by llvm::SimplifyMulInst().
|
static |
SimplifyOrInst - Given operands for an Or, see if we can fold the result. If not, this returns null.
Definition at line 1529 of file InstructionSimplify.cpp.
References llvm::ARM_PROC::A, llvm::APIntOps::And(), llvm::ConstantFoldInstOperands(), ExpandBinOp(), FactorizeBinOp(), llvm::Constant::getAllOnesValue(), llvm::Value::getType(), 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::PatternMatch::match(), llvm::APIntOps::Or(), SimplifyAssociativeBinOp(), std::swap(), Query::TD, ThreadBinOpOverPHI(), ThreadBinOpOverSelect(), and Query::TLI.
Referenced by llvm::SimplifyOrInst().
SimplifyPHINode - See if we can fold the given phi. If not, returns null.
Definition at line 2816 of file InstructionSimplify.cpp.
References Query::DT, llvm::UndefValue::get(), llvm::PHINode::getIncomingValue(), llvm::PHINode::getNumIncomingValues(), llvm::Value::getType(), and ValueDominatesPHI().
Referenced by llvm::SimplifyInstruction().
|
static |
SimplifyRem - Given operands for an SRem or URem, see if we can fold the result. If not, this returns null.
Definition at line 1188 of file InstructionSimplify.cpp.
References llvm::ConstantFoldInstOperands(), llvm::UndefValue::get(), llvm::Constant::getNullValue(), llvm::Value::getType(), llvm::Type::isIntegerTy(), llvm::PatternMatch::m_One(), llvm::PatternMatch::m_Undef(), llvm::PatternMatch::m_Zero(), llvm::PatternMatch::match(), Query::TD, ThreadBinOpOverPHI(), ThreadBinOpOverSelect(), and Query::TLI.
Referenced by SimplifySRemInst(), and SimplifyURemInst().
|
static |
SimplifySDivInst - Given operands for an SDiv, see if we can fold the result. If not, this returns null.
Definition at line 1137 of file InstructionSimplify.cpp.
References SimplifyDiv().
Referenced by llvm::SimplifySDivInst().
|
static |
SimplifySelectInst - Given operands for a SelectInst, see if we can fold the result. If not, this returns null.
Definition at line 2697 of file InstructionSimplify.cpp.
Referenced by llvm::SimplifySelectInst().
|
static |
SimplifyShift - Given operands for an Shl, LShr or AShr, see if we can fold the result. If not, this returns null.
Definition at line 1293 of file InstructionSimplify.cpp.
References llvm::ConstantFoldInstOperands(), llvm::UndefValue::get(), llvm::Type::getScalarSizeInBits(), llvm::Value::getType(), llvm::PatternMatch::m_Undef(), llvm::PatternMatch::m_Zero(), llvm::PatternMatch::match(), Query::TD, ThreadBinOpOverPHI(), ThreadBinOpOverSelect(), and Query::TLI.
Referenced by SimplifyAShrInst(), SimplifyLShrInst(), and SimplifyShlInst().
|
static |
SimplifyShlInst - Given operands for an Shl, see if we can fold the result. If not, this returns null.
Definition at line 1337 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 llvm::X.
Referenced by llvm::SimplifyShlInst().
|
static |
SimplifySRemInst - Given operands for an SRem, see if we can fold the result. If not, this returns null.
Definition at line 1242 of file InstructionSimplify.cpp.
References SimplifyRem().
Referenced by llvm::SimplifySRemInst().
|
static |
SimplifySubInst - Given operands for a Sub, see if we can fold the result. If not, this returns null.
Definition at line 734 of file InstructionSimplify.cpp.
References computePointerDifference(), llvm::ConstantFoldInstOperands(), FactorizeBinOp(), llvm::UndefValue::get(), llvm::ConstantExpr::getIntegerCast(), llvm::Constant::getNullValue(), llvm::Value::getType(), llvm::Type::isIntegerTy(), llvm::PatternMatch::m_Add(), llvm::PatternMatch::m_Mul(), llvm::PatternMatch::m_One(), llvm::PatternMatch::m_PtrToInt(), llvm::PatternMatch::m_Shl(), llvm::PatternMatch::m_Specific(), 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::SimplifyTruncInst(), llvm::SimplifyXorInst(), Query::TD, Query::TLI, llvm::X, and Y.
Referenced by llvm::SimplifySubInst().
Definition at line 2849 of file InstructionSimplify.cpp.
References llvm::CallingConv::C, llvm::ConstantFoldInstOperands(), Query::TD, and Query::TLI.
Referenced by llvm::SimplifyTruncInst().
|
static |
SimplifyUDivInst - Given operands for a UDiv, see if we can fold the result. If not, this returns null.
Definition at line 1153 of file InstructionSimplify.cpp.
References SimplifyDiv().
Referenced by llvm::SimplifyUDivInst().
|
static |
SimplifyURemInst - Given operands for a URem, see if we can fold the result. If not, this returns null.
Definition at line 1258 of file InstructionSimplify.cpp.
References SimplifyRem().
Referenced by llvm::SimplifyURemInst().
|
static |
SimplifyXorInst - Given operands for a Xor, see if we can fold the result. If not, this returns null.
Definition at line 1623 of file InstructionSimplify.cpp.
References llvm::APIntOps::And(), llvm::ConstantFoldInstOperands(), FactorizeBinOp(), 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(), Query::TD, Query::TLI, and llvm::APIntOps::Xor().
Referenced by llvm::SimplifyXorInst().
STATISTIC | ( | NumExpand | , |
"Number of expansions" | |||
) |
STATISTIC | ( | NumFactor | , |
"Number of factorizations" | |||
) |
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 670 of file InstructionSimplify.cpp.
References llvm::IntegerType::get(), llvm::ConstantInt::get(), llvm::Value::getContext(), llvm::Type::getIntegerBitWidth(), llvm::DataLayout::getIntPtrType(), llvm::APInt::getNullValue(), llvm::Operator::getOpcode(), llvm::Type::getScalarType(), llvm::ConstantVector::getSplat(), llvm::Value::getType(), llvm::Type::getVectorNumElements(), llvm::SmallPtrSet< PtrType, SmallSize >::insert(), llvm::Type::isPointerTy(), and llvm::Type::isVectorTy().
Referenced by computePointerDifference(), and computePointerICmp().
|
static |
ThreadBinOpOverPHI - 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 512 of file InstructionSimplify.cpp.
References Query::DT, llvm::PHINode::getIncomingValue(), llvm::PHINode::getNumIncomingValues(), llvm::SimplifyBinOp(), and ValueDominatesPHI().
Referenced by SimplifyAndInst(), SimplifyBinOp(), SimplifyDiv(), SimplifyMulInst(), SimplifyOrInst(), SimplifyRem(), and SimplifyShift().
|
static |
ThreadBinOpOverSelect - 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 358 of file InstructionSimplify.cpp.
References llvm::dyn_cast(), llvm::SelectInst::getFalseValue(), llvm::Instruction::getOpcode(), llvm::User::getOperand(), llvm::SelectInst::getTrueValue(), llvm::Instruction::isCommutative(), and llvm::SimplifyBinOp().
Referenced by SimplifyAndInst(), SimplifyBinOp(), SimplifyDiv(), SimplifyMulInst(), SimplifyOrInst(), SimplifyRem(), and SimplifyShift().
|
static |
ThreadCmpOverPHI - In the case of a comparison with a PHI instruction, try 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 555 of file InstructionSimplify.cpp.
References Query::DT, llvm::PHINode::getIncomingValue(), llvm::PHINode::getNumIncomingValues(), llvm::CmpInst::getSwappedPredicate(), llvm::SimplifyCmpInst(), std::swap(), and ValueDominatesPHI().
Referenced by SimplifyFCmpInst(), and SimplifyICmpInst().
|
static |
ThreadCmpOverSelect - 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 430 of file InstructionSimplify.cpp.
References 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(), llvm::SimplifyAndInst(), llvm::SimplifyCmpInst(), llvm::SimplifyOrInst(), llvm::SimplifyXorInst(), and std::swap().
Referenced by SimplifyFCmpInst(), and SimplifyICmpInst().
|
static |
ValueDominatesPHI - Does the given value dominate the specified phi node?
Definition at line 93 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().