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();
115 bool HasAnyNoWrap =
I.hasNoSignedWrap() ||
I.hasNoUnsignedWrap();
157 bool PropagateNSW = HasNSW && cast<ShlOperator>(
Y)->hasNoSignedWrap();
172 Value *Shl = Builder.
CreateShl(FrX, Z,
"mulshl", HasNUW, PropagateNSW);
193 bool AssumeNonZero,
bool DoFold);
196 Value *Op0 =
I.getOperand(0), *Op1 =
I.getOperand(1);
214 Type *Ty =
I.getType();
216 const bool HasNSW =
I.hasNoSignedWrap();
217 const bool HasNUW =
I.hasNoUnsignedWrap();
236 assert(Shl &&
"Constant folding of immediate constants failed");
239 if (HasNUW &&
Mul->hasNoUnsignedWrap())
255 if (
match(NewCst,
m_APInt(V)) && *V != V->getBitWidth() - 1)
269 auto *Op1C = cast<Constant>(Op1);
273 HasNSW && Op1C->isNotMinSignedValue()));
282 const APInt *NegPow2C;
286 unsigned SrcWidth =
X->getType()->getScalarSizeInBits();
288 if (ShiftAmt >=
BitWidth - SrcWidth) {
291 return BinaryOperator::CreateShl(Z, ConstantInt::get(Ty, ShiftAmt));
312 auto *BOp0 = cast<BinaryOperator>(Op0);
314 (BOp0->getOpcode() == Instruction::Or || BOp0->hasNoUnsignedWrap());
316 auto *BO = BinaryOperator::CreateAdd(NewMul, NewC);
317 if (HasNUW && Op0NUW) {
319 if (
auto *NewMulBO = dyn_cast<BinaryOperator>(NewMul))
320 NewMulBO->setHasNoUnsignedWrap();
321 BO->setHasNoUnsignedWrap();
329 if (Op0 == Op1 &&
match(Op0, m_Intrinsic<Intrinsic::abs>(
m_Value(
X))))
330 return BinaryOperator::CreateMul(
X,
X);
335 if (
I.hasNoSignedWrap() &&
353 auto *NewMul = BinaryOperator::CreateMul(
X,
Y);
354 if (HasNSW && cast<OverflowingBinaryOperator>(Op0)->
hasNoSignedWrap() &&
356 NewMul->setHasNoSignedWrap();
369 return BinaryOperator::CreateMul(NegOp0,
X);
377 auto UDivCheck = [&C1](
const APInt &
C) {
return C.urem(*C1).isZero(); };
378 auto SDivCheck = [&C1](
const APInt &
C) {
386 auto BOpc = cast<BinaryOperator>(Op0)->getOpcode();
399 if (!Div || (Div->
getOpcode() != Instruction::UDiv &&
400 Div->
getOpcode() != Instruction::SDiv)) {
402 Div = dyn_cast<BinaryOperator>(Op1);
404 Value *Neg = dyn_castNegVal(
Y);
407 (Div->
getOpcode() == Instruction::UDiv ||
408 Div->
getOpcode() == Instruction::SDiv)) {
418 auto RemOpc = Div->
getOpcode() == Instruction::UDiv ? Instruction::URem
426 return BinaryOperator::CreateSub(XFreeze, Rem);
427 return BinaryOperator::CreateSub(Rem, XFreeze);
439 return BinaryOperator::CreateAnd(Op0, Op1);
451 X->getType()->isIntOrIntVectorTy(1) &&
X->getType() ==
Y->getType() &&
452 (Op0->
hasOneUse() || Op1->hasOneUse() ||
X ==
Y)) {
461 X->getType()->isIntOrIntVectorTy(1) &&
X->getType() ==
Y->getType() &&
462 (Op0->
hasOneUse() || Op1->hasOneUse())) {
477 X->getType()->isIntOrIntVectorTy(1))
492 *
C ==
C->getBitWidth() - 1) {
504 *
C ==
C->getBitWidth() - 1) {
557 bool Changed =
false;
558 if (!HasNSW && willNotOverflowSignedMul(Op0, Op1,
I)) {
560 I.setHasNoSignedWrap(
true);
563 if (!HasNUW && willNotOverflowUnsignedMul(Op0, Op1,
I,
I.hasNoSignedWrap())) {
565 I.setHasNoUnsignedWrap(
true);
568 return Changed ? &
I :
nullptr;
573 assert((Opcode == Instruction::FMul || Opcode == Instruction::FDiv) &&
574 "Expected fmul or fdiv");
576 Value *Op0 =
I.getOperand(0), *Op1 =
I.getOperand(1);
592 (Op0->
hasOneUse() || Op1->hasOneUse())) {
610 Intrinsic::powi, {
X->getType(), YZ->
getType()}, {
X, YZ}, &
I);
616 unsigned Opcode =
I.getOpcode();
617 assert((Opcode == Instruction::FMul || Opcode == Instruction::FDiv) &&
618 "Unexpected opcode");
625 Constant *One = ConstantInt::get(
Y->getType(), 1);
626 if (willNotOverflowSignedAdd(
Y, One,
I)) {
633 Value *Op0 =
I.getOperand(0);
634 Value *Op1 =
I.getOperand(1);
635 if (Opcode == Instruction::FMul &&
I.isOnlyUserOfAnyOperand() &&
640 Y->getType() == Z->getType()) {
645 if (Opcode == Instruction::FDiv &&
I.hasAllowReassoc() &&
I.hasNoNaNs()) {
652 willNotOverflowSignedSub(
Y, ConstantInt::get(
Y->getType(), 1),
I)) {
654 Instruction *NewPow = createPowiExpr(
I, *
this, Op1,
Y, NegOne);
665 willNotOverflowSignedSub(
Y, ConstantInt::get(
Y->getType(), 1),
I)) {
667 auto *NewPow = createPowiExpr(
I, *
this,
X,
Y, NegOne);
676 Value *Op0 =
I.getOperand(0);
677 Value *Op1 =
I.getOperand(1);
739 BinaryOperator *DivOp = cast<BinaryOperator>(((Z == Op0) ? Op1 : Op0));
766 if (
I.hasNoSignedZeros() &&
770 if (
I.hasNoSignedZeros() &&
777 if (
I.hasNoNaNs() &&
I.hasNoSignedZeros() && Op0 == Op1 && Op0->
hasNUses(2)) {
804 if (
I.isOnlyUserOfAnyOperand()) {
858 I.getFastMathFlags(),
884 Value *Op0 =
I.getOperand(0), *Op1 =
I.getOperand(1);
899 {
I.getType()}, {Op1, Op0}, &
I);
910 if (
I.hasNoNaNs() &&
I.hasNoSignedZeros()) {
915 X->getType()->isIntOrIntVectorTy(1)) {
917 SI->copyFastMathFlags(
I.getFastMathFlags());
921 X->getType()->isIntOrIntVectorTy(1)) {
923 SI->copyFastMathFlags(
I.getFastMathFlags());
932 if (
I.hasAllowReassoc())
941 Log2 = cast<IntrinsicInst>(Op0);
946 Log2 = cast<IntrinsicInst>(Op1);
960 Value *Start =
nullptr, *Step =
nullptr;
974 if (!Result->hasNoNaNs())
975 Result->setHasNoInfs(
false);
986 SelectInst *SI = dyn_cast<SelectInst>(
I.getOperand(1));
1011 Value *SelectCond = SI->getCondition();
1012 if (SI->use_empty() && SelectCond->
hasOneUse())
1018 while (BBI != BBFront) {
1026 for (
Use &
Op : BBI->operands()) {
1030 }
else if (
Op == SelectCond) {
1040 if (&*BBI == SelectCond)
1041 SelectCond =
nullptr;
1044 if (!SelectCond && !SI)
1055 Product = IsSigned ? C1.
smul_ov(C2, Overflow) : C1.
umul_ov(C2, Overflow);
1082 assert((
I.getOpcode() == Instruction::SDiv ||
1083 I.getOpcode() == Instruction::UDiv) &&
1084 "Expected integer divide");
1086 bool IsSigned =
I.getOpcode() == Instruction::SDiv;
1087 Value *Op0 =
I.getOperand(0), *Op1 =
I.getOperand(1);
1088 Type *Ty =
I.getType();
1097 auto *
Mul = cast<OverflowingBinaryOperator>(Op0);
1098 auto *Shl = cast<OverflowingBinaryOperator>(Op1);
1099 bool HasNUW =
Mul->hasNoUnsignedWrap() && Shl->hasNoUnsignedWrap();
1100 bool HasNSW =
Mul->hasNoSignedWrap() && Shl->hasNoSignedWrap();
1103 if (!IsSigned && HasNUW)
1107 if (IsSigned && HasNSW && (Op0->
hasOneUse() || Op1->hasOneUse())) {
1117 auto *Shl0 = cast<OverflowingBinaryOperator>(Op0);
1118 auto *Shl1 = cast<OverflowingBinaryOperator>(Op1);
1124 ((Shl0->hasNoUnsignedWrap() && Shl1->hasNoUnsignedWrap()) ||
1125 (Shl0->hasNoUnsignedWrap() && Shl0->hasNoSignedWrap() &&
1126 Shl1->hasNoSignedWrap())))
1131 if (IsSigned && Shl0->hasNoSignedWrap() && Shl1->hasNoSignedWrap() &&
1132 Shl1->hasNoUnsignedWrap())
1140 auto *Shl0 = cast<OverflowingBinaryOperator>(Op0);
1141 auto *Shl1 = cast<OverflowingBinaryOperator>(Op1);
1143 if (IsSigned ? (Shl0->hasNoSignedWrap() && Shl1->hasNoSignedWrap())
1144 : (Shl0->hasNoUnsignedWrap() && Shl1->hasNoUnsignedWrap())) {
1145 Constant *One = ConstantInt::get(
X->getType(), 1);
1149 One,
Y,
"shl.dividend",
1152 IsSigned ? (Shl0->hasNoUnsignedWrap() || Shl1->hasNoUnsignedWrap())
1153 : Shl0->hasNoSignedWrap());
1154 return Builder.
CreateLShr(Dividend, Z,
"",
I.isExact());
1163 assert(
I.isIntDivRem() &&
"Unexpected instruction");
1164 Value *Op0 =
I.getOperand(0), *Op1 =
I.getOperand(1);
1168 auto *Op1C = dyn_cast<Constant>(Op1);
1169 Type *Ty =
I.getType();
1170 auto *VTy = dyn_cast<FixedVectorType>(Ty);
1172 unsigned NumElts = VTy->getNumElements();
1173 for (
unsigned i = 0; i != NumElts; ++i) {
1175 if (Elt && (Elt->
isNullValue() || isa<UndefValue>(Elt)))
1213 Value *Op0 =
I.getOperand(0), *Op1 =
I.getOperand(1);
1214 bool IsSigned =
I.getOpcode() == Instruction::SDiv;
1215 Type *Ty =
I.getType();
1228 ConstantInt::get(Ty, Product));
1236 if (
isMultiple(*C2, *C1, Quotient, IsSigned)) {
1238 ConstantInt::get(Ty, Quotient));
1239 NewDiv->setIsExact(
I.isExact());
1244 if (
isMultiple(*C1, *C2, Quotient, IsSigned)) {
1246 ConstantInt::get(Ty, Quotient));
1247 auto *OBO = cast<OverflowingBinaryOperator>(Op0);
1248 Mul->setHasNoUnsignedWrap(!IsSigned && OBO->hasNoUnsignedWrap());
1249 Mul->setHasNoSignedWrap(OBO->hasNoSignedWrap());
1262 if (
isMultiple(*C2, C1Shifted, Quotient, IsSigned)) {
1264 ConstantInt::get(Ty, Quotient));
1265 BO->setIsExact(
I.isExact());
1270 if (
isMultiple(C1Shifted, *C2, Quotient, IsSigned)) {
1272 ConstantInt::get(Ty, Quotient));
1273 auto *OBO = cast<OverflowingBinaryOperator>(Op0);
1274 Mul->setHasNoUnsignedWrap(!IsSigned && OBO->hasNoUnsignedWrap());
1275 Mul->setHasNoSignedWrap(OBO->hasNoSignedWrap());
1288 return BinaryOperator::CreateNSWAdd(
X, ConstantInt::get(Ty, Quotient));
1293 return BinaryOperator::CreateNUWAdd(
X,
1294 ConstantInt::get(Ty, C1->
udiv(*C2)));
1335 return BinaryOperator::CreateNSWShl(ConstantInt::get(Ty, 1),
Y);
1337 return BinaryOperator::CreateNUWShl(ConstantInt::get(Ty, 1),
Y);
1341 bool HasNSW = cast<OverflowingBinaryOperator>(Op1)->hasNoSignedWrap();
1342 bool HasNUW = cast<OverflowingBinaryOperator>(Op1)->hasNoUnsignedWrap();
1343 if ((IsSigned && HasNSW) || (!IsSigned && HasNUW)) {
1352 if (!IsSigned && Op1->hasOneUse() &&
1370 auto *InnerDiv = cast<PossiblyExactOperator>(Op0);
1371 auto *
Mul = cast<OverflowingBinaryOperator>(InnerDiv->getOperand(0));
1373 if (!IsSigned &&
Mul->hasNoUnsignedWrap())
1374 NewDiv = BinaryOperator::CreateUDiv(
X,
Y);
1375 else if (IsSigned &&
Mul->hasNoSignedWrap())
1376 NewDiv = BinaryOperator::CreateSDiv(
X,
Y);
1380 NewDiv->
setIsExact(
I.isExact() && InnerDiv->isExact());
1387 auto OB0HasNSW = cast<OverflowingBinaryOperator>(Op0)->
hasNoSignedWrap();
1388 auto OB0HasNUW = cast<OverflowingBinaryOperator>(Op0)->hasNoUnsignedWrap();
1391 auto OB1HasNSW = cast<OverflowingBinaryOperator>(Op1)->
hasNoSignedWrap();
1393 cast<OverflowingBinaryOperator>(Op1)->hasNoUnsignedWrap();
1394 const APInt *C1, *C2;
1395 if (IsSigned && OB0HasNSW) {
1397 return BinaryOperator::CreateSDiv(
A,
B);
1399 if (!IsSigned && OB0HasNUW) {
1401 return BinaryOperator::CreateUDiv(
A,
B);
1403 return BinaryOperator::CreateUDiv(
A,
B);
1409 if (
auto *Val = CreateDivOrNull(
Y, Z))
1413 if (
auto *Val = CreateDivOrNull(
X, Z))
1426 bool AssumeNonZero,
bool DoFold) {
1429 return reinterpret_cast<Value *
>(-1);
1437 return IfFold([&]() {
1453 return IfFold([&]() {
return Builder.
CreateZExt(LogX,
Op->getType()); });
1458 auto *TI = cast<TruncInst>(
Op);
1459 if (AssumeNonZero || TI->hasNoUnsignedWrap())
1461 return IfFold([&]() {
1463 TI->hasNoUnsignedWrap());
1470 auto *BO = cast<OverflowingBinaryOperator>(
Op);
1472 if (AssumeNonZero || BO->hasNoUnsignedWrap() || BO->hasNoSignedWrap())
1474 return IfFold([&]() {
return Builder.
CreateAdd(LogX,
Y); });
1480 auto *PEO = cast<PossiblyExactOperator>(
Op);
1481 if (AssumeNonZero || PEO->isExact())
1483 return IfFold([&]() {
return Builder.
CreateSub(LogX,
Y); });
1490 return IfFold([&]() {
return LogX; });
1492 return IfFold([&]() {
return LogY; });
1499 AssumeNonZero, DoFold))
1501 AssumeNonZero, DoFold))
1502 return IfFold([&]() {
1503 return Builder.
CreateSelect(SI->getOperand(0), LogX, LogY);
1508 auto *
MinMax = dyn_cast<MinMaxIntrinsic>(
Op);
1516 return IfFold([&]() {
1532 Type *Ty =
I.getType();
1535 X->getType() ==
Y->getType() && (
N->hasOneUse() ||
D->hasOneUse())) {
1581 Value *Op0 =
I.getOperand(0), *Op1 =
I.getOperand(1);
1583 const APInt *C1, *C2;
1591 X, ConstantInt::get(
X->getType(), C2ShlC1));
1600 Type *Ty =
I.getType();
1621 if (
I.isExact() && cast<PossiblyExactOperator>(Op0)->isExact())
1650 Value *Op0 =
I.getOperand(0), *Op1 =
I.getOperand(1);
1651 Type *Ty =
I.getType();
1667 return BinaryOperator::CreateExactAShr(Op0,
C);
1673 return BinaryOperator::CreateExactAShr(Op0, ShAmt);
1708 Constant *NegC = ConstantInt::get(Ty, -(*Op1C));
1742 auto *BO = BinaryOperator::CreateUDiv(Op0, Op1,
I.getName());
1743 BO->setIsExact(
I.isExact());
1761 auto *BO = BinaryOperator::CreateUDiv(Op0, Op1,
I.getName());
1762 BO->setIsExact(
I.isExact());
1792 if (
I.hasNoNaNs() &&
1797 Intrinsic::copysign, {
C->getType()},
1806 if (!(
C->hasExactInverseFP() || (
I.hasAllowReciprocal() &&
C->isNormalFP())))
1814 Instruction::FDiv, ConstantFP::get(
I.getType(), 1.0),
C,
DL);
1815 if (!RecipC || !RecipC->isNormalFP())
1835 if (!
I.hasAllowReassoc() || !
I.hasAllowReciprocal())
1860 Value *Op0 =
I.getOperand(0), *Op1 =
I.getOperand(1);
1861 auto *
II = dyn_cast<IntrinsicInst>(Op1);
1862 if (!
II || !
II->hasOneUse() || !
I.hasAllowReassoc() ||
1863 !
I.hasAllowReciprocal())
1873 case Intrinsic::pow:
1874 Args.push_back(
II->getArgOperand(0));
1877 case Intrinsic::powi: {
1885 Args.push_back(
II->getArgOperand(0));
1886 Args.push_back(Builder.
CreateNeg(
II->getArgOperand(1)));
1887 Type *Tys[] = {
I.getType(),
II->getArgOperand(1)->getType()};
1891 case Intrinsic::exp:
1892 case Intrinsic::exp2:
1907 if (!
I.hasAllowReassoc() || !
I.hasAllowReciprocal())
1909 Value *Op0 =
I.getOperand(0), *Op1 =
I.getOperand(1);
1910 auto *
II = dyn_cast<IntrinsicInst>(Op1);
1911 if (!
II ||
II->getIntrinsicID() != Intrinsic::sqrt || !
II->hasOneUse() ||
1912 !
II->hasAllowReassoc() || !
II->hasAllowReciprocal())
1916 auto *DivOp = dyn_cast<Instruction>(
II->getOperand(0));
1921 if (!DivOp->hasAllowReassoc() || !
I.hasAllowReciprocal() ||
1922 !DivOp->hasOneUse())
1934 I.getFastMathFlags(),
1953 Value *Op0 =
I.getOperand(0), *Op1 =
I.getOperand(1);
1954 if (isa<Constant>(Op0))
1955 if (
SelectInst *SI = dyn_cast<SelectInst>(Op1))
1959 if (isa<Constant>(Op1))
1960 if (
SelectInst *SI = dyn_cast<SelectInst>(Op0))
1964 if (
I.hasAllowReassoc() &&
I.hasAllowReciprocal()) {
1967 (!isa<Constant>(
Y) || !isa<Constant>(Op1))) {
1973 (!isa<Constant>(
Y) || !isa<Constant>(Op0))) {
1988 if (
I.hasAllowReassoc() && Op0->
hasOneUse() && Op1->hasOneUse()) {
1992 bool IsTan =
match(Op0, m_Intrinsic<Intrinsic::sin>(
m_Value(
X))) &&
1995 !IsTan &&
match(Op0, m_Intrinsic<Intrinsic::cos>(
m_Value(
X))) &&
1998 if ((IsTan || IsCot) &&
hasFloatFn(M, &
TLI,
I.getType(), LibFunc_tan,
1999 LibFunc_tanf, LibFunc_tanl)) {
2002 B.setFastMathFlags(
I.getFastMathFlags());
2004 cast<CallBase>(Op0)->getCalledFunction()->getAttributes();
2006 LibFunc_tanl,
B, Attrs);
2008 Res =
B.CreateFDiv(ConstantFP::get(
I.getType(), 1.0), Res);
2017 if (
I.hasNoNaNs() &&
I.hasAllowReassoc() &&
2026 if (
I.hasNoNaNs() &&
I.hasNoInfs() &&
2030 Intrinsic::copysign, ConstantFP::get(
I.getType(), 1.0),
X, &
I);
2041 if (
I.hasAllowReassoc() &&
2064 Value *Op0 =
I.getOperand(0), *Op1 =
I.getOperand(1), *
X =
nullptr;
2066 bool ShiftByX =
false;
2070 const APInt *Tmp =
nullptr;
2086 const APInt *Tmp =
nullptr;
2098 if (MatchShiftOrMulXC(Op0,
X,
Y) && MatchShiftOrMulXC(Op1,
X, Z)) {
2100 }
else if (MatchShiftCX(Op0,
Y,
X) && MatchShiftCX(Op1, Z,
X)) {
2106 bool IsSRem =
I.getOpcode() == Instruction::SRem;
2113 bool BO0NoWrap = IsSRem ? BO0HasNSW : BO0HasNUW;
2115 APInt RemYZ = IsSRem ?
Y.srem(Z) :
Y.urem(Z);
2119 if (RemYZ.
isZero() && BO0NoWrap)
2125 auto CreateMulOrShift =
2127 Value *RemSimplification =
2128 ConstantInt::get(
I.getType(), RemSimplificationC);
2129 return ShiftByX ? BinaryOperator::CreateShl(RemSimplification,
X)
2130 : BinaryOperator::CreateMul(
X, RemSimplification);
2136 bool BO1NoWrap = IsSRem ? BO1HasNSW : BO1HasNUW;
2140 if (RemYZ ==
Y && BO1NoWrap) {
2151 if (
Y.uge(Z) && (IsSRem ? (BO0HasNSW && BO1HasNSW) : BO0HasNUW)) {
2169 Value *Op0 =
I.getOperand(0), *Op1 =
I.getOperand(1);
2171 if (isa<Constant>(Op1)) {
2172 if (
Instruction *Op0I = dyn_cast<Instruction>(Op0)) {
2173 if (
SelectInst *SI = dyn_cast<SelectInst>(Op0I)) {
2176 }
else if (
auto *PN = dyn_cast<PHINode>(Op0I)) {
2177 const APInt *Op1Int;
2179 (
I.getOpcode() == Instruction::URem ||
2216 Value *Op0 =
I.getOperand(0), *Op1 =
I.getOperand(1);
2217 Type *Ty =
I.getType();
2223 return BinaryOperator::CreateAnd(Op0,
Add);
2249 Value *FrozenOp0 = Op0;
2262 Value *FrozenOp0 = Op0;
2285 Value *Op0 =
I.getOperand(0), *Op1 =
I.getOperand(1);
2304 return BinaryOperator::CreateURem(Op0, Op1,
I.getName());
2308 if (isa<ConstantVector>(Op1) || isa<ConstantDataVector>(Op1)) {
2310 unsigned VWidth = cast<FixedVectorType>(
C->getType())->getNumElements();
2312 bool hasNegative =
false;
2313 bool hasMissing =
false;
2314 for (
unsigned i = 0; i != VWidth; ++i) {
2315 Constant *Elt =
C->getAggregateElement(i);
2322 if (
RHS->isNegative())
2326 if (hasNegative && !hasMissing) {
2328 for (
unsigned i = 0; i != VWidth; ++i) {
2329 Elts[i] =
C->getAggregateElement(i);
2331 if (
RHS->isNegative())
2347 I.getFastMathFlags(),
This file implements a class to represent arbitrary precision integral constant values and operations...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
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 Instruction * narrowUDivURem(BinaryOperator &I, InstCombinerImpl &IC)
If we have zero-extended operands of an unsigned div or rem, we may be able to narrow the operation (...
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 const unsigned MaxDepth
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 * foldFDivSqrtDivisor(BinaryOperator &I, InstCombiner::BuilderTy &Builder)
Convert div to mul if we have an sqrt divisor iff sqrt's operand is a fdiv instruction.
static Instruction * foldFDivConstantDividend(BinaryOperator &I)
Remove negation and try to reassociate constant math.
static Value * foldIDivShl(BinaryOperator &I, InstCombiner::BuilderTy &Builder)
This file provides the interface for the instcombine pass implementation.
static bool hasNoSignedWrap(BinaryOperator &I)
static bool hasNoUnsignedWrap(BinaryOperator &I)
uint64_t IntrinsicInst * II
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.
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
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
bool ule(const APInt &RHS) const
Unsigned less or equal comparison.
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 * CreateFAddFMF(Value *V1, Value *V2, FastMathFlags FMF, const Twine &Name="")
static BinaryOperator * CreateNeg(Value *Op, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Helper functions to construct and inspect unary operations (NEG and NOT) via binary operators SUB and...
BinaryOps getOpcode() const
static BinaryOperator * CreateExact(BinaryOps Opc, Value *V1, Value *V2, const Twine &Name="")
static BinaryOperator * Create(BinaryOps Op, Value *S1, Value *S2, const Twine &Name=Twine(), InsertPosition InsertBefore=nullptr)
Construct a binary instruction, given the opcode and the two operands.
static BinaryOperator * CreateFMulFMF(Value *V1, Value *V2, FastMathFlags FMF, const Twine &Name="")
static BinaryOperator * CreateFDivFMF(Value *V1, Value *V2, FastMathFlags FMF, const Twine &Name="")
static BinaryOperator * CreateFSubFMF(Value *V1, Value *V2, FastMathFlags FMF, const Twine &Name="")
static BinaryOperator * CreateWithCopiedFlags(BinaryOps Opc, Value *V1, Value *V2, Value *CopyO, const Twine &Name="", InsertPosition InsertBefore=nullptr)
static BinaryOperator * CreateNSWNeg(Value *Op, const Twine &Name="", InsertPosition InsertBefore=nullptr)
This class represents a function call, abstracting a target machine's calling convention.
static CastInst * CreateZExtOrBitCast(Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Create a ZExt or BitCast cast instruction.
static CastInst * Create(Instruction::CastOps, Value *S, Type *Ty, const Twine &Name="", InsertPosition 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 * getNeg(Constant *C, 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 * getInfinity(Type *Ty, bool Negative=false)
This is the shared class of boolean and integer constants.
static ConstantInt * getTrue(LLVMContext &Context)
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.
Constant * getAggregateElement(unsigned Elt) const
For aggregates (struct/array/vector) return the constant that corresponds to the specified element if...
bool isNotMinSignedValue() const
Return true if the value is not the smallest signed value, or, for vectors, does not contain smallest...
bool isNullValue() const
Return true if this is the value that would be returned by getNullValue.
This class represents an Operation in the Expression.
A parsed version of the target data layout string in and methods for querying it.
Convenience struct for specifying and reasoning about fast-math flags.
bool allowReassoc() const
Flag queries.
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 * CreateSRem(Value *LHS, Value *RHS, const Twine &Name="")
Value * 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 * 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.
Value * CreateFDivFMF(Value *L, Value *R, Instruction *FMFSource, const Twine &Name="")
Copy fast-math-flags from an instruction rather than using the builder's default FMF.
ConstantInt * getTrue()
Get the constant value for i1 true.
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 * CreateFNegFMF(Value *V, Instruction *FMFSource, const Twine &Name="")
Copy fast-math-flags from an instruction rather than using the builder's default FMF.
Value * CreateSelect(Value *C, Value *True, Value *False, const Twine &Name="", Instruction *MDFrom=nullptr)
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 * CreateNSWMul(Value *LHS, Value *RHS, const Twine &Name="")
Value * CreateUDiv(Value *LHS, Value *RHS, const Twine &Name="", bool isExact=false)
Value * CreateICmpNE(Value *LHS, Value *RHS, const Twine &Name="")
Value * CreateNeg(Value *V, const Twine &Name="", bool HasNSW=false)
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)
Value * CreateZExt(Value *V, Type *DestTy, const Twine &Name="", bool IsNonNeg=false)
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 * CreateTrunc(Value *V, Type *DestTy, const Twine &Name="", bool IsNUW=false, bool IsNSW=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 * CreateFMul(Value *L, Value *R, const Twine &Name="", MDNode *FPMD=nullptr)
Value * CreateFNeg(Value *V, const Twine &Name="", MDNode *FPMathTag=nullptr)
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, bool AllowMultipleUses=false)
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.
Constant * getLosslessUnsignedTrunc(Constant *C, Type *TruncTy)
Instruction * commonIDivRemTransforms(BinaryOperator &I)
Common integer divide/remainder transforms.
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 * foldFMulReassoc(BinaryOperator &I)
Instruction * foldVectorBinop(BinaryOperator &Inst)
Canonicalize the position of binops relative to shufflevector.
Value * SimplifySelectsFeedingBinaryOp(BinaryOperator &I, Value *LHS, Value *RHS)
Instruction * foldPowiReassoc(BinaryOperator &I)
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.
FastMathFlags getFastMathFlags() const LLVM_READONLY
Convenience function for getting all the fast-math flags, which must be an operator which supports th...
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.
static PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
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="", InsertPosition 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="", InsertPosition 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)
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.
BinaryOp_match< LHS, RHS, Instruction::AShr > m_AShr(const LHS &L, const RHS &R)
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)
class_match< Constant > m_Constant()
Match an arbitrary Constant and ignore it.
AllowReassoc_match< T > m_AllowReassoc(const T &SubPattern)
CastInst_match< OpTy, TruncInst > m_Trunc(const OpTy &Op)
Matches Trunc.
specific_intval< false > m_SpecificInt(const APInt &V)
Match a specific integer value or vector with all elements equal to the value.
BinaryOp_match< LHS, RHS, Instruction::FMul > m_FMul(const LHS &L, const RHS &R)
bool match(Val *V, const Pattern &P)
cstfp_pred_ty< is_any_zero_fp > m_AnyZeroFP()
Match a floating-point negative zero or positive zero.
specificval_ty m_Specific(const Value *V)
Match if we have a specific specified value.
specific_intval< true > m_SpecificIntAllowPoison(const APInt &V)
OverflowingBinaryOp_match< cst_pred_ty< is_zero_int >, ValTy, Instruction::Sub, OverflowingBinaryOperator::NoSignedWrap > m_NSWNeg(const ValTy &V)
Matches a 'Neg' as 'sub nsw 0, V'.
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()...
apint_match m_APIntAllowPoison(const APInt *&Res)
Match APInt while allowing poison in splat vector constants.
OneUse_match< T > m_OneUse(const T &SubPattern)
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)
CastInst_match< OpTy, ZExtInst > m_ZExt(const OpTy &Op)
Matches ZExt.
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)
cst_pred_ty< is_negated_power2 > m_NegatedPower2()
Match a integer or vector negated power-of-2.
cst_pred_ty< custom_checkfn< APInt > > m_CheckedInt(function_ref< bool(const APInt &)> CheckFn)
Match an integer or vector where CheckFn(ele) for each element is true.
apfloat_match m_APFloatAllowPoison(const APFloat *&Res)
Match APFloat while allowing poison in splat vector constants.
match_combine_or< BinaryOp_match< LHS, RHS, Instruction::Add >, DisjointOr_match< LHS, RHS > > m_AddLike(const LHS &L, const RHS &R)
Match either "add" or "or disjoint".
CastInst_match< OpTy, UIToFPInst > m_UIToFP(const OpTy &Op)
BinaryOp_match< LHS, RHS, Instruction::SDiv > m_SDiv(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.
match_combine_or< OverflowingBinaryOp_match< LHS, RHS, Instruction::Add, OverflowingBinaryOperator::NoSignedWrap >, DisjointOr_match< LHS, RHS > > m_NSWAddLike(const LHS &L, const RHS &R)
Match either "add nsw" or "or disjoint".
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.
BinaryOp_match< LHS, RHS, Instruction::LShr > m_LShr(const LHS &L, const RHS &R)
match_combine_or< CastInst_match< OpTy, ZExtInst >, CastInst_match< OpTy, SExtInst > > m_ZExtOrSExt(const OpTy &Op)
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)
CastInst_match< OpTy, SExtInst > m_SExt(const OpTy &Op)
Matches SExt.
is_zero m_Zero()
Match any null constant or a vector with all elements equal to 0.
match_combine_or< OverflowingBinaryOp_match< LHS, RHS, Instruction::Add, OverflowingBinaryOperator::NoUnsignedWrap >, DisjointOr_match< LHS, RHS > > m_NUWAddLike(const LHS &L, const RHS &R)
Match either "add nuw" or "or disjoint".
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)
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 isGuaranteedNotToBeUndef(const Value *V, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, unsigned Depth=0)
Returns true if V cannot be undef, but may be poison.
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.
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.
Value * simplifyICmpInst(CmpPredicate Pred, Value *LHS, Value *RHS, const SimplifyQuery &Q)
Given operands for an ICmpInst, fold the result or return null.
Constant * ConstantFoldBinaryOpOperands(unsigned Opcode, Constant *LHS, Constant *RHS, const DataLayout &DL)
Attempt to constant fold a binary operation with the specified operands.
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.
@ 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...
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.
bool isKnownNeverNaN(const Value *V, unsigned Depth, const SimplifyQuery &SQ)
Return true if the floating-point scalar value is not a NaN or if the floating-point vector value has...
bool isKnownNegation(const Value *X, const Value *Y, bool NeedNSW=false, bool AllowPoison=true)
Return true if the two given values are negation.
bool isKnownNonNegative(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Returns true if the give value is known to be non-negative.
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.
SimplifyQuery getWithInstruction(const Instruction *I) const