37#define DEBUG_TYPE "instcombine"
41using namespace PatternMatch;
51 if (!V->hasOneUse())
return nullptr;
53 bool MadeChange =
false;
57 Value *
A =
nullptr, *
B =
nullptr, *One =
nullptr;
67 if (
I &&
I->isLogicalShift() &&
76 if (
I->getOpcode() == Instruction::LShr && !
I->isExact()) {
81 if (
I->getOpcode() == Instruction::Shl && !
I->hasNoUnsignedWrap()) {
82 I->setHasNoUnsignedWrap();
91 return MadeChange ? V :
nullptr;
107 bool HasAnyNoWrap =
I.hasNoSignedWrap() ||
I.hasNoUnsignedWrap();
108 Value *Neg =
Builder.CreateNeg(OtherOp,
"",
false, HasAnyNoWrap);
115 bool HasAnyNoWrap =
I.hasNoSignedWrap() ||
I.hasNoUnsignedWrap();
116 Value *Neg =
Builder.CreateNeg(OtherOp,
"",
false, HasAnyNoWrap);
126 Builder.setFastMathFlags(
I.getFastMathFlags());
136 Builder.setFastMathFlags(
I.getFastMathFlags());
157 bool PropagateNSW = HasNSW && cast<ShlOperator>(
Y)->hasNoSignedWrap();
170 Value *Shl =
Builder.CreateShl(FrX, Z,
"mulshl", HasNUW, PropagateNSW);
189 bool AssumeNonZero,
bool DoFold);
192 Value *Op0 =
I.getOperand(0), *Op1 =
I.getOperand(1);
210 Type *Ty =
I.getType();
212 const bool HasNSW =
I.hasNoSignedWrap();
213 const bool HasNUW =
I.hasNoUnsignedWrap();
233 if (HasNUW &&
Mul->hasNoUnsignedWrap())
249 if (
match(NewCst,
m_APInt(V)) && *V != V->getBitWidth() - 1)
263 auto *Op1C = cast<Constant>(Op1);
267 HasNSW && Op1C->isNotMinSignedValue()));
276 const APInt *NegPow2C;
280 unsigned SrcWidth =
X->getType()->getScalarSizeInBits();
282 if (ShiftAmt >=
BitWidth - SrcWidth) {
308 auto *BOp0 = cast<BinaryOperator>(Op0);
310 (BOp0->getOpcode() == Instruction::Or || BOp0->hasNoUnsignedWrap());
312 auto *BO = BinaryOperator::CreateAdd(NewMul, NewC);
313 if (HasNUW && Op0NUW) {
315 if (
auto *NewMulBO = dyn_cast<BinaryOperator>(NewMul))
316 NewMulBO->setHasNoUnsignedWrap();
317 BO->setHasNoUnsignedWrap();
329 return BinaryOperator::CreateMul(
X,
X);
332 return BinaryOperator::CreateMul(
X,
X);
343 auto *NewMul = BinaryOperator::CreateMul(
X,
Y);
344 if (HasNSW && cast<OverflowingBinaryOperator>(Op0)->
hasNoSignedWrap() &&
346 NewMul->setHasNoSignedWrap();
360 if (!Div || (Div->
getOpcode() != Instruction::UDiv &&
361 Div->
getOpcode() != Instruction::SDiv)) {
363 Div = dyn_cast<BinaryOperator>(Op1);
365 Value *Neg = dyn_castNegVal(
Y);
368 (Div->
getOpcode() == Instruction::UDiv ||
369 Div->
getOpcode() == Instruction::SDiv)) {
379 auto RemOpc = Div->
getOpcode() == Instruction::UDiv ? Instruction::URem
385 return BinaryOperator::CreateSub(XFreeze, Rem);
386 return BinaryOperator::CreateSub(Rem, XFreeze);
398 return BinaryOperator::CreateAnd(Op0, Op1);
410 X->getType()->isIntOrIntVectorTy(1) &&
X->getType() ==
Y->getType() &&
411 (Op0->
hasOneUse() || Op1->hasOneUse() ||
X ==
Y)) {
420 X->getType()->isIntOrIntVectorTy(1) &&
X->getType() ==
Y->getType() &&
421 (Op0->
hasOneUse() || Op1->hasOneUse())) {
444 *
C ==
C->getBitWidth() - 1) {
456 *
C ==
C->getBitWidth() - 1) {
516 bool Changed =
false;
517 if (!HasNSW && willNotOverflowSignedMul(Op0, Op1,
I)) {
519 I.setHasNoSignedWrap(
true);
522 if (!HasNUW && willNotOverflowUnsignedMul(Op0, Op1,
I)) {
524 I.setHasNoUnsignedWrap(
true);
527 return Changed ? &
I :
nullptr;
532 assert((Opcode == Instruction::FMul || Opcode == Instruction::FDiv) &&
533 "Expected fmul or fdiv");
535 Value *Op0 =
I.getOperand(0), *Op1 =
I.getOperand(1);
551 (Op0->
hasOneUse() || Op1->hasOneUse())) {
565 I.getFastMathFlags(),
588 Value *Op0 =
I.getOperand(0), *Op1 =
I.getOperand(1);
595 {
I.getType()}, {Op1, Op0}, &
I);
610 if (
I.hasAllowReassoc()) {
643 Instruction::FMul,
C, C1,
DL)) {
651 Instruction::FMul,
C, C1,
DL)) {
682 if (
I.hasNoSignedZeros() &&
686 if (
I.hasNoSignedZeros() &&
693 if (
I.hasNoNaNs() &&
I.hasNoSignedZeros() && Op0 == Op1 &&
719 if (
I.isOnlyUserOfAnyOperand()) {
738 Y->getType() == Z->getType()) {
741 Intrinsic::powi, {
X->getType(), YZ->getType()}, {
X, YZ}, &
I);
786 Log2 = cast<IntrinsicInst>(Op0);
791 Log2 = cast<IntrinsicInst>(Op1);
805 Value *Start =
nullptr, *Step =
nullptr;
819 if (!Result->hasNoNaNs())
820 Result->setHasNoInfs(
false);
831 SelectInst *SI = dyn_cast<SelectInst>(
I.getOperand(1));
856 Value *SelectCond = SI->getCondition();
857 if (SI->use_empty() && SelectCond->
hasOneUse())
863 while (BBI != BBFront) {
871 for (
Use &
Op : BBI->operands()) {
875 }
else if (
Op == SelectCond) {
885 if (&*BBI == SelectCond)
886 SelectCond =
nullptr;
889 if (!SelectCond && !SI)
900 Product = IsSigned ? C1.
smul_ov(C2, Overflow) : C1.
umul_ov(C2, Overflow);
928 assert((
I.getOpcode() == Instruction::SDiv ||
929 I.getOpcode() == Instruction::UDiv) &&
930 "Expected integer divide");
932 bool IsSigned =
I.getOpcode() == Instruction::SDiv;
933 Value *Op0 =
I.getOperand(0), *Op1 =
I.getOperand(1);
934 Type *Ty =
I.getType();
944 auto *
Mul = cast<OverflowingBinaryOperator>(Op0);
945 auto *Shl = cast<OverflowingBinaryOperator>(Op1);
946 bool HasNUW =
Mul->hasNoUnsignedWrap() && Shl->hasNoUnsignedWrap();
947 bool HasNSW =
Mul->hasNoSignedWrap() && Shl->hasNoSignedWrap();
950 if (!IsSigned && HasNUW)
951 Ret = BinaryOperator::CreateLShr(
Y, Z);
954 if (IsSigned && HasNSW && (Op0->
hasOneUse() || Op1->hasOneUse())) {
956 Ret = BinaryOperator::CreateSDiv(
Y, Shl);
964 auto *Shl0 = cast<OverflowingBinaryOperator>(Op0);
965 auto *Shl1 = cast<OverflowingBinaryOperator>(Op1);
971 ((Shl0->hasNoUnsignedWrap() && Shl1->hasNoUnsignedWrap()) ||
972 (Shl0->hasNoUnsignedWrap() && Shl0->hasNoSignedWrap() &&
973 Shl1->hasNoSignedWrap())))
974 Ret = BinaryOperator::CreateUDiv(
X,
Y);
978 if (IsSigned && Shl0->hasNoSignedWrap() && Shl1->hasNoSignedWrap() &&
979 Shl1->hasNoUnsignedWrap())
980 Ret = BinaryOperator::CreateSDiv(
X,
Y);
986 Ret->setIsExact(
I.isExact());
998 Value *Op0 =
I.getOperand(0), *Op1 =
I.getOperand(1);
999 bool IsSigned =
I.getOpcode() == Instruction::SDiv;
1000 Type *Ty =
I.getType();
1040 if (
isMultiple(*C2, *C1, Quotient, IsSigned)) {
1043 NewDiv->setIsExact(
I.isExact());
1048 if (
isMultiple(*C1, *C2, Quotient, IsSigned)) {
1051 auto *OBO = cast<OverflowingBinaryOperator>(Op0);
1052 Mul->setHasNoUnsignedWrap(!IsSigned && OBO->hasNoUnsignedWrap());
1053 Mul->setHasNoSignedWrap(OBO->hasNoSignedWrap());
1066 if (
isMultiple(*C2, C1Shifted, Quotient, IsSigned)) {
1069 BO->setIsExact(
I.isExact());
1074 if (
isMultiple(C1Shifted, *C2, Quotient, IsSigned)) {
1077 auto *OBO = cast<OverflowingBinaryOperator>(Op0);
1078 Mul->setHasNoUnsignedWrap(!IsSigned && OBO->hasNoUnsignedWrap());
1079 Mul->setHasNoSignedWrap(OBO->hasNoSignedWrap());
1097 return BinaryOperator::CreateNUWAdd(
X,
1143 bool HasNSW = cast<OverflowingBinaryOperator>(Op1)->hasNoSignedWrap();
1144 bool HasNUW = cast<OverflowingBinaryOperator>(Op1)->hasNoUnsignedWrap();
1145 if ((IsSigned && HasNSW) || (!IsSigned && HasNUW)) {
1154 if (!IsSigned && Op1->hasOneUse() &&
1172 auto *InnerDiv = cast<PossiblyExactOperator>(Op0);
1173 auto *
Mul = cast<OverflowingBinaryOperator>(InnerDiv->getOperand(0));
1175 if (!IsSigned &&
Mul->hasNoUnsignedWrap())
1176 NewDiv = BinaryOperator::CreateUDiv(
X,
Y);
1177 else if (IsSigned &&
Mul->hasNoSignedWrap())
1178 NewDiv = BinaryOperator::CreateSDiv(
X,
Y);
1182 NewDiv->
setIsExact(
I.isExact() && InnerDiv->isExact());
1196 bool AssumeNonZero,
bool DoFold) {
1199 return reinterpret_cast<Value *
>(-1);
1207 return IfFold([&]() {
1223 return IfFold([&]() {
return Builder.CreateZExt(LogX,
Op->getType()); });
1228 auto *BO = cast<OverflowingBinaryOperator>(
Op);
1230 if (AssumeNonZero || BO->hasNoUnsignedWrap() || BO->hasNoSignedWrap())
1232 return IfFold([&]() {
return Builder.CreateAdd(LogX,
Y); });
1242 AssumeNonZero, DoFold))
1244 AssumeNonZero, DoFold))
1245 return IfFold([&]() {
1246 return Builder.CreateSelect(SI->getOperand(0), LogX, LogY);
1251 auto *
MinMax = dyn_cast<MinMaxIntrinsic>(
Op);
1259 return IfFold([&]() {
1260 return Builder.CreateBinaryIntrinsic(
MinMax->getIntrinsicID(), LogX,
1275 Type *Ty =
I.getType();
1278 X->getType() ==
Y->getType() && (
N->hasOneUse() ||
D->hasOneUse())) {
1324 Value *Op0 =
I.getOperand(0), *Op1 =
I.getOperand(1);
1326 const APInt *C1, *C2;
1343 Type *Ty =
I.getType();
1366 return BinaryOperator::CreateUDiv(
B,
X);
1369 return BinaryOperator::CreateUDiv(
A,
X);
1377 if (
I.isExact() && cast<PossiblyExactOperator>(Op0)->isExact())
1406 Value *Op0 =
I.getOperand(0), *Op1 =
I.getOperand(1);
1407 Type *Ty =
I.getType();
1423 return BinaryOperator::CreateExactAShr(Op0,
C);
1429 return BinaryOperator::CreateExactAShr(Op0, ShAmt);
1499 auto *BO = BinaryOperator::CreateUDiv(Op0, Op1,
I.getName());
1500 BO->setIsExact(
I.isExact());
1518 auto *BO = BinaryOperator::CreateUDiv(Op0, Op1,
I.getName());
1519 BO->setIsExact(
I.isExact());
1545 Intrinsic::copysign, {
C->getType()},
1554 if (!(
C->hasExactInverseFP() || (
I.hasAllowReciprocal() &&
C->isNormalFP())))
1563 if (!RecipC || !RecipC->isNormalFP())
1583 if (!
I.hasAllowReassoc() || !
I.hasAllowReciprocal())
1608 Value *Op0 =
I.getOperand(0), *Op1 =
I.getOperand(1);
1609 auto *II = dyn_cast<IntrinsicInst>(Op1);
1610 if (!II || !II->hasOneUse() || !
I.hasAllowReassoc() ||
1611 !
I.hasAllowReciprocal())
1621 case Intrinsic::pow:
1622 Args.push_back(II->getArgOperand(0));
1623 Args.push_back(
Builder.CreateFNegFMF(II->getArgOperand(1), &
I));
1625 case Intrinsic::powi: {
1633 Args.push_back(II->getArgOperand(0));
1634 Args.push_back(
Builder.CreateNeg(II->getArgOperand(1)));
1635 Type *Tys[] = {
I.getType(), II->getArgOperand(1)->getType()};
1639 case Intrinsic::exp:
1640 case Intrinsic::exp2:
1641 Args.push_back(
Builder.CreateFNegFMF(II->getArgOperand(0), &
I));
1646 Value *Pow =
Builder.CreateIntrinsic(IID,
I.getType(), Args, &
I);
1654 I.getFastMathFlags(),
1673 Value *Op0 =
I.getOperand(0), *Op1 =
I.getOperand(1);
1674 if (isa<Constant>(Op0))
1675 if (
SelectInst *SI = dyn_cast<SelectInst>(Op1))
1679 if (isa<Constant>(Op1))
1680 if (
SelectInst *SI = dyn_cast<SelectInst>(Op0))
1684 if (
I.hasAllowReassoc() &&
I.hasAllowReciprocal()) {
1687 (!isa<Constant>(
Y) || !isa<Constant>(Op1))) {
1693 (!isa<Constant>(
Y) || !isa<Constant>(Op0))) {
1708 if (
I.hasAllowReassoc() && Op0->
hasOneUse() && Op1->hasOneUse()) {
1712 bool IsTan =
match(Op0, m_Intrinsic<Intrinsic::sin>(
m_Value(
X))) &&
1715 !IsTan &&
match(Op0, m_Intrinsic<Intrinsic::cos>(
m_Value(
X))) &&
1718 if ((IsTan || IsCot) &&
hasFloatFn(M, &
TLI,
I.getType(), LibFunc_tan,
1719 LibFunc_tanf, LibFunc_tanl)) {
1722 B.setFastMathFlags(
I.getFastMathFlags());
1724 cast<CallBase>(Op0)->getCalledFunction()->getAttributes();
1726 LibFunc_tanl,
B, Attrs);
1737 if (
I.hasNoNaNs() &&
I.hasAllowReassoc() &&
1746 if (
I.hasNoNaNs() &&
I.hasNoInfs() &&
1758 if (
I.hasAllowReassoc() &&
1778 Value *Op0 =
I.getOperand(0), *Op1 =
I.getOperand(1), *
X =
nullptr;
1780 bool ShiftByX =
false;
1784 const APInt *Tmp =
nullptr;
1800 const APInt *Tmp =
nullptr;
1812 if (MatchShiftOrMulXC(Op0,
X,
Y) && MatchShiftOrMulXC(Op1,
X, Z)) {
1814 }
else if (MatchShiftCX(Op0,
Y,
X) && MatchShiftCX(Op1, Z,
X)) {
1820 bool IsSRem =
I.getOpcode() == Instruction::SRem;
1827 bool BO0NoWrap = IsSRem ? BO0HasNSW : BO0HasNUW;
1829 APInt RemYZ = IsSRem ?
Y.srem(Z) :
Y.urem(Z);
1833 if (RemYZ.
isZero() && BO0NoWrap)
1839 auto CreateMulOrShift =
1841 Value *RemSimplification =
1843 return ShiftByX ? BinaryOperator::CreateShl(RemSimplification,
X)
1844 : BinaryOperator::CreateMul(
X, RemSimplification);
1850 bool BO1NoWrap = IsSRem ? BO1HasNSW : BO1HasNUW;
1854 if (RemYZ ==
Y && BO1NoWrap) {
1865 if (
Y.uge(Z) && (IsSRem ? (BO0HasNSW && BO1HasNSW) : BO0HasNUW)) {
1883 Value *Op0 =
I.getOperand(0), *Op1 =
I.getOperand(1);
1903 if (isa<Constant>(Op1)) {
1904 if (
Instruction *Op0I = dyn_cast<Instruction>(Op0)) {
1905 if (
SelectInst *SI = dyn_cast<SelectInst>(Op0I)) {
1908 }
else if (
auto *PN = dyn_cast<PHINode>(Op0I)) {
1909 const APInt *Op1Int;
1911 (
I.getOpcode() == Instruction::URem ||
1948 Value *Op0 =
I.getOperand(0), *Op1 =
I.getOperand(1);
1949 Type *Ty =
I.getType();
1955 return BinaryOperator::CreateAnd(Op0,
Add);
2011 Value *Op0 =
I.getOperand(0), *Op1 =
I.getOperand(1);
2030 return BinaryOperator::CreateURem(Op0, Op1,
I.getName());
2034 if (isa<ConstantVector>(Op1) || isa<ConstantDataVector>(Op1)) {
2036 unsigned VWidth = cast<FixedVectorType>(
C->getType())->getNumElements();
2038 bool hasNegative =
false;
2039 bool hasMissing =
false;
2040 for (
unsigned i = 0; i != VWidth; ++i) {
2041 Constant *Elt =
C->getAggregateElement(i);
2048 if (
RHS->isNegative())
2052 if (hasNegative && !hasMissing) {
2054 for (
unsigned i = 0; i != VWidth; ++i) {
2055 Elts[i] =
C->getAggregateElement(i);
2057 if (
RHS->isNegative())
2073 I.getFastMathFlags(),
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
This file implements a class to represent arbitrary precision integral constant values and operations...
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
static GCMetadataPrinterRegistry::Add< ErlangGCPrinter > X("erlang", "erlang-compatible garbage collector")
This file provides internal interfaces used to implement the InstCombine.
static Instruction * simplifyIRemMulShl(BinaryOperator &I, InstCombinerImpl &IC)
static Value * simplifyValueKnownNonZero(Value *V, InstCombinerImpl &IC, Instruction &CxtI)
The specific integer value is used in a context where it is known to be non-zero.
static Instruction * narrowUDivURem(BinaryOperator &I, InstCombiner::BuilderTy &Builder)
If we have zero-extended operands of an unsigned div or rem, we may be able to narrow the operation (...
static const unsigned MaxDepth
static Instruction * foldIDivShl(BinaryOperator &I, InstCombiner::BuilderTy &Builder)
static Value * foldMulSelectToNegate(BinaryOperator &I, InstCombiner::BuilderTy &Builder)
static Instruction * foldFDivPowDivisor(BinaryOperator &I, InstCombiner::BuilderTy &Builder)
Negate the exponent of pow/exp to fold division-by-pow() into multiply.
static bool multiplyOverflows(const APInt &C1, const APInt &C2, APInt &Product, bool IsSigned)
True if the multiply can not be expressed in an int this size.
static Value * foldMulShl1(BinaryOperator &Mul, bool CommuteOperands, InstCombiner::BuilderTy &Builder)
Reduce integer multiplication patterns that contain a (+/-1 << Z) factor.
static Value * takeLog2(IRBuilderBase &Builder, Value *Op, unsigned Depth, bool AssumeNonZero, bool DoFold)
static bool isMultiple(const APInt &C1, const APInt &C2, APInt &Quotient, bool IsSigned)
True if C1 is a multiple of C2. Quotient contains C1/C2.
static Instruction * foldFDivConstantDividend(BinaryOperator &I)
Remove negation and try to reassociate constant math.
This file provides the interface for the instcombine pass implementation.
static bool hasNoSignedWrap(BinaryOperator &I)
static bool hasNoUnsignedWrap(BinaryOperator &I)
static GCMetadataPrinterRegistry::Add< OcamlGCMetadataPrinter > Y("ocaml", "ocaml 3.10-compatible collector")
const SmallVectorImpl< MachineOperand > & Cond
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file defines the SmallVector class.
Class for arbitrary precision integers.
APInt umul_ov(const APInt &RHS, bool &Overflow) const
APInt udiv(const APInt &RHS) const
Unsigned division operation.
static void udivrem(const APInt &LHS, const APInt &RHS, APInt &Quotient, APInt &Remainder)
Dual division/remainder interface.
static APInt getSignMask(unsigned BitWidth)
Get the SignMask for a specific bit width.
bool isMinSignedValue() const
Determine if this is the smallest signed value.
uint64_t getZExtValue() const
Get zero extended value.
static void sdivrem(const APInt &LHS, const APInt &RHS, APInt &Quotient, APInt &Remainder)
bool isAllOnes() const
Determine if all bits are set. This is true for zero-width values.
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
unsigned getBitWidth() const
Return the number of bits in the APInt.
bool ult(const APInt &RHS) const
Unsigned less than comparison.
bool isMinValue() const
Determine if this is the smallest unsigned value.
unsigned countr_zero() const
Count the number of trailing zero bits.
APInt ushl_ov(const APInt &Amt, bool &Overflow) const
unsigned getSignificantBits() const
Get the minimum bit size for this signed APInt.
APInt smul_ov(const APInt &RHS, bool &Overflow) const
static APInt getOneBitSet(unsigned numBits, unsigned BitNo)
Return an APInt with exactly one bit set in the result.
InstListType::iterator iterator
Instruction iterators...
static BinaryOperator * Create(BinaryOps Op, Value *S1, Value *S2, const Twine &Name=Twine(), Instruction *InsertBefore=nullptr)
Construct a binary instruction, given the opcode and the two operands.
static BinaryOperator * CreateFDivFMF(Value *V1, Value *V2, Instruction *FMFSource, const Twine &Name="")
static BinaryOperator * CreateNeg(Value *Op, const Twine &Name="", Instruction *InsertBefore=nullptr)
Helper functions to construct and inspect unary operations (NEG and NOT) via binary operators SUB and...
BinaryOps getOpcode() const
static BinaryOperator * CreateWithCopiedFlags(BinaryOps Opc, Value *V1, Value *V2, Value *CopyO, const Twine &Name="", Instruction *InsertBefore=nullptr)
static BinaryOperator * CreateNSWNeg(Value *Op, const Twine &Name="", Instruction *InsertBefore=nullptr)
static BinaryOperator * CreateFMulFMF(Value *V1, Value *V2, Instruction *FMFSource, const Twine &Name="")
static BinaryOperator * CreateFSubFMF(Value *V1, Value *V2, Instruction *FMFSource, const Twine &Name="")
static BinaryOperator * CreateFAddFMF(Value *V1, Value *V2, Instruction *FMFSource, const Twine &Name="")
This class represents a function call, abstracting a target machine's calling convention.
static CastInst * CreateZExtOrBitCast(Value *S, Type *Ty, const Twine &Name="", Instruction *InsertBefore=nullptr)
Create a ZExt or BitCast cast instruction.
static CastInst * Create(Instruction::CastOps, Value *S, Type *Ty, const Twine &Name="", Instruction *InsertBefore=nullptr)
Provides a way to construct any of the CastInst subclasses using an opcode instead of the subclass's ...
static Type * makeCmpResultType(Type *opnd_type)
Create a result type for fcmp/icmp.
@ ICMP_ULT
unsigned less than
static Constant * getZExt(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static Constant * getShl(Constant *C1, Constant *C2, bool HasNUW=false, bool HasNSW=false)
static Constant * getTrunc(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static Constant * getExactLogBase2(Constant *C)
If C is a scalar/fixed width vector of known powers of 2, then this function returns a new scalar/fix...
static Constant * getNeg(Constant *C, bool HasNUW=false, bool HasNSW=false)
static Constant * get(Type *Ty, double V)
This returns a ConstantFP, or a vector containing a splat of a ConstantFP, for the specified value in...
static Constant * getInfinity(Type *Ty, bool Negative=false)
This is the shared class of boolean and integer constants.
static ConstantInt * getTrue(LLVMContext &Context)
static Constant * get(Type *Ty, uint64_t V, bool IsSigned=false)
If Ty is a vector type, return a Constant with a splat of the given value.
static ConstantInt * getFalse(LLVMContext &Context)
static ConstantInt * getBool(LLVMContext &Context, bool V)
static Constant * get(ArrayRef< Constant * > V)
This is an important base class in LLVM.
static Constant * getAllOnesValue(Type *Ty)
bool isNormalFP() const
Return true if this is a normal (as opposed to denormal, infinity, nan, or zero) floating-point scala...
static Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
bool isNotMinSignedValue() const
Return true if the value is not the smallest signed value, or, for vectors, does not contain smallest...
This class represents an Operation in the Expression.
A parsed version of the target data layout string in and methods for querying it.
Common base class shared among various IRBuilders.
Value * CreateFAddFMF(Value *L, Value *R, Instruction *FMFSource, const Twine &Name="")
Copy fast-math-flags from an instruction rather than using the builder's default FMF.
CallInst * CreateUnaryIntrinsic(Intrinsic::ID ID, Value *V, Instruction *FMFSource=nullptr, const Twine &Name="")
Create a call to intrinsic ID with 1 operand which is mangled on its type.
Value * CreateICmpULT(Value *LHS, Value *RHS, const Twine &Name="")
Value * CreateTrunc(Value *V, Type *DestTy, const Twine &Name="")
Value * CreateNeg(Value *V, const Twine &Name="", bool HasNUW=false, bool HasNSW=false)
Value * CreateSRem(Value *LHS, Value *RHS, const Twine &Name="")
Value * CreateFMulFMF(Value *L, Value *R, Instruction *FMFSource, const Twine &Name="")
Copy fast-math-flags from an instruction rather than using the builder's default FMF.
CallInst * CreateIntrinsic(Intrinsic::ID ID, ArrayRef< Type * > Types, ArrayRef< Value * > Args, Instruction *FMFSource=nullptr, const Twine &Name="")
Create a call to intrinsic ID with Args, mangled using Types.
Value * CreateFreeze(Value *V, const Twine &Name="")
Value * CreateLShr(Value *LHS, Value *RHS, const Twine &Name="", bool isExact=false)
Value * CreateIsNotNeg(Value *Arg, const Twine &Name="")
Return a boolean value testing if Arg > -1.
void setFastMathFlags(FastMathFlags NewFMF)
Set the fast-math flags to be used with generated fp-math operators.
Value * CreateICmpNE(Value *LHS, Value *RHS, const Twine &Name="")
Value * CreateZExt(Value *V, Type *DestTy, const Twine &Name="")
Value * CreateICmpEQ(Value *LHS, Value *RHS, const Twine &Name="")
Value * CreateIsNeg(Value *Arg, const Twine &Name="")
Return a boolean value testing if Arg < 0.
Value * CreateSub(Value *LHS, Value *RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false)
Value * CreateShl(Value *LHS, Value *RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false)
CallInst * CreateBinaryIntrinsic(Intrinsic::ID ID, Value *LHS, Value *RHS, Instruction *FMFSource=nullptr, const Twine &Name="")
Create a call to intrinsic ID with 2 operands which is mangled on the first type.
Value * CreateAnd(Value *LHS, Value *RHS, const Twine &Name="")
Value * CreateAdd(Value *LHS, Value *RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false)
Value * CreateSDiv(Value *LHS, Value *RHS, const Twine &Name="", bool isExact=false)
Value * CreateBinOp(Instruction::BinaryOps Opc, Value *LHS, Value *RHS, const Twine &Name="", MDNode *FPMathTag=nullptr)
Value * CreateICmpUGE(Value *LHS, Value *RHS, const Twine &Name="")
Value * CreateAShr(Value *LHS, Value *RHS, const Twine &Name="", bool isExact=false)
Value * CreateMul(Value *LHS, Value *RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false)
Instruction * visitMul(BinaryOperator &I)
Instruction * FoldOpIntoSelect(Instruction &Op, SelectInst *SI, bool FoldWithMultiUse=false)
Given an instruction with a select as one operand and a constant as the other operand,...
Instruction * foldBinOpOfSelectAndCastOfSelectCondition(BinaryOperator &I)
Tries to simplify binops of select and cast of the select condition.
Instruction * foldBinOpIntoSelectOrPhi(BinaryOperator &I)
This is a convenience wrapper function for the above two functions.
Instruction * visitUDiv(BinaryOperator &I)
bool SimplifyAssociativeOrCommutative(BinaryOperator &I)
Performs a few simplifications for operators which are associative or commutative.
Value * foldUsingDistributiveLaws(BinaryOperator &I)
Tries to simplify binary operations which some other binary operation distributes over.
Instruction * visitURem(BinaryOperator &I)
Instruction * foldOpIntoPhi(Instruction &I, PHINode *PN)
Given a binary operator, cast instruction, or select which has a PHI node as operand #0,...
Instruction * visitSRem(BinaryOperator &I)
Instruction * visitFDiv(BinaryOperator &I)
bool simplifyDivRemOfSelectWithZeroOp(BinaryOperator &I)
Fold a divide or remainder with a select instruction divisor when one of the select operands is zero.
Instruction * commonIDivTransforms(BinaryOperator &I)
This function implements the transforms common to both integer division instructions (udiv and sdiv).
Instruction * foldBinopWithPhiOperands(BinaryOperator &BO)
For a binary operator with 2 phi operands, try to hoist the binary operation before the phi.
Instruction * visitFRem(BinaryOperator &I)
bool SimplifyDemandedInstructionBits(Instruction &Inst)
Tries to simplify operands to an integer instruction based on its demanded bits.
Instruction * visitFMul(BinaryOperator &I)
Instruction * foldVectorBinop(BinaryOperator &Inst)
Canonicalize the position of binops relative to shufflevector.
Value * SimplifySelectsFeedingBinaryOp(BinaryOperator &I, Value *LHS, Value *RHS)
Instruction * visitSDiv(BinaryOperator &I)
Instruction * commonIRemTransforms(BinaryOperator &I)
This function implements the transforms common to both integer remainder instructions (urem and srem)...
bool isKnownToBeAPowerOfTwo(const Value *V, bool OrZero=false, unsigned Depth=0, const Instruction *CxtI=nullptr)
Instruction * replaceInstUsesWith(Instruction &I, Value *V)
A combiner-aware RAUW-like routine.
void replaceUse(Use &U, Value *NewValue)
Replace use and add the previously used value to the worklist.
InstructionWorklist & Worklist
A worklist of the instructions that need to be simplified.
Instruction * replaceOperand(Instruction &I, unsigned OpNum, Value *V)
Replace operand of instruction and add old operand to the worklist.
void computeKnownBits(const Value *V, KnownBits &Known, unsigned Depth, const Instruction *CxtI) const
bool MaskedValueIsZero(const Value *V, const APInt &Mask, unsigned Depth=0, const Instruction *CxtI=nullptr) const
void push(Instruction *I)
Push the instruction onto the worklist stack.
void setHasNoUnsignedWrap(bool b=true)
Set or clear the nuw flag on this instruction, which must be an operator which supports this flag.
bool hasNoUnsignedWrap() const LLVM_READONLY
Determine whether the no unsigned wrap flag is set.
bool hasNoSignedWrap() const LLVM_READONLY
Determine whether the no signed wrap flag is set.
void setHasNoSignedWrap(bool b=true)
Set or clear the nsw flag on this instruction, which must be an operator which supports this flag.
bool isExact() const LLVM_READONLY
Determine whether the exact flag is set.
void setIsExact(bool b=true)
Set or clear the exact flag on this instruction, which must be an operator which supports this flag.
A wrapper class for inspecting calls to intrinsic functions.
A Module instance is used to store all the information related to an LLVM module.
static Value * Negate(bool LHSIsZero, bool IsNSW, Value *Root, InstCombinerImpl &IC)
Attempt to negate Root.
Utility class for integer operators which may exhibit overflow - Add, Sub, Mul, and Shl.
bool hasNoSignedWrap() const
Test whether this operation is known to never undergo signed overflow, aka the nsw property.
bool hasNoUnsignedWrap() const
Test whether this operation is known to never undergo unsigned overflow, aka the nuw property.
This class represents a sign extension of integer types.
This class represents the LLVM 'select' instruction.
static SelectInst * Create(Value *C, Value *S1, Value *S2, const Twine &NameStr="", Instruction *InsertBefore=nullptr, Instruction *MDFrom=nullptr)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
The instances of the Type class are immutable: once they are created, they are never changed.
bool isIntOrIntVectorTy() const
Return true if this is an integer type or a vector of integer types.
unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
static UnaryOperator * CreateFNegFMF(Value *Op, Instruction *FMFSource, const Twine &Name="", Instruction *InsertBefore=nullptr)
A Use represents the edge between a Value definition and its users.
Value * getOperand(unsigned i) const
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
bool hasOneUse() const
Return true if there is exactly one use of this value.
bool hasNUses(unsigned N) const
Return true if this Value has exactly N uses.
StringRef getName() const
Return a constant reference to the value's name.
void takeName(Value *V)
Transfer the name from V to this value.
This class represents zero extension of integer types.
An efficient, type-erasing, non-owning reference to a callable.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ C
The default llvm calling convention, compatible with C.
cst_pred_ty< is_all_ones > m_AllOnes()
Match an integer or vector with all bits set.
BinaryOp_match< LHS, RHS, Instruction::And > m_And(const LHS &L, const RHS &R)
specific_intval< false > m_SpecificInt(APInt V)
Match a specific integer value or vector with all elements equal to the value.
cst_pred_ty< is_negative > m_Negative()
Match an integer or vector of negative values.
BinaryOp_match< LHS, RHS, Instruction::Add > m_Add(const LHS &L, const RHS &R)
class_match< BinaryOperator > m_BinOp()
Match an arbitrary binary operation and ignore it.
BinaryOp_match< LHS, RHS, Instruction::FMul, true > m_c_FMul(const LHS &L, const RHS &R)
Matches FMul with LHS and RHS in either order.
cst_pred_ty< is_sign_mask > m_SignMask()
Match an integer or vector with only the sign bit(s) set.
OverflowingBinaryOp_match< LHS, RHS, Instruction::Add, OverflowingBinaryOperator::NoUnsignedWrap > m_NUWAdd(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::AShr > m_AShr(const LHS &L, const RHS &R)
apint_match m_APIntAllowUndef(const APInt *&Res)
Match APInt while allowing undefs in splat vector constants.
BinaryOp_match< LHS, RHS, Instruction::FSub > m_FSub(const LHS &L, const RHS &R)
cst_pred_ty< is_power2 > m_Power2()
Match an integer or vector power-of-2.
BinaryOp_match< LHS, RHS, Instruction::URem > m_URem(const LHS &L, const RHS &R)
CastClass_match< OpTy, Instruction::SExt > m_SExt(const OpTy &Op)
Matches SExt.
class_match< Constant > m_Constant()
Match an arbitrary Constant and ignore it.
CastClass_match< OpTy, Instruction::ZExt > m_ZExt(const OpTy &Op)
Matches ZExt.
OverflowingBinaryOp_match< LHS, RHS, Instruction::Sub, OverflowingBinaryOperator::NoSignedWrap > m_NSWSub(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::FMul > m_FMul(const LHS &L, const RHS &R)
bool match(Val *V, const Pattern &P)
specificval_ty m_Specific(const Value *V)
Match if we have a specific specified value.
cst_pred_ty< is_nonnegative > m_NonNegative()
Match an integer or vector of non-negative values.
cst_pred_ty< is_one > m_One()
Match an integer 1 or a vector with all elements equal to 1.
ThreeOps_match< Cond, LHS, RHS, Instruction::Select > m_Select(const Cond &C, const LHS &L, const RHS &R)
Matches SelectInst.
specific_fpval m_SpecificFP(double V)
Match a specific floating point value or vector with all elements equal to the value.
m_Intrinsic_Ty< Opnd0 >::Ty m_Sqrt(const Opnd0 &Op0)
BinaryOp_match< LHS, RHS, Instruction::FAdd > m_FAdd(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::Mul > m_Mul(const LHS &L, const RHS &R)
deferredval_ty< Value > m_Deferred(Value *const &V)
Like m_Specific(), but works if the specific value to match is determined as part of the same match()...
OneUse_match< T > m_OneUse(const T &SubPattern)
MaxMin_match< ICmpInst, LHS, RHS, smin_pred_ty, true > m_c_SMin(const LHS &L, const RHS &R)
Matches an SMin with LHS and RHS in either order.
BinaryOp_match< cst_pred_ty< is_zero_int >, ValTy, Instruction::Sub > m_Neg(const ValTy &V)
Matches a 'Neg' as 'sub 0, V'.
match_combine_and< class_match< Constant >, match_unless< constantexpr_match > > m_ImmConstant()
Match an arbitrary immediate Constant and ignore it.
OverflowingBinaryOp_match< LHS, RHS, Instruction::Shl, OverflowingBinaryOperator::NoSignedWrap > m_NSWShl(const LHS &L, const RHS &R)
OverflowingBinaryOp_match< LHS, RHS, Instruction::Shl, OverflowingBinaryOperator::NoUnsignedWrap > m_NUWShl(const LHS &L, const RHS &R)
OverflowingBinaryOp_match< LHS, RHS, Instruction::Mul, OverflowingBinaryOperator::NoUnsignedWrap > m_NUWMul(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::UDiv > m_UDiv(const LHS &L, const RHS &R)
MaxMin_match< ICmpInst, LHS, RHS, umax_pred_ty > m_UMax(const LHS &L, const RHS &R)
cst_pred_ty< is_negated_power2 > m_NegatedPower2()
Match a integer or vector negated power-of-2.
MaxMin_match< ICmpInst, LHS, RHS, umin_pred_ty, true > m_c_UMin(const LHS &L, const RHS &R)
Matches a UMin with LHS and RHS in either order.
match_combine_or< CastClass_match< OpTy, Instruction::ZExt >, CastClass_match< OpTy, Instruction::SExt > > m_ZExtOrSExt(const OpTy &Op)
BinaryOp_match< LHS, RHS, Instruction::SDiv > m_SDiv(const LHS &L, const RHS &R)
specific_intval< true > m_SpecificIntAllowUndef(APInt V)
MaxMin_match< ICmpInst, LHS, RHS, smax_pred_ty > m_SMax(const LHS &L, const RHS &R)
apint_match m_APInt(const APInt *&Res)
Match a ConstantInt or splatted ConstantVector, binding the specified pointer to the contained APInt.
class_match< Value > m_Value()
Match an arbitrary value and ignore it.
AnyBinaryOp_match< LHS, RHS, true > m_c_BinOp(const LHS &L, const RHS &R)
Matches a BinaryOperator with LHS and RHS in either order.
OverflowingBinaryOp_match< LHS, RHS, Instruction::Add, OverflowingBinaryOperator::NoSignedWrap > m_NSWAdd(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::LShr > m_LShr(const LHS &L, const RHS &R)
Exact_match< T > m_Exact(const T &SubPattern)
FNeg_match< OpTy > m_FNeg(const OpTy &X)
Match 'fneg X' as 'fsub -0.0, X'.
cstfp_pred_ty< is_pos_zero_fp > m_PosZeroFP()
Match a floating-point positive zero.
BinaryOp_match< LHS, RHS, Instruction::Shl > m_Shl(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::FDiv > m_FDiv(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::SRem > m_SRem(const LHS &L, const RHS &R)
BinaryOp_match< cst_pred_ty< is_all_ones >, ValTy, Instruction::Xor, true > m_Not(const ValTy &V)
Matches a 'Not' as 'xor V, -1' or 'xor -1, V'.
BinaryOp_match< LHS, RHS, Instruction::Or > m_Or(const LHS &L, const RHS &R)
is_zero m_Zero()
Match any null constant or a vector with all elements equal to 0.
m_Intrinsic_Ty< Opnd0 >::Ty m_FAbs(const Opnd0 &Op0)
BinaryOp_match< LHS, RHS, Instruction::Mul, true > m_c_Mul(const LHS &L, const RHS &R)
Matches a Mul with LHS and RHS in either order.
OverflowingBinaryOp_match< LHS, RHS, Instruction::Mul, OverflowingBinaryOperator::NoSignedWrap > m_NSWMul(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::Sub > m_Sub(const LHS &L, const RHS &R)
match_combine_or< LTy, RTy > m_CombineOr(const LTy &L, const RTy &R)
Combine two pattern matchers matching L || R.
This is an optimization pass for GlobalISel generic memory operations.
Value * emitUnaryFloatFnCall(Value *Op, const TargetLibraryInfo *TLI, StringRef Name, IRBuilderBase &B, const AttributeList &Attrs)
Emit a call to the unary function named 'Name' (e.g.
Value * simplifyFMulInst(Value *LHS, Value *RHS, FastMathFlags FMF, const SimplifyQuery &Q, fp::ExceptionBehavior ExBehavior=fp::ebIgnore, RoundingMode Rounding=RoundingMode::NearestTiesToEven)
Given operands for an FMul, fold the result or return null.
Value * simplifySDivInst(Value *LHS, Value *RHS, bool IsExact, const SimplifyQuery &Q)
Given operands for an SDiv, fold the result or return null.
Value * simplifyMulInst(Value *LHS, Value *RHS, bool IsNSW, bool IsNUW, const SimplifyQuery &Q)
Given operands for a Mul, fold the result or return null.
bool hasFloatFn(const Module *M, const TargetLibraryInfo *TLI, Type *Ty, LibFunc DoubleFn, LibFunc FloatFn, LibFunc LongDoubleFn)
Check whether the overloaded floating point function corresponding to Ty is available.
bool matchSimpleRecurrence(const PHINode *P, BinaryOperator *&BO, Value *&Start, Value *&Step)
Attempt to match a simple first order recurrence cycle of the form: iv = phi Ty [Start,...
Constant * ConstantFoldUnaryOpOperand(unsigned Opcode, Constant *Op, const DataLayout &DL)
Attempt to constant fold a unary operation with the specified operand.
SelectPatternFlavor
Specific patterns of select instructions we can match.
@ SPF_ABS
Floating point maxnum.
@ SPF_NABS
Absolute value.
Value * simplifyFRemInst(Value *LHS, Value *RHS, FastMathFlags FMF, const SimplifyQuery &Q, fp::ExceptionBehavior ExBehavior=fp::ebIgnore, RoundingMode Rounding=RoundingMode::NearestTiesToEven)
Given operands for an FRem, fold the result or return null.
SelectPatternResult matchSelectPattern(Value *V, Value *&LHS, Value *&RHS, Instruction::CastOps *CastOp=nullptr, unsigned Depth=0)
Pattern match integer [SU]MIN, [SU]MAX and ABS idioms, returning the kind and providing the out param...
Constant * ConstantFoldBinaryOpOperands(unsigned Opcode, Constant *LHS, Constant *RHS, const DataLayout &DL)
Attempt to constant fold a binary operation with the specified operands.
Value * simplifyICmpInst(unsigned Predicate, Value *LHS, Value *RHS, const SimplifyQuery &Q)
Given operands for an ICmpInst, fold the result or return null.
Value * simplifyFDivInst(Value *LHS, Value *RHS, FastMathFlags FMF, const SimplifyQuery &Q, fp::ExceptionBehavior ExBehavior=fp::ebIgnore, RoundingMode Rounding=RoundingMode::NearestTiesToEven)
Given operands for an FDiv, fold the result or return null.
bool haveNoCommonBitsSet(const Value *LHS, const Value *RHS, const DataLayout &DL, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true)
Return true if LHS and RHS have no common bits set.
@ Mul
Product of integers.
@ And
Bitwise or logical AND of integers.
Value * simplifyUDivInst(Value *LHS, Value *RHS, bool IsExact, const SimplifyQuery &Q)
Given operands for a UDiv, fold the result or return null.
DWARFExpression::Operation Op
constexpr unsigned BitWidth
bool isGuaranteedToTransferExecutionToSuccessor(const Instruction *I)
Return true if this function can prove that the instruction I will always transfer execution to one o...
bool isKnownNonNegative(const Value *V, const DataLayout &DL, unsigned Depth=0, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true)
Returns true if the give value is known to be non-negative.
Value * simplifySRemInst(Value *LHS, Value *RHS, const SimplifyQuery &Q)
Given operands for an SRem, fold the result or return null.
unsigned Log2(Align A)
Returns the log2 of the alignment.
Value * simplifyURemInst(Value *LHS, Value *RHS, const SimplifyQuery &Q)
Given operands for a URem, fold the result or return null.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
bool isNonNegative() const
Returns true if this value is known to be non-negative.
unsigned countMinTrailingZeros() const
Returns the minimum number of trailing zero bits.
SelectPatternFlavor Flavor
SimplifyQuery getWithInstruction(Instruction *I) const