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

Go to the source code of this file.

Macros
#define DEBUG_TYPE "instcombine"
Functions
STATISTIC (NumSimplified, "Number of library calls simplified")
static Type * getPromotedType (Type *Ty)
Return the specified type promoted as it would be to pass though a va_arg area.
static bool hasUndefSource (AnyMemTransferInst *MI)
Recognize a memcpy/memmove from a trivially otherwise unused alloca.
static Instruction * simplifyInvariantGroupIntrinsic (IntrinsicInst &II, InstCombinerImpl &IC)
This function transforms launder.invariant.group and strip.invariant.group like: launder(launder(x)) -> launder(x) (the result is not the argument) launder(strip(x)) -> launder(x) strip(strip(x)) -> strip(x) (the result is not the argument) strip(launder(x)) -> strip(x) This is legal because it preserves the most recent information about the presence or absence of invariant.group.
static Instruction * foldCttzCtlz (IntrinsicInst &II, InstCombinerImpl &IC)
static Instruction * foldCtpop (IntrinsicInst &II, InstCombinerImpl &IC)
static Value * simplifyNeonTbl1 (const IntrinsicInst &II, InstCombiner::BuilderTy &Builder)
Convert a table lookup to shufflevector if the mask is constant.
static bool haveSameOperands (const IntrinsicInst &I, const IntrinsicInst &E, unsigned NumOperands)
static bool removeTriviallyEmptyRange (IntrinsicInst &EndI, InstCombinerImpl &IC, std::function< bool(const IntrinsicInst &)> IsStart)
static CallInst * canonicalizeConstantArg0ToArg1 (CallInst &Call)
static Instruction * createOverflowTuple (IntrinsicInst *II, Value *Result, Constant *Overflow)
Creates a result tuple for an overflow intrinsic II with a given Result and a constant Overflow value.
static bool inputDenormalIsIEEE (const Function &F, const Type *Ty)
static bool inputDenormalIsDAZ (const Function &F, const Type *Ty)
static FCmpInst::Predicate fpclassTestIsFCmp0 (FPClassTest Mask, const Function &F, Type *Ty)
static std::optional< bool > getKnownSign (Value *Op, const SimplifyQuery &SQ)
static std::optional< bool > getKnownSignOrZero (Value *Op, const SimplifyQuery &SQ)
static bool signBitMustBeTheSame (Value *Op0, Value *Op1, const SimplifyQuery &SQ)
Return true if two values Op0 and Op1 are known to have the same sign.
static Instruction * moveAddAfterMinMax (IntrinsicInst *II, InstCombiner::BuilderTy &Builder)
Try to canonicalize min/max(X + C0, C1) as min/max(X, C1 - C0) + C0.
static Instruction * foldClampRangeOfTwo (IntrinsicInst *II, InstCombiner::BuilderTy &Builder)
If we have a clamp pattern like max (min X, 42), 41 – where the output can only be one of two possible constant values – turn that into a select of constants.
static Value * reassociateMinMaxWithConstants (IntrinsicInst *II, IRBuilderBase &Builder, const SimplifyQuery &SQ)
If this min/max has a constant operand and an operand that is a matching min/max with a constant operand, constant-fold the 2 constant operands.
static Instruction * reassociateMinMaxWithConstantInOperand (IntrinsicInst *II, InstCombiner::BuilderTy &Builder)
If this min/max has a matching min/max operand with a constant, try to push the constant operand into this instruction.
static Instruction * factorizeMinMaxTree (IntrinsicInst *II)
Reduce a sequence of min/max intrinsics with a common operand.
template<Intrinsic::ID IntrID>
static Instruction * foldBitOrderCrossLogicOp (Value *V, InstCombiner::BuilderTy &Builder)
Fold the following cases and accepts bswap and bitreverse intrinsics: bswap(logic_op(bswap(x), y)) --> logic_op(x, bswap(y)) bswap(logic_op(bswap(x), bswap(y))) --> logic_op(x, y) (ignores multiuse)
static bool isIdempotentBinaryIntrinsic (Intrinsic::ID IID)
Helper to match idempotent binary intrinsics, namely, intrinsics where f(f(x, y), y) == f(x, y) holds.
static Value * foldIdempotentBinaryIntrinsicRecurrence (InstCombinerImpl &IC, IntrinsicInst *II)
Attempt to simplify value-accumulating recurrences of kind: umax.acc = phi i8 [ umax, backedge ], [ a, entry ] umax = call i8 @llvm.umax.i8(i8 umax.acc, i8 b) And let the idempotent binary intrinsic be hoisted, when the operands are known to be loop-invariant.
static Value * simplifyReductionOperand (Value *Arg, bool CanReorderLanes)
template<Intrinsic::ID IntrID>
static Value * foldMinimumOverTrailingOrLeadingZeroCount (Value *I0, Value *I1, const DataLayout &DL, InstCombiner::BuilderTy &Builder)
Fold an unsigned minimum of trailing or leading zero bits counts: umin(cttz(CtOp, ZeroUndef), ConstOp) --> cttz(CtOp | (1 << ConstOp)) umin(ctlz(CtOp, ZeroUndef), ConstOp) --> ctlz(CtOp
static bool leftDistributesOverRight (Instruction::BinaryOps LOp, bool HasNUW, bool HasNSW, Intrinsic::ID ROp)
Return whether "X LOp (Y ROp Z)" is always equal to "(X LOp Y) ROp (X LOp Z)".
static Value * foldIntrinsicUsingDistributiveLaws (IntrinsicInst *II, InstCombiner::BuilderTy &Builder)
static Value * optimizeModularFormat (CallInst *CI, IRBuilderBase &B)
static IntrinsicInst * findInitTrampolineFromAlloca (Value *TrampMem)
static IntrinsicInst * findInitTrampolineFromBB (IntrinsicInst *AdjustTramp, Value *TrampMem)
static IntrinsicInst * findInitTrampoline (Value *Callee)
Variables
static cl::opt< unsigned > GuardWideningWindow ("instcombine-guard-widening-window", cl::init(3), cl::desc("How wide an instruction window to bypass looking for " "another guard"))

DEBUG_TYPE

#define DEBUG_TYPE "instcombine"

canonicalizeConstantArg0ToArg1()

createOverflowTuple()

factorizeMinMaxTree()

Reduce a sequence of min/max intrinsics with a common operand.

Definition at line 1351 of file InstCombineCalls.cpp.

References A(), assert(), B(), llvm::CallingConv::C, llvm::CallInst::Create(), D(), llvm::dyn_cast(), llvm::Intrinsic::getOrInsertDeclaration(), II, LHS, Mod, and RHS.

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

findInitTrampoline()

findInitTrampolineFromAlloca()

findInitTrampolineFromBB()

foldBitOrderCrossLogicOp()

Instruction * foldBitOrderCrossLogicOp ( Value * V, InstCombiner::BuilderTy & Builder ) static

Fold the following cases and accepts bswap and bitreverse intrinsics: bswap(logic_op(bswap(x), y)) --> logic_op(x, bswap(y)) bswap(logic_op(bswap(x), bswap(y))) --> logic_op(x, y) (ignores multiuse)

Definition at line 1507 of file InstCombineCalls.cpp.

References llvm::cast(), llvm::BinaryOperator::Create(), llvm::isa(), llvm::PatternMatch::m_BitwiseLogic(), llvm::PatternMatch::m_Intrinsic(), llvm::MIPatternMatch::m_OneUse(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), X, and Y.

foldClampRangeOfTwo()

If we have a clamp pattern like max (min X, 42), 41 – where the output can only be one of two possible constant values – turn that into a select of constants.

Definition at line 1249 of file InstCombineCalls.cpp.

References llvm::CmpInst::BAD_ICMP_PREDICATE, llvm::SelectInst::Create(), llvm::Value::hasOneUse(), llvm::CmpInst::ICMP_SGT, llvm::CmpInst::ICMP_SLT, llvm::CmpInst::ICMP_UGT, llvm::CmpInst::ICMP_ULT, II, llvm_unreachable, llvm::PatternMatch::m_APInt(), llvm::PatternMatch::m_SMax(), llvm::PatternMatch::m_SMin(), llvm::PatternMatch::m_UMax(), llvm::PatternMatch::m_UMin(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), and X.

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

foldCtpop()

Definition at line 652 of file InstCombineCalls.cpp.

References assert(), llvm::BitWidth, llvm::InstCombiner::Builder, llvm::InstCombiner::computeKnownBits(), llvm::ConstantRange::contains(), llvm::KnownBits::countMaxPopulation(), llvm::KnownBits::countMinPopulation(), llvm::CallInst::Create(), llvm::CastInst::Create(), llvm::IRBuilderBase::CreateICmp(), llvm::IRBuilderBase::CreateIntrinsic(), llvm::IRBuilderBase::CreateSub(), llvm::IRBuilderBase::CreateUnaryIntrinsic(), F, llvm::IRBuilderBase::getFalse(), llvm::Constant::getNullValue(), llvm::Intrinsic::getOrInsertDeclaration(), llvm::InstCombiner::getSimplifyQuery(), llvm::SimplifyQuery::getWithInstruction(), llvm::APInt::getZero(), llvm::Value::hasOneUse(), llvm::CmpInst::ICMP_NE, II, llvm::isKnownNonZero(), llvm::InstCombiner::isKnownToBeAPowerOfTwo(), llvm::Lower, llvm::PatternMatch::m_Add(), llvm::PatternMatch::m_AllOnes(), llvm::PatternMatch::m_BitReverse(), llvm::PatternMatch::m_BSwap(), llvm::PatternMatch::m_c_And(), llvm::PatternMatch::m_c_Or(), llvm::PatternMatch::m_Deferred(), llvm::PatternMatch::m_FShl(), llvm::PatternMatch::m_FShr(), llvm::MIPatternMatch::m_Neg(), llvm::MIPatternMatch::m_Not(), llvm::MIPatternMatch::m_OneUse(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::m_ZExt(), llvm::PatternMatch::match(), Range, llvm::InstCombiner::replaceInstUsesWith(), llvm::InstCombiner::replaceOperand(), llvm::ConstantRange::Unsigned, llvm::Upper, X, Y, and llvm::KnownBits::Zero.

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

foldCttzCtlz()

Definition at line 476 of file InstCombineCalls.cpp.

References assert(), llvm::BitWidth, llvm::InstCombiner::Builder, llvm::CallingConv::C, llvm::InstCombiner::computeKnownBits(), llvm::KnownBits::countMaxLeadingZeros(), llvm::KnownBits::countMaxTrailingZeros(), llvm::KnownBits::countMinLeadingZeros(), llvm::KnownBits::countMinTrailingZeros(), llvm::CallInst::Create(), llvm::IRBuilderBase::CreateBinaryIntrinsic(), llvm::IRBuilderBase::CreateIntrinsic(), llvm::BinaryOperator::CreateNot(), llvm::IRBuilderBase::CreateSub(), llvm::IRBuilderBase::CreateZExt(), F, llvm::SelectPatternResult::Flavor, llvm::IRBuilderBase::getFalse(), llvm::Constant::getNullValue(), llvm::Intrinsic::getOrInsertDeclaration(), llvm::Type::getScalarSizeInBits(), llvm::InstCombiner::getSimplifyQuery(), llvm::IRBuilderBase::getTrue(), llvm::Value::getType(), llvm::SimplifyQuery::getWithInstruction(), llvm::Value::hasOneUse(), II, llvm::isKnownNonZero(), llvm::APInt::isZero(), llvm::PatternMatch::m_Add(), llvm::PatternMatch::m_AllOnes(), llvm::PatternMatch::m_BitReverse(), llvm::PatternMatch::m_c_And(), llvm::PatternMatch::m_Deferred(), llvm::PatternMatch::m_Exact(), llvm::PatternMatch::m_ImmConstant(), llvm::PatternMatch::m_Intrinsic(), llvm::PatternMatch::m_LShr(), llvm::MIPatternMatch::m_Neg(), llvm::MIPatternMatch::m_Not(), llvm::PatternMatch::m_NUWShl(), llvm::PatternMatch::m_One(), llvm::MIPatternMatch::m_OneUse(), llvm::PatternMatch::m_SExt(), llvm::PatternMatch::m_Shift(), llvm::PatternMatch::m_Shl(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::m_Zero(), llvm::PatternMatch::m_ZExt(), llvm::PatternMatch::match(), llvm::matchSelectPattern(), llvm::KnownBits::One, Range, llvm::InstCombiner::replaceInstUsesWith(), llvm::InstCombiner::replaceOperand(), llvm::Instruction::setHasNoSignedWrap(), llvm::Instruction::setHasNoUnsignedWrap(), llvm::SPF_ABS, llvm::SPF_NABS, llvm::InstCombinerImpl::tryGetLog2(), X, and Y.

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

foldIdempotentBinaryIntrinsicRecurrence()

Attempt to simplify value-accumulating recurrences of kind: umax.acc = phi i8 [ umax, backedge ], [ a, entry ] umax = call i8 @llvm.umax.i8(i8 umax.acc, i8 b) And let the idempotent binary intrinsic be hoisted, when the operands are known to be loop-invariant.

Definition at line 1567 of file InstCombineCalls.cpp.

References llvm::InstCombiner::Builder, llvm::cast(), llvm::IRBuilderBase::CreateBinaryIntrinsic(), llvm::DominatorTree::dominates(), llvm::InstCombiner::getDominatorTree(), II, llvm::isa(), isIdempotentBinaryIntrinsic(), and llvm::matchSimpleBinaryIntrinsicRecurrence().

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

foldIntrinsicUsingDistributiveLaws()

Value * foldIntrinsicUsingDistributiveLaws ( IntrinsicInst * II, InstCombiner::BuilderTy & Builder ) static

Definition at line 1675 of file InstCombineCalls.cpp.

References A(), B(), llvm::CallingConv::C, llvm::cast(), D(), llvm::dyn_cast(), llvm::Operator::getOpcode(), llvm::User::getOperand(), llvm::OverflowingBinaryOperator::hasNoSignedWrap(), llvm::OverflowingBinaryOperator::hasNoUnsignedWrap(), llvm::Value::hasOneUse(), II, llvm::OverflowingBinaryOperator::isCommutative(), leftDistributesOverRight(), LHS, RHS, llvm::Instruction::setHasNoSignedWrap(), llvm::Instruction::setHasNoUnsignedWrap(), and std::swap().

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

foldMinimumOverTrailingOrLeadingZeroCount()

Fold an unsigned minimum of trailing or leading zero bits counts: umin(cttz(CtOp, ZeroUndef), ConstOp) --> cttz(CtOp | (1 << ConstOp)) umin(ctlz(CtOp, ZeroUndef), ConstOp) --> ctlz(CtOp | (SignedMin >> ConstOp))

Definition at line 1620 of file InstCombineCalls.cpp.

References llvm::BitWidth, llvm::CallingConv::C, llvm::cast(), llvm::ConstantFoldBinaryOpOperands(), DL, llvm::APInt::getSignedMinValue(), llvm::ConstantInt::getTrue(), llvm::Value::getType(), llvm::PatternMatch::m_CheckedInt(), llvm::PatternMatch::m_Intrinsic(), llvm::MIPatternMatch::m_OneUse(), llvm::PatternMatch::m_Value(), and llvm::PatternMatch::match().

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

fpclassTestIsFCmp0()

Returns

the compare predicate type if the test performed by llvm.is.fpclass(x, Mask) is equivalent to fcmp o__ x, 0.0 with the floating-point environment assumed for F for type Ty

Definition at line 912 of file InstCombineCalls.cpp.

References llvm::CmpInst::BAD_FCMP_PREDICATE, F, llvm::CmpInst::FCMP_OEQ, llvm::CmpInst::FCMP_OGE, llvm::CmpInst::FCMP_OGT, llvm::CmpInst::FCMP_OLE, llvm::CmpInst::FCMP_OLT, llvm::CmpInst::FCMP_ONE, llvm::fcNan, llvm::fcNegative, llvm::fcNegInf, llvm::fcNegNormal, llvm::fcNegSubnormal, llvm::fcNegZero, llvm::fcPosInf, llvm::fcPositive, llvm::fcPosNormal, llvm::fcPosSubnormal, llvm::fcPosZero, llvm::fcSubnormal, llvm::fcZero, inputDenormalIsDAZ(), and inputDenormalIsIEEE().

getKnownSign()

Definition at line 1110 of file InstCombineCalls.cpp.

References llvm::computeKnownBits(), llvm::SimplifyQuery::CxtI, llvm::SimplifyQuery::DL, llvm::CmpInst::ICMP_SLT, llvm::isImpliedByDomCondition(), llvm::KnownBits::isNegative(), llvm::KnownBits::isNonNegative(), llvm::PatternMatch::m_NSWSub(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), X, and Y.

Referenced by getKnownSignOrZero(), signBitMustBeTheSame(), and llvm::InstCombinerImpl::visitCallInst().

getKnownSignOrZero()

getPromotedType()

Type * getPromotedType ( Type * Ty) static

hasUndefSource()

haveSameOperands()

inputDenormalIsDAZ()

inputDenormalIsIEEE()

isIdempotentBinaryIntrinsic()

leftDistributesOverRight()

moveAddAfterMinMax()

Try to canonicalize min/max(X + C0, C1) as min/max(X, C1 - C0) + C0.

This can trigger other combines.

Definition at line 1150 of file InstCombineCalls.cpp.

References llvm::Add, assert(), llvm::cast(), II, llvm::PatternMatch::m_Add(), llvm::PatternMatch::m_APInt(), llvm::MIPatternMatch::m_OneUse(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), llvm::APInt::ssub_ov(), llvm::APInt::usub_ov(), and X.

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

optimizeModularFormat()

Definition at line 4129 of file InstCombineCalls.cpp.

References llvm::any_of(), llvm::CallBase::arg_begin(), llvm::CallBase::arg_end(), llvm::ArrayRef(), assert(), B(), llvm::cast(), llvm::Instruction::clone(), llvm::ArrayRef< T >::drop_front(), llvm::ArrayRef< T >::empty(), llvm::MDString::get(), llvm::MetadataAsValue::get(), llvm::CallBase::getCalledFunction(), llvm::CallBase::getFnAttr(), llvm::Instruction::getModule(), llvm::Intrinsic::getOrInsertDeclaration(), llvm::Attribute::getValueAsString(), llvm::CallBase::hasFnAttr(), llvm::make_range(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), llvm::ArrayRef< T >::size(), llvm::SmallVectorTemplateCommon< T, typename >::size(), llvm::sort(), and llvm::split().

reassociateMinMaxWithConstantInOperand()

If this min/max has a matching min/max operand with a constant, try to push the constant operand into this instruction.

This can enable more folds.

Definition at line 1323 of file InstCombineCalls.cpp.

References llvm::CallingConv::C, llvm::CallInst::Create(), llvm::dyn_cast(), llvm::Intrinsic::getOrInsertDeclaration(), II, llvm::PatternMatch::m_c_MaxOrMin(), llvm::PatternMatch::m_CombineAnd(), llvm::PatternMatch::m_ImmConstant(), llvm::PatternMatch::m_Instruction(), llvm::PatternMatch::m_MaxOrMin(), llvm::MIPatternMatch::m_OneUse(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), llvm::Value::takeName(), X, and Y.

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

reassociateMinMaxWithConstants()

removeTriviallyEmptyRange()

signBitMustBeTheSame()

simplifyInvariantGroupIntrinsic()

simplifyNeonTbl1()

Convert a table lookup to shufflevector if the mask is constant.

This could benefit tbl1 if the mask is { 7,6,5,4,3,2,1,0 }, in which case we could lower the shufflevector with rev64 instructions as it's actually a byte reverse.

Definition at line 744 of file InstCombineCalls.cpp.

References llvm::ArrayRef(), llvm::CallingConv::C, llvm::cast(), llvm::dyn_cast(), llvm::Constant::getNullValue(), I, II, and llvm::isa().

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

simplifyReductionOperand()

Value * simplifyReductionOperand ( Value * Arg, bool CanReorderLanes ) static

Definition at line 1587 of file InstCombineCalls.cpp.

References llvm::SmallBitVector::all(), llvm::cast(), llvm::Value::getType(), llvm::isa(), llvm::PatternMatch::m_Shuffle(), llvm::PatternMatch::m_Undef(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::m_VecReverse(), llvm::PatternMatch::match(), llvm::PoisonMaskElem, llvm::SmallBitVector::set(), and llvm::SmallBitVector::test().

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

STATISTIC()

STATISTIC ( NumSimplified ,
"Number of library calls simplified" )

GuardWideningWindow

cl::opt< unsigned > GuardWideningWindow("instcombine-guard-widening-window", cl::init(3), cl::desc("How wide an instruction window to bypass looking for " "another guard")) ( "instcombine-guard-widening-window" , cl::init(3) , cl::desc("How wide an instruction window to bypass looking for " "another guard") ) static