LLVM: lib/Transforms/InstCombine/InstCombineAddSub.cpp File Reference (original) (raw)

Go to the source code of this file.

Functions
static Value * checkForNegativeOperand (BinaryOperator &I, InstCombiner::BuilderTy &Builder)
static Instruction * foldNoWrapAdd (BinaryOperator &Add, InstCombiner::BuilderTy &Builder)
Wrapping flags may allow combining constants separated by an extend.
template<bool FP, typename Mul2Rhs >
static bool matchesSquareSum (BinaryOperator &I, Mul2Rhs M2Rhs, Value *&A, Value *&B)
static bool MatchMul (Value *E, Value *&Op, APInt &C)
static bool MatchRem (Value *E, Value *&Op, APInt &C, bool &IsSigned)
static bool MatchDiv (Value *E, Value *&Op, APInt &C, bool IsSigned)
static bool MulWillOverflow (APInt &C0, APInt &C1, bool IsSigned)
static Instruction * canonicalizeLowbitMask (BinaryOperator &I, InstCombiner::BuilderTy &Builder)
Fold (1 << NBits) - 1 Into: ~(-(1 << NBits)) Because a 'not' is better for bit-tracking analysis and other transforms than an 'add'.
static Instruction * foldToUnsignedSaturatedAdd (BinaryOperator &I)
static Instruction * combineAddSubWithShlAddSub (InstCombiner::BuilderTy &Builder, const BinaryOperator &I)
static Instruction * foldAddToAshr (BinaryOperator &Add)
Try to reduce signed division by power-of-2 to an arithmetic shift right.
static Instruction * factorizeMathWithShlOps (BinaryOperator &I, InstCombiner::BuilderTy &Builder)
This is a specialization of a more general transform from foldUsingDistributiveLaws.
static Instruction * foldBoxMultiply (BinaryOperator &I)
Reduce a sequence of masked half-width multiplies to a single multiply.
static Instruction * factorizeLerp (BinaryOperator &I, InstCombiner::BuilderTy &Builder)
Eliminate an op from a linear interpolation (lerp) pattern.
static Instruction * factorizeFAddFSub (BinaryOperator &I, InstCombiner::BuilderTy &Builder)
Factor a common operand out of fadd/fsub of fmul/fdiv.
static Instruction * foldSubOfMinMax (BinaryOperator &I, InstCombiner::BuilderTy &Builder)
static Instruction * foldFNegIntoConstant (Instruction &I, const DataLayout &DL)
This eliminates floating-point negation in either 'fneg(X)' or 'fsub(-0.0, X)' form by combining into a constant operand.

DEBUG_TYPE

#define DEBUG_TYPE "instcombine"

canonicalizeLowbitMask()

Fold (1 << NBits) - 1 Into: ~(-(1 << NBits)) Because a 'not' is better for bit-tracking analysis and other transforms than an 'add'.

The new shl is always nsw, and is nuw if old and was.

Definition at line 1219 of file InstCombineAddSub.cpp.

References llvm::BinaryOperator::CreateNot(), llvm::IRBuilderBase::CreateShl(), llvm::Constant::getAllOnesValue(), llvm::Value::getType(), I, llvm::PatternMatch::m_Add(), llvm::PatternMatch::m_AllOnes(), llvm::PatternMatch::m_One(), llvm::PatternMatch::m_OneUse(), llvm::PatternMatch::m_Shl(), llvm::PatternMatch::m_Value(), and llvm::PatternMatch::match().

Referenced by llvm::InstCombinerImpl::visitAdd().

checkForNegativeOperand()

Definition at line 752 of file InstCombineAddSub.cpp.

References llvm::APInt::countr_zero(), llvm::IRBuilderBase::CreateAnd(), llvm::IRBuilderBase::CreateOr(), llvm::IRBuilderBase::CreateSub(), llvm::Value::hasOneUse(), I, LHS, llvm::PatternMatch::m_Add(), llvm::PatternMatch::m_And(), llvm::PatternMatch::m_APInt(), llvm::PatternMatch::m_One(), llvm::PatternMatch::m_Or(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::m_Xor(), llvm::PatternMatch::match(), RHS, std::swap(), X, and Y.

Referenced by llvm::InstCombinerImpl::visitAdd().

combineAddSubWithShlAddSub()

factorizeFAddFSub()

Factor a common operand out of fadd/fsub of fmul/fdiv.

Definition at line 1913 of file InstCombineAddSub.cpp.

References assert(), llvm::CallingConv::C, llvm::IRBuilderBase::CreateFAddFMF(), llvm::BinaryOperator::CreateFDivFMF(), llvm::BinaryOperator::CreateFMulFMF(), llvm::IRBuilderBase::CreateFSubFMF(), factorizeLerp(), llvm::Value::hasOneUse(), I, llvm::PatternMatch::m_APFloat(), llvm::PatternMatch::m_c_FMul(), llvm::PatternMatch::m_FDiv(), llvm::PatternMatch::m_FMul(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), X, and Y.

Referenced by llvm::InstCombinerImpl::visitFAdd(), and llvm::InstCombinerImpl::visitFSub().

factorizeLerp()

Eliminate an op from a linear interpolation (lerp) pattern.

Definition at line 1897 of file InstCombineAddSub.cpp.

References llvm::BinaryOperator::CreateFAddFMF(), llvm::IRBuilderBase::CreateFMulFMF(), llvm::IRBuilderBase::CreateFSubFMF(), I, llvm::PatternMatch::m_c_FAdd(), llvm::PatternMatch::m_c_FMul(), llvm::PatternMatch::m_Deferred(), llvm::PatternMatch::m_FPOne(), llvm::PatternMatch::m_FSub(), llvm::PatternMatch::m_OneUse(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), X, and Y.

Referenced by factorizeFAddFSub().

factorizeMathWithShlOps()

This is a specialization of a more general transform from foldUsingDistributiveLaws.

If that code can be made to work optimally for multi-use cases or propagating nsw/nuw, then we would not need this.

Definition at line 1444 of file InstCombineAddSub.cpp.

References assert(), llvm::IRBuilderBase::CreateBinOp(), I, llvm::PatternMatch::m_Shl(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), X, and Y.

Referenced by llvm::InstCombinerImpl::visitAdd(), and llvm::InstCombinerImpl::visitSub().

foldAddToAshr()

Try to reduce signed division by power-of-2 to an arithmetic shift right.

Definition at line 1276 of file InstCombineAddSub.cpp.

References llvm::Add, llvm::APInt::exactLogBase2(), llvm::APInt::getSignedMinValue(), llvm::CmpInst::ICMP_EQ, llvm::CmpInst::ICMP_UGT, llvm::APInt::isNegative(), llvm::APInt::isSignMask(), llvm::PatternMatch::m_And(), llvm::PatternMatch::m_APInt(), llvm::PatternMatch::m_ICmp(), llvm::PatternMatch::m_Power2(), llvm::PatternMatch::m_SDiv(), llvm::PatternMatch::m_SExt(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), llvm::SMin, and X.

Referenced by llvm::InstCombinerImpl::visitAdd().

foldBoxMultiply()

Reduce a sequence of masked half-width multiplies to a single multiply.

((XLow * YHigh) + (YLow * XHigh)) << HalfBits) + (XLow * YLow) --> X * Y

Definition at line 1480 of file InstCombineAddSub.cpp.

References llvm::BitWidth, llvm::APInt::getMaxValue(), I, llvm::PatternMatch::m_And(), llvm::PatternMatch::m_c_Add(), llvm::PatternMatch::m_c_Mul(), llvm::PatternMatch::m_CombineOr(), llvm::PatternMatch::m_LShr(), llvm::PatternMatch::m_Mul(), llvm::PatternMatch::m_OneUse(), llvm::PatternMatch::m_Shl(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_SpecificInt(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), X, and Y.

Referenced by llvm::InstCombinerImpl::visitAdd().

foldFNegIntoConstant()

This eliminates floating-point negation in either 'fneg(X)' or 'fsub(-0.0, X)' form by combining into a constant operand.

Definition at line 2797 of file InstCombineAddSub.cpp.

References llvm::CallingConv::C, llvm::ConstantFoldUnaryOpOperand(), llvm::BinaryOperator::CreateFDivFMF(), llvm::BinaryOperator::CreateFMulFMF(), llvm::BinaryOperator::CreateFSubFMF(), DL, llvm::Instruction::getFastMathFlags(), I, llvm::PatternMatch::m_Constant(), llvm::PatternMatch::m_FAdd(), llvm::PatternMatch::m_FDiv(), llvm::PatternMatch::m_FMul(), llvm::PatternMatch::m_FNeg(), llvm::PatternMatch::m_Instruction(), llvm::PatternMatch::m_OneUse(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), llvm::FastMathFlags::noInfs(), llvm::FastMathFlags::noSignedZeros(), llvm::Instruction::setHasNoInfs(), llvm::Instruction::setHasNoSignedZeros(), and X.

Referenced by llvm::InstCombinerImpl::visitFNeg(), and llvm::InstCombinerImpl::visitFSub().

foldNoWrapAdd()

Wrapping flags may allow combining constants separated by an extend.

Definition at line 809 of file InstCombineAddSub.cpp.

References llvm::Add, llvm::IRBuilderBase::CreateAdd(), llvm::IRBuilderBase::CreateNUWAdd(), llvm::IRBuilderBase::CreateSExt(), llvm::IRBuilderBase::CreateZExt(), llvm::APInt::getBitWidth(), llvm::Value::hasOneUse(), llvm::APInt::isNegative(), llvm::APInt::isZero(), llvm::PatternMatch::m_APInt(), llvm::PatternMatch::m_Constant(), llvm::PatternMatch::m_NSWAddLike(), llvm::PatternMatch::m_NUWAddLike(), llvm::PatternMatch::m_OneUse(), llvm::PatternMatch::m_SExtLike(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::m_ZExt(), llvm::PatternMatch::match(), llvm::APInt::sext(), llvm::APInt::sge(), llvm::APInt::trunc(), and X.

Referenced by llvm::InstCombinerImpl::visitAdd().

foldSubOfMinMax()

Definition at line 2140 of file InstCombineAddSub.cpp.

References llvm::CallInst::Create(), llvm::IRBuilderBase::CreateIntrinsic(), F, llvm::getInverseMinMaxIntrinsic(), llvm::Intrinsic::getOrInsertDeclaration(), llvm::Value::hasOneUse(), I, llvm::PatternMatch::m_c_Add(), llvm::PatternMatch::m_NSWSub(), llvm::PatternMatch::m_OneUse(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_UMin(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::m_ZeroInt(), llvm::PatternMatch::match(), X, and Y.

Referenced by llvm::InstCombinerImpl::visitSub().

foldToUnsignedSaturatedAdd()

Definition at line 1237 of file InstCombineAddSub.cpp.

References assert(), llvm::CallingConv::C, llvm::CallInst::Create(), llvm::Intrinsic::getOrInsertDeclaration(), I, llvm::PatternMatch::m_Add(), llvm::PatternMatch::m_APInt(), llvm::PatternMatch::m_c_Add(), llvm::PatternMatch::m_c_UMin(), llvm::PatternMatch::m_Deferred(), llvm::PatternMatch::m_Not(), llvm::PatternMatch::m_UMin(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), X, and Y.

Referenced by llvm::InstCombinerImpl::visitAdd().

MatchDiv()

matchesSquareSum()

template<bool FP, typename Mul2Rhs >

Definition at line 1025 of file InstCombineAddSub.cpp.

References A, B, FP, I, llvm::PatternMatch::m_BinOp(), llvm::PatternMatch::m_c_BinOp(), llvm::PatternMatch::m_CombineOr(), llvm::PatternMatch::m_Deferred(), llvm::PatternMatch::m_OneUse(), llvm::PatternMatch::m_Value(), and llvm::PatternMatch::match().

MatchMul()

MatchRem()

MulWillOverflow()