51#define DEBUG_TYPE "instsimplify"
95 CmpInst *Cmp = dyn_cast<CmpInst>(V);
99 Value *CLHS = Cmp->getOperand(0), *CRHS = Cmp->getOperand(1);
100 if (CPred == Pred && CLHS ==
LHS && CRHS ==
RHS)
113 unsigned MaxRecurse,
Constant *TrueOrFalse) {
115 if (SimplifiedCmp ==
Cond) {
123 return SimplifiedCmp;
129 unsigned MaxRecurse) {
137 unsigned MaxRecurse) {
147 unsigned MaxRecurse) {
184 if (
I->getParent()->isEntryBlock() && !isa<InvokeInst>(
I) &&
197 auto *
B = dyn_cast<BinaryOperator>(V);
198 if (!
B ||
B->getOpcode() != OpcodeToExpand)
200 Value *B0 =
B->getOperand(0), *B1 =
B->getOperand(1);
211 if ((L == B0 && R == B1) ||
232 unsigned MaxRecurse) {
249 unsigned MaxRecurse) {
352 unsigned MaxRecurse) {
358 if (isa<SelectInst>(
LHS)) {
359 SI = cast<SelectInst>(
LHS);
361 assert(isa<SelectInst>(
RHS) &&
"No select instruction operand!");
362 SI = cast<SelectInst>(
RHS);
389 if (TV == SI->getTrueValue() && FV == SI->getFalseValue())
395 if ((FV && !TV) || (TV && !FV)) {
398 Instruction *Simplified = dyn_cast<Instruction>(FV ? FV : TV);
399 if (Simplified && Simplified->getOpcode() ==
unsigned(Opcode) &&
400 !Simplified->hasPoisonGeneratingFlags()) {
404 Value *UnsimplifiedBranch = FV ? SI->getTrueValue() : SI->getFalseValue();
405 Value *UnsimplifiedLHS = SI ==
LHS ? UnsimplifiedBranch :
LHS;
406 Value *UnsimplifiedRHS = SI ==
LHS ?
RHS : UnsimplifiedBranch;
407 if (Simplified->getOperand(0) == UnsimplifiedLHS &&
408 Simplified->getOperand(1) == UnsimplifiedRHS)
410 if (Simplified->isCommutative() &&
411 Simplified->getOperand(1) == UnsimplifiedLHS &&
412 Simplified->getOperand(0) == UnsimplifiedRHS)
436 if (!isa<SelectInst>(
LHS)) {
440 assert(isa<SelectInst>(
LHS) &&
"Not comparing with a select instruction!");
443 Value *TV = SI->getTrueValue();
444 Value *FV = SI->getFalseValue();
476 unsigned MaxRecurse) {
482 if (isa<PHINode>(
LHS)) {
483 PI = cast<PHINode>(
LHS);
488 assert(isa<PHINode>(
RHS) &&
"No PHI instruction operand!");
489 PI = cast<PHINode>(
RHS);
496 Value *CommonValue =
nullptr;
509 if (!V || (CommonValue && V != CommonValue))
528 if (!isa<PHINode>(
LHS)) {
532 assert(isa<PHINode>(
LHS) &&
"Not comparing with a phi instruction!");
540 Value *CommonValue =
nullptr;
554 if (!V || (CommonValue && V != CommonValue))
565 if (
auto *CLHS = dyn_cast<Constant>(Op0)) {
566 if (
auto *CRHS = dyn_cast<Constant>(Op1)) {
570 case Instruction::FAdd:
571 case Instruction::FSub:
572 case Instruction::FMul:
573 case Instruction::FDiv:
574 case Instruction::FRem:
575 if (Q.
CxtI !=
nullptr)
596 if (isa<PoisonValue>(Op1))
659 return ::simplifyAddInst(Op0, Op1, IsNSW, IsNUW, Query,
RecursionLimit);
672 bool AllowNonInbounds =
false) {
673 assert(V->getType()->isPtrOrPtrVectorTy());
676 V = V->stripAndAccumulateConstantOffsets(
DL,
Offset, AllowNonInbounds);
679 return Offset.sextOrTrunc(
DL.getIndexTypeSizeInBits(V->getType()));
699 if (
auto *VecTy = dyn_cast<VectorType>(
LHS->
getType()))
714 std::optional<bool> Imp =
719 case Instruction::Sub:
720 case Instruction::Xor:
721 case Instruction::URem:
722 case Instruction::SRem:
725 case Instruction::SDiv:
726 case Instruction::UDiv:
727 return ConstantInt::get(Ty, 1);
729 case Instruction::And:
730 case Instruction::Or:
749 if (isa<PoisonValue>(Op0) || isa<PoisonValue>(Op1))
785 Value *
X =
nullptr, *
Y =
nullptr, *Z = Op1;
843 if (
X->getType() ==
Y->getType())
888 return ::simplifySubInst(Op0, Op1, IsNSW, IsNUW, Q,
RecursionLimit);
899 if (isa<PoisonValue>(Op1))
923 return ConstantInt::getNullValue(Op0->
getType());
938 Instruction::Add, Q, MaxRecurse))
943 if (isa<SelectInst>(Op0) || isa<SelectInst>(Op1))
950 if (isa<PHINode>(Op0) || isa<PHINode>(Op1))
960 return ::simplifyMulInst(Op0, Op1, IsNSW, IsNUW, Q,
RecursionLimit);
969 Constant *
C = dyn_cast_or_null<Constant>(V);
970 return (
C &&
C->isAllOnesValue());
976 unsigned MaxRecurse,
bool IsSigned) {
993 Type *Ty =
X->getType();
999 Constant *PosDividendC = ConstantInt::get(Ty,
C->abs());
1000 Constant *NegDividendC = ConstantInt::get(Ty, -
C->abs());
1009 if (
C->isMinSignedValue())
1015 Constant *PosDivisorC = ConstantInt::get(Ty,
C->abs());
1016 Constant *NegDivisorC = ConstantInt::get(Ty, -
C->abs());
1036 return isICmpTrue(ICmpInst::ICMP_ULT,
X,
Y, Q, MaxRecurse);
1043 unsigned MaxRecurse) {
1044 bool IsDiv = (Opcode == Instruction::SDiv || Opcode == Instruction::UDiv);
1045 bool IsSigned = (Opcode == Instruction::SDiv || Opcode == Instruction::SRem);
1062 if (isa<PoisonValue>(Op0))
1102 auto *
Mul = cast<OverflowingBinaryOperator>(Op0);
1113 if (
isDivZero(Op0, Op1, Q, MaxRecurse, IsSigned))
1121 if (isa<SelectInst>(Op0) || isa<SelectInst>(Op1))
1127 if (isa<PHINode>(Op0) || isa<PHINode>(Op1))
1137 unsigned MaxRecurse) {
1160 (Opcode == Instruction::UDiv
1180 if ((Opcode == Instruction::SRem &&
1182 (Opcode == Instruction::URem &&
1190 if (Opcode == Instruction::SRem
1193 return C.srem(*C0).isZero();
1197 return C.urem(*C0).isZero();
1213 return simplifyDiv(Instruction::SDiv, Op0, Op1, IsExact, Q, MaxRecurse);
1225 return simplifyDiv(Instruction::UDiv, Op0, Op1, IsExact, Q, MaxRecurse);
1236 unsigned MaxRecurse) {
1241 return ConstantInt::getNullValue(Op0->
getType());
1245 return ConstantInt::getNullValue(Op0->
getType());
1247 return simplifyRem(Instruction::SRem, Op0, Op1, Q, MaxRecurse);
1257 unsigned MaxRecurse) {
1258 return simplifyRem(Instruction::URem, Op0, Op1, Q, MaxRecurse);
1267 Constant *
C = dyn_cast<Constant>(Amount);
1277 const APInt *AmountC;
1283 if (isa<ConstantVector>(
C) || isa<ConstantDataVector>(
C)) {
1284 for (
unsigned I = 0,
1285 E = cast<FixedVectorType>(
C->getType())->getNumElements();
1299 unsigned MaxRecurse) {
1304 if (isa<PoisonValue>(Op0))
1325 if (isa<SelectInst>(Op0) || isa<SelectInst>(Op1))
1331 if (isa<PHINode>(Op0) || isa<PHINode>(Op1))
1349 assert(Opcode == Instruction::Shl &&
"Expected shl for nsw instruction");
1368 Value *Op1,
bool IsExact,
1387 if (Op0Known.
One[0])
1399 simplifyShift(Instruction::Shl, Op0, Op1, IsNSW, Q, MaxRecurse))
1423 if (IsNSW && IsNUW &&
1432 return ::simplifyShlInst(Op0, Op1, IsNSW, IsNUW, Q,
RecursionLimit);
1454 const APInt *ShRAmt, *ShLAmt;
1457 *ShRAmt == *ShLAmt) {
1460 if (ShRAmt->
uge(EffWidthY))
1508 ICmpInst *UnsignedICmp,
bool IsAnd,
1522 if (
match(UnsignedICmp,
1524 ICmpInst::isUnsigned(UnsignedPred)) {
1526 if ((UnsignedPred == ICmpInst::ICMP_UGE ||
1527 UnsignedPred == ICmpInst::ICMP_ULE) &&
1528 EqPred == ICmpInst::ICMP_NE && !IsAnd)
1531 if ((UnsignedPred == ICmpInst::ICMP_ULT ||
1532 UnsignedPred == ICmpInst::ICMP_UGT) &&
1533 EqPred == ICmpInst::ICMP_EQ && IsAnd)
1538 if (EqPred == ICmpInst::ICMP_NE && (UnsignedPred == ICmpInst::ICMP_ULT ||
1539 UnsignedPred == ICmpInst::ICMP_UGT))
1540 return IsAnd ? UnsignedICmp : ZeroICmp;
1544 if (EqPred == ICmpInst::ICMP_EQ && (UnsignedPred == ICmpInst::ICMP_ULE ||
1545 UnsignedPred == ICmpInst::ICMP_UGE))
1546 return IsAnd ? ZeroICmp : UnsignedICmp;
1552 if (
match(UnsignedICmp,
1554 if (UnsignedPred == ICmpInst::ICMP_UGE && IsAnd &&
1556 return UnsignedICmp;
1557 if (UnsignedPred == ICmpInst::ICMP_ULT && !IsAnd &&
1559 return UnsignedICmp;
1564 ICmpInst::isUnsigned(UnsignedPred))
1566 else if (
match(UnsignedICmp,
1568 ICmpInst::isUnsigned(UnsignedPred))
1569 UnsignedPred = ICmpInst::getSwappedPredicate(UnsignedPred);
1575 if (UnsignedPred == ICmpInst::ICMP_UGT && EqPred == ICmpInst::ICMP_EQ &&
1577 return IsAnd ? ZeroICmp : UnsignedICmp;
1581 if (UnsignedPred == ICmpInst::ICMP_ULE && EqPred == ICmpInst::ICMP_NE &&
1583 return IsAnd ? UnsignedICmp : ZeroICmp;
1592 if (UnsignedPred == ICmpInst::ICMP_ULT && EqPred == ICmpInst::ICMP_NE)
1593 return IsAnd ? UnsignedICmp : ZeroICmp;
1597 if (UnsignedPred == ICmpInst::ICMP_UGE && EqPred == ICmpInst::ICMP_EQ)
1598 return IsAnd ? ZeroICmp : UnsignedICmp;
1601 if (UnsignedPred == ICmpInst::ICMP_ULT && EqPred == ICmpInst::ICMP_EQ &&
1606 if (UnsignedPred == ICmpInst::ICMP_UGE && EqPred == ICmpInst::ICMP_NE &&
1622 const APInt *C0, *C1;
1632 if (IsAnd && Range0.intersectWith(Range1).isEmptySet())
1637 if (!IsAnd && Range0.unionWith(Range1).isFullSet())
1645 if (Range0.contains(Range1))
1646 return IsAnd ? Cmp1 : Cmp0;
1647 if (Range1.contains(Range0))
1648 return IsAnd ? Cmp0 : Cmp1;
1657 const APInt *C0, *C1;
1665 auto *AddInst = cast<OverflowingBinaryOperator>(Op0->
getOperand(0));
1666 if (AddInst->getOperand(1) != Op1->
getOperand(1))
1673 const APInt Delta = *C1 - *C0;
1676 if (Pred0 == ICmpInst::ICMP_ULT && Pred1 == ICmpInst::ICMP_SGT)
1678 if (Pred0 == ICmpInst::ICMP_SLT && Pred1 == ICmpInst::ICMP_SGT && IsNSW)
1682 if (Pred0 == ICmpInst::ICMP_ULE && Pred1 == ICmpInst::ICMP_SGT)
1684 if (Pred0 == ICmpInst::ICMP_SLE && Pred1 == ICmpInst::ICMP_SGT && IsNSW)
1690 if (Pred0 == ICmpInst::ICMP_ULT && Pred1 == ICmpInst::ICMP_UGT)
1693 if (Pred0 == ICmpInst::ICMP_ULE && Pred1 == ICmpInst::ICMP_UGT)
1712 if (!IsAnd && Pred0 == ICmpInst::ICMP_EQ && Pred1 == ICmpInst::ICMP_NE)
1715 if (IsAnd && Pred0 == ICmpInst::ICMP_NE && Pred1 == ICmpInst::ICMP_EQ)
1748 const APInt *C0, *C1;
1756 auto *AddInst = cast<BinaryOperator>(Op0->
getOperand(0));
1757 if (AddInst->getOperand(1) != Op1->
getOperand(1))
1764 const APInt Delta = *C1 - *C0;
1767 if (Pred0 == ICmpInst::ICMP_UGE && Pred1 == ICmpInst::ICMP_SLE)
1769 if (Pred0 == ICmpInst::ICMP_SGE && Pred1 == ICmpInst::ICMP_SLE && IsNSW)
1773 if (Pred0 == ICmpInst::ICMP_UGT && Pred1 == ICmpInst::ICMP_SLE)
1775 if (Pred0 == ICmpInst::ICMP_SGT && Pred1 == ICmpInst::ICMP_SLE && IsNSW)
1781 if (Pred0 == ICmpInst::ICMP_UGE && Pred1 == ICmpInst::ICMP_ULE)
1784 if (Pred0 == ICmpInst::ICMP_UGT && Pred1 == ICmpInst::ICMP_ULE)
1816 Value *LHS0 =
LHS->getOperand(0), *LHS1 =
LHS->getOperand(1);
1817 Value *RHS0 =
RHS->getOperand(0), *RHS1 =
RHS->getOperand(1);
1823 if ((PredL == FCmpInst::FCMP_ORD || PredL == FCmpInst::FCMP_UNO) &&
1824 ((FCmpInst::isOrdered(PredR) && IsAnd) ||
1825 (FCmpInst::isUnordered(PredR) && !IsAnd))) {
1830 if ((
match(RHS0, AbsOrSelfLHS0) ||
match(RHS1, AbsOrSelfLHS0)) &&
1832 return FCmpInst::isOrdered(PredL) == FCmpInst::isOrdered(PredR)
1838 if ((PredR == FCmpInst::FCMP_ORD || PredR == FCmpInst::FCMP_UNO) &&
1839 ((FCmpInst::isOrdered(PredL) && IsAnd) ||
1840 (FCmpInst::isUnordered(PredL) && !IsAnd))) {
1845 if ((
match(LHS0, AbsOrSelfRHS0) ||
match(LHS1, AbsOrSelfRHS0)) &&
1847 return FCmpInst::isOrdered(PredL) == FCmpInst::isOrdered(PredR)
1856 Value *Op1,
bool IsAnd) {
1858 auto *Cast0 = dyn_cast<CastInst>(Op0);
1859 auto *Cast1 = dyn_cast<CastInst>(Op1);
1860 if (Cast0 && Cast1 && Cast0->getOpcode() == Cast1->getOpcode() &&
1861 Cast0->getSrcTy() == Cast1->getSrcTy()) {
1862 Op0 = Cast0->getOperand(0);
1863 Op1 = Cast1->getOperand(0);
1867 auto *ICmp0 = dyn_cast<ICmpInst>(Op0);
1868 auto *ICmp1 = dyn_cast<ICmpInst>(Op1);
1873 auto *FCmp0 = dyn_cast<FCmpInst>(Op0);
1874 auto *FCmp1 = dyn_cast<FCmpInst>(Op1);
1885 if (
auto *
C = dyn_cast<Constant>(V))
1894 bool AllowRefinement,
1896 unsigned MaxRecurse);
1900 unsigned MaxRecurse) {
1901 assert((Opcode == Instruction::And || Opcode == Instruction::Or) &&
1916 (Opcode == Instruction::And ? ICmpInst::ICMP_EQ : ICmpInst::ICMP_NE)) {
1917 if (Res == Absorber)
1927 if (Res == Absorber)
1937 nullptr, MaxRecurse))
1938 return Simplify(Res);
1941 nullptr, MaxRecurse))
1942 return Simplify(Res);
1952 assert(BinaryOperator::isBitwiseLogicOp(Opcode) &&
"Expected logic op");
1964 return Opcode == Instruction::And ? ConstantInt::getNullValue(Ty)
1965 : ConstantInt::getAllOnesValue(Ty);
1974 unsigned MaxRecurse) {
2008 const APInt *Shift1, *Shift2;
2013 Shift1->
uge(*Shift2))
2026 unsigned MaxRecurse) {
2031 if (isa<PoisonValue>(Op1))
2066 (~(*Mask)).lshr(*ShAmt).isZero())
2072 (~(*Mask)).shl(*ShAmt).isZero())
2077 const APInt *PowerC;
2086 return ConstantInt::getNullValue(Op1->
getType());
2099 Instruction::Or, Q, MaxRecurse))
2104 Instruction::Xor, Q, MaxRecurse))
2107 if (isa<SelectInst>(Op0) || isa<SelectInst>(Op1)) {
2125 if (isa<PHINode>(Op0) || isa<PHINode>(Op1))
2149 if (EffWidthY <= ShftCnt) {
2182 if (*Implied ==
true)
2185 if (*Implied ==
false)
2210 assert(
X->getType() ==
Y->getType() &&
"Expected same type for 'or' ops");
2211 Type *Ty =
X->getType();
2215 return ConstantInt::getAllOnesValue(Ty);
2219 return ConstantInt::getAllOnesValue(Ty);
2237 return ConstantInt::getAllOnesValue(Ty);
2261 return ConstantInt::getAllOnesValue(Ty);
2301 unsigned MaxRecurse) {
2306 if (isa<PoisonValue>(Op1))
2340 C->ule(
X->getType()->getScalarSizeInBits())) {
2341 return ConstantInt::getAllOnesValue(
X->getType());
2395 Instruction::And, Q, MaxRecurse))
2398 if (isa<SelectInst>(Op0) || isa<SelectInst>(Op1)) {
2416 const APInt *C1, *C2;
2442 if (isa<PHINode>(Op0) || isa<PHINode>(Op1))
2452 if (std::optional<bool> Implied =
2455 if (*Implied ==
false)
2458 if (*Implied ==
true)
2461 if (std::optional<bool> Implied =
2464 if (*Implied ==
false)
2467 if (*Implied ==
true)
2485 unsigned MaxRecurse) {
2490 if (isa<PoisonValue>(Op1))
2527 if (
Value *R = foldAndOrNot(Op0, Op1))
2529 if (
Value *R = foldAndOrNot(Op1, Op0))
2579 CmpInst *Cmp = dyn_cast<CmpInst>(SI->getCondition());
2582 Value *CmpLHS = Cmp->getOperand(0), *CmpRHS = Cmp->getOperand(1);
2583 if (Pred == Cmp->getPredicate() &&
LHS == CmpLHS &&
RHS == CmpRHS)
2586 LHS == CmpRHS &&
RHS == CmpLHS)
2599 if (
const AllocaInst *AI = dyn_cast<AllocaInst>(V))
2600 return AI->isStaticAlloca();
2601 if (
const GlobalValue *GV = dyn_cast<GlobalValue>(V))
2602 return (GV->hasLocalLinkage() || GV->hasHiddenVisibility() ||
2603 GV->hasProtectedVisibility() || GV->hasGlobalUnnamedAddr()) &&
2604 !GV->isThreadLocal();
2605 if (
const Argument *
A = dyn_cast<Argument>(V))
2606 return A->hasByValAttr();
2639 auto isByValArg = [](
const Value *V) {
2640 const Argument *
A = dyn_cast<Argument>(V);
2641 return A &&
A->hasByValAttr();
2647 return isa<AllocaInst>(V2) || isa<GlobalVariable>(V2) || isByValArg(V2);
2649 return isa<AllocaInst>(V1) || isa<GlobalVariable>(V1) || isByValArg(V1);
2651 return isa<AllocaInst>(V1) &&
2652 (isa<AllocaInst>(V2) || isa<GlobalVariable>(V2));
2708 unsigned IndexSize =
DL.getIndexTypeSizeInBits(
LHS->
getType());
2709 APInt LHSOffset(IndexSize, 0), RHSOffset(IndexSize, 0);
2729 Opts.
EvalMode = ObjectSizeOpts::Mode::Min;
2731 if (
auto *
I = dyn_cast<Instruction>(V))
2732 return I->getFunction();
2733 if (
auto *
A = dyn_cast<Argument>(V))
2734 return A->getParent();
2740 APInt Dist = LHSOffset - RHSOffset;
2768 if ((IsNAC(LHSUObjs) && IsAllocDisjoint(RHSUObjs)) ||
2769 (IsNAC(RHSUObjs) && IsAllocDisjoint(LHSUObjs)))
2789 bool Captured =
false;
2792 if (
auto *ICmp = dyn_cast<ICmpInst>(U->getUser())) {
2796 unsigned OtherIdx = 1 - U->getOperandNo();
2797 auto *LI = dyn_cast<LoadInst>(ICmp->getOperand(OtherIdx));
2798 if (LI && isa<GlobalVariable>(LI->getPointerOperand()))
2806 CustomCaptureTracker Tracker;
2808 if (!Tracker.Captured)
2830 auto ExtractNotLHS = [](
Value *V) ->
Value * {
2892 case ICmpInst::ICMP_UGE:
2896 case ICmpInst::ICMP_SGE:
2907 case ICmpInst::ICMP_ULE:
2911 case ICmpInst::ICMP_SLE:
2931 case ICmpInst::ICMP_ULT:
2933 case ICmpInst::ICMP_UGE:
2935 case ICmpInst::ICMP_EQ:
2936 case ICmpInst::ICMP_ULE:
2940 case ICmpInst::ICMP_NE:
2941 case ICmpInst::ICMP_UGT:
2945 case ICmpInst::ICMP_SLT: {
2953 case ICmpInst::ICMP_SLE: {
2961 case ICmpInst::ICMP_SGE: {
2969 case ICmpInst::ICMP_SGT: {
3022 *MulC != 0 &&
C->urem(*MulC) != 0) ||
3024 *MulC != 0 &&
C->srem(*MulC) != 0)))
3025 return ConstantInt::get(ITy, Pred == ICmpInst::ICMP_NE);
3035 if (!Res.
insert(V).second)
3042 auto *
I = dyn_cast<Instruction>(V);
3055 switch (
I->getOpcode()) {
3056 case Instruction::And:
3060 case Instruction::URem:
3061 case Instruction::UDiv:
3062 case Instruction::LShr:
3065 case Instruction::Call:
3077 if (Pred != ICmpInst::ICMP_UGE && Pred != ICmpInst::ICMP_ULT)
3086 for (
Value *GV : GreaterValues)
3089 Pred == ICmpInst::ICMP_UGE);
3095 unsigned MaxRecurse) {
3101 if (Pred == ICmpInst::ICMP_SLT || Pred == ICmpInst::ICMP_SGE) {
3116 case ICmpInst::ICMP_SGT:
3117 case ICmpInst::ICMP_SGE: {
3123 case ICmpInst::ICMP_EQ:
3124 case ICmpInst::ICMP_UGT:
3125 case ICmpInst::ICMP_UGE:
3127 case ICmpInst::ICMP_SLT:
3128 case ICmpInst::ICMP_SLE: {
3134 case ICmpInst::ICMP_NE:
3135 case ICmpInst::ICMP_ULT:
3136 case ICmpInst::ICMP_ULE:
3158 case ICmpInst::ICMP_EQ:
3159 case ICmpInst::ICMP_UGE:
3160 case ICmpInst::ICMP_UGT:
3162 case ICmpInst::ICMP_NE:
3163 case ICmpInst::ICMP_ULT:
3164 case ICmpInst::ICMP_ULE:
3179 const APInt *C1, *C2;
3186 if (Pred == ICmpInst::ICMP_UGT)
3188 if (Pred == ICmpInst::ICMP_ULE)
3226 const APInt *C1, *C2;
3240 unsigned MaxRecurse) {
3243 if (MaxRecurse && (LBO || RBO)) {
3245 Value *
A =
nullptr, *
B =
nullptr, *
C =
nullptr, *
D =
nullptr;
3247 bool NoLHSWrapProblem =
false, NoRHSWrapProblem =
false;
3248 if (LBO && LBO->
getOpcode() == Instruction::Add) {
3258 if (RBO && RBO->
getOpcode() == Instruction::Add) {
3270 if ((
A ==
RHS ||
B ==
RHS) && NoLHSWrapProblem)
3277 if ((
C ==
LHS ||
D ==
LHS) && NoRHSWrapProblem)
3280 C ==
LHS ?
D :
C, Q, MaxRecurse - 1))
3284 bool CanSimplify = (NoLHSWrapProblem && NoRHSWrapProblem) ||
3286 if (
A &&
C && (
A ==
C ||
A ==
D ||
B ==
C ||
B ==
D) && CanSimplify) {
3293 }
else if (
A ==
D) {
3297 }
else if (
B ==
C) {
3318 ICmpInst::getSwappedPredicate(Pred), RBO,
LHS, Q, MaxRecurse))
3325 if (
C->isStrictlyPositive()) {
3326 if (Pred == ICmpInst::ICMP_SLT || Pred == ICmpInst::ICMP_NE)
3328 if (Pred == ICmpInst::ICMP_SGE || Pred == ICmpInst::ICMP_EQ)
3331 if (
C->isNonNegative()) {
3332 if (Pred == ICmpInst::ICMP_SLE)
3334 if (Pred == ICmpInst::ICMP_SGT)
3357 if (Pred == ICmpInst::ICMP_EQ)
3359 if (Pred == ICmpInst::ICMP_NE)
3368 if (Pred == ICmpInst::ICMP_UGT)
3370 if (Pred == ICmpInst::ICMP_ULE)
3381 case Instruction::Shl: {
3384 if (!NUW || (ICmpInst::isSigned(Pred) && !NSW) ||
3397 case Instruction::And:
3398 case Instruction::Or: {
3399 const APInt *C1, *C2;
3405 Pred = ICmpInst::getSwappedPredicate(Pred);
3408 if (Pred == ICmpInst::ICMP_ULE)
3410 if (Pred == ICmpInst::ICMP_UGT)
3413 if (Pred == ICmpInst::ICMP_SLE)
3415 if (Pred == ICmpInst::ICMP_SGT)
3429 case Instruction::UDiv:
3430 case Instruction::LShr:
3431 if (ICmpInst::isSigned(Pred) || !Q.
IIQ.
isExact(LBO) ||
3438 case Instruction::SDiv:
3446 case Instruction::AShr:
3453 case Instruction::Shl: {
3458 if (!NSW && ICmpInst::isSigned(Pred))
3474 unsigned MaxRecurse) {
3630 Pred = ICmpInst::getSwappedPredicate(Pred);
3636 (
A ==
C ||
A ==
D ||
B ==
C ||
B ==
D)) {
3645 (
A ==
C ||
A ==
D ||
B ==
C ||
B ==
D)) {
3669 CallInst *Assume = cast<CallInst>(AssumeVH);
3682 auto *
II = dyn_cast<IntrinsicInst>(
LHS);
3686 switch (
II->getIntrinsicID()) {
3687 case Intrinsic::uadd_sat:
3691 if (Pred == ICmpInst::ICMP_UGE)
3693 if (Pred == ICmpInst::ICMP_ULT)
3697 case Intrinsic::usub_sat:
3701 if (Pred == ICmpInst::ICMP_ULE)
3703 if (Pred == ICmpInst::ICMP_UGT)
3719 if (
const Argument *
A = dyn_cast<Argument>(V))
3720 return A->getRange();
3721 else if (
const CallBase *CB = dyn_cast<CallBase>(V))
3722 return CB->getRange();
3724 return std::nullopt;
3741 assert(!isa<UndefValue>(
LHS) &&
"Unexpected icmp undef,%X");
3746 if (isa<PoisonValue>(
RHS))
3775 if (LhsCr->icmp(Pred, *RhsCr))
3783 if (isa<CastInst>(
LHS) && (isa<Constant>(
RHS) || isa<CastInst>(
RHS))) {
3791 if (MaxRecurse && isa<PtrToIntInst>(LI) &&
3800 if (RI->getOperand(0)->getType() == SrcTy)
3808 if (isa<ZExtInst>(
LHS)) {
3812 if (MaxRecurse && SrcTy == RI->getOperand(0)->getType())
3816 RI->getOperand(0), Q, MaxRecurse - 1))
3820 else if (
SExtInst *RI = dyn_cast<SExtInst>(
RHS)) {
3821 if (
SrcOp == RI->getOperand(0)) {
3822 if (Pred == ICmpInst::ICMP_ULE || Pred == ICmpInst::ICMP_SGE)
3824 if (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_SLT)
3838 assert(Trunc &&
"Constant-fold of ImmConstant should not fail");
3841 assert(RExt &&
"Constant-fold of ImmConstant should not fail");
3844 assert(AnyEq &&
"Constant-fold of ImmConstant should not fail");
3851 SrcOp, Trunc, Q, MaxRecurse - 1))
3861 case ICmpInst::ICMP_EQ:
3862 case ICmpInst::ICMP_UGT:
3863 case ICmpInst::ICMP_UGE:
3866 case ICmpInst::ICMP_NE:
3867 case ICmpInst::ICMP_ULT:
3868 case ICmpInst::ICMP_ULE:
3873 case ICmpInst::ICMP_SGT:
3874 case ICmpInst::ICMP_SGE:
3878 case ICmpInst::ICMP_SLT:
3879 case ICmpInst::ICMP_SLE:
3888 if (isa<SExtInst>(
LHS)) {
3892 if (MaxRecurse && SrcTy == RI->getOperand(0)->getType())
3899 else if (
ZExtInst *RI = dyn_cast<ZExtInst>(
RHS)) {
3900 if (
SrcOp == RI->getOperand(0)) {
3901 if (Pred == ICmpInst::ICMP_UGE || Pred == ICmpInst::ICMP_SLE)
3903 if (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_SGT)
3916 assert(Trunc &&
"Constant-fold of ImmConstant should not fail");
3919 assert(RExt &&
"Constant-fold of ImmConstant should not fail");
3922 assert(AnyEq &&
"Constant-fold of ImmConstant should not fail");
3937 case ICmpInst::ICMP_EQ:
3939 case ICmpInst::ICMP_NE:
3944 case ICmpInst::ICMP_SGT:
3945 case ICmpInst::ICMP_SGE:
3949 case ICmpInst::ICMP_SLT:
3950 case ICmpInst::ICMP_SLE:
3957 case ICmpInst::ICMP_UGT:
3958 case ICmpInst::ICMP_UGE:
3966 case ICmpInst::ICMP_ULT:
3967 case ICmpInst::ICMP_ULE:
3998 ICmpInst::getSwappedPredicate(Pred),
RHS,
LHS))
4004 ICmpInst::getSwappedPredicate(Pred),
RHS,
LHS))
4010 if (std::optional<bool> Res =
4019 if (
auto *CLHS = dyn_cast<PtrToIntOperator>(
LHS))
4020 if (
auto *CRHS = dyn_cast<PtrToIntOperator>(
RHS))
4021 if (CLHS->getPointerOperandType() == CRHS->getPointerOperandType() &&
4025 CRHS->getPointerOperand(), Q))
4030 if (isa<SelectInst>(
LHS) || isa<SelectInst>(
RHS))
4036 if (isa<PHINode>(
LHS) || isa<PHINode>(
RHS))
4052 unsigned MaxRecurse) {
4067 if (Pred == FCmpInst::FCMP_FALSE)
4069 if (Pred == FCmpInst::FCMP_TRUE)
4074 if (isa<PoisonValue>(
LHS) || isa<PoisonValue>(
RHS))
4097 if (Pred == FCmpInst::FCMP_ORD || Pred == FCmpInst::FCMP_UNO) {
4105 return ConstantInt::get(
RetTy, Pred == FCmpInst::FCMP_ORD);
4113 std::optional<KnownFPClass> FullKnownClassLHS;
4117 auto computeLHSClass = [=, &FullKnownClassLHS](
FPClassTest InterestedFlags =
4119 if (FullKnownClassLHS)
4120 return *FullKnownClassLHS;
4133 FullKnownClassLHS = computeLHSClass();
4134 if ((FullKnownClassLHS->KnownFPClasses & ClassTest) ==
fcNone)
4136 if ((FullKnownClassLHS->KnownFPClasses & ~ClassTest) ==
fcNone)
4151 if (
C->isNegative() && !
C->isNegZero()) {
4157 case FCmpInst::FCMP_UGE:
4158 case FCmpInst::FCMP_UGT:
4159 case FCmpInst::FCMP_UNE: {
4167 case FCmpInst::FCMP_OEQ:
4168 case FCmpInst::FCMP_OLE:
4169 case FCmpInst::FCMP_OLT: {
4188 cast<IntrinsicInst>(
LHS)->getIntrinsicID() == Intrinsic::maxnum;
4192 case FCmpInst::FCMP_OEQ:
4193 case FCmpInst::FCMP_UEQ:
4197 case FCmpInst::FCMP_ONE:
4198 case FCmpInst::FCMP_UNE:
4202 case FCmpInst::FCMP_OGE:
4203 case FCmpInst::FCMP_UGE:
4204 case FCmpInst::FCMP_OGT:
4205 case FCmpInst::FCMP_UGT:
4210 return ConstantInt::get(
RetTy, IsMaxNum);
4211 case FCmpInst::FCMP_OLE:
4212 case FCmpInst::FCMP_ULE:
4213 case FCmpInst::FCMP_OLT:
4214 case FCmpInst::FCMP_ULT:
4219 return ConstantInt::get(
RetTy, !IsMaxNum);
4231 case FCmpInst::FCMP_OGE:
4232 case FCmpInst::FCMP_ULT: {
4235 Interested |=
fcNan;
4246 case FCmpInst::FCMP_UGE:
4247 case FCmpInst::FCMP_OLT: {
4264 if (isa<SelectInst>(
LHS) || isa<SelectInst>(
RHS))
4270 if (isa<PHINode>(
LHS) || isa<PHINode>(
RHS))
4283 ArrayRef<std::pair<Value *, Value *>> Ops,
4285 bool AllowRefinement,
4287 unsigned MaxRecurse) {
4289 "If AllowRefinement=false then CanUseUndef=false");
4290 for (
const auto &OpAndRepOp : Ops) {
4292 if (isa<Constant>(OpAndRepOp.first))
4296 if (V == OpAndRepOp.first)
4297 return OpAndRepOp.second;
4303 auto *
I = dyn_cast<Instruction>(V);
4309 if (isa<PHINode>(
I))
4313 if (
match(
I, m_Intrinsic<Intrinsic::is_constant>()))
4317 if (isa<FreezeInst>(
I))
4320 for (
const auto &OpAndRepOp : Ops) {
4323 if (OpAndRepOp.first->getType()->isVectorTy() &&
4330 bool AnyReplaced =
false;
4331 for (
Value *InstOp :
I->operands()) {
4333 InstOp, Ops, Q, AllowRefinement, DropFlags, MaxRecurse)) {
4335 AnyReplaced = InstOp != NewInstOp;
4349 if (!AllowRefinement) {
4354 if (
auto *BO = dyn_cast<BinaryOperator>(
I)) {
4355 unsigned Opcode = BO->getOpcode();
4358 if (!BO->getType()->isFPOrFPVectorTy()) {
4367 if ((Opcode == Instruction::And || Opcode == Instruction::Or) &&
4368 NewOps[0] == NewOps[1]) {
4370 if (
auto *PDI = dyn_cast<PossiblyDisjointInst>(BO)) {
4371 if (PDI->isDisjoint()) {
4383 if ((Opcode == Instruction::Sub || Opcode == Instruction::Xor) &&
4384 NewOps[0] == NewOps[1] &&
4385 any_of(Ops, [=](
const auto &Rep) {
return NewOps[0] == Rep.second; }))
4396 if ((NewOps[0] == Absorber || NewOps[1] == Absorber) &&
4398 [=](
const auto &Rep) {
return impliesPoison(BO, Rep.first); }))
4402 if (isa<GetElementPtrInst>(
I)) {
4418 auto PreventSelfSimplify = [V](
Value *Simplified) {
4419 return Simplified != V ? Simplified :
nullptr;
4422 return PreventSelfSimplify(
4429 for (
Value *NewOp : NewOps) {
4430 if (
Constant *ConstOp = dyn_cast<Constant>(NewOp))
4445 if (!AllowRefinement) {
4448 if (
auto *
II = dyn_cast<IntrinsicInst>(
I);
4449 II &&
II->getIntrinsicID() == Intrinsic::abs) {
4450 if (!ConstOps[0]->isNotMinSignedValue())
4457 if (DropFlags && Res &&
I->hasPoisonGeneratingAnnotations())
4468 bool AllowRefinement,
4470 unsigned MaxRecurse) {
4472 DropFlags, MaxRecurse);
4477 bool AllowRefinement,
4481 if (!AllowRefinement)
4484 return ::simplifyWithOpReplaced(V,
Op, RepOp, Q, AllowRefinement, DropFlags,
4491 const APInt *
Y,
bool TrueWhenUnset) {
4498 return TrueWhenUnset ? FalseVal : TrueVal;
4504 return TrueWhenUnset ? FalseVal : TrueVal;
4506 if (
Y->isPowerOf2()) {
4512 if (TrueWhenUnset && cast<PossiblyDisjointInst>(TrueVal)->isDisjoint())
4514 return TrueWhenUnset ? TrueVal : FalseVal;
4522 if (!TrueWhenUnset && cast<PossiblyDisjointInst>(FalseVal)->isDisjoint())
4524 return TrueWhenUnset ? TrueVal : FalseVal;
4535 if (CmpRHS == TVal || CmpRHS == FVal) {
4537 Pred = ICmpInst::getSwappedPredicate(Pred);
4541 if (CmpLHS == FVal) {
4543 Pred = ICmpInst::getInversePredicate(Pred);
4548 Value *
X = CmpLHS, *
Y = CmpRHS;
4549 bool PeekedThroughSelectShuffle =
false;
4550 auto *Shuf = dyn_cast<ShuffleVectorInst>(FVal);
4551 if (Shuf && Shuf->isSelect()) {
4552 if (Shuf->getOperand(0) ==
Y)
4553 FVal = Shuf->getOperand(1);
4554 else if (Shuf->getOperand(1) ==
Y)
4555 FVal = Shuf->getOperand(0);
4558 PeekedThroughSelectShuffle =
true;
4562 auto *MMI = dyn_cast<MinMaxIntrinsic>(FVal);
4563 if (!MMI || TVal !=
X ||
4581 if (PeekedThroughSelectShuffle)
4609 Res->Pred == ICmpInst::ICMP_EQ);
4617 ArrayRef<std::pair<Value *, Value *>> Replacements,
Value *TrueVal,
4619 Value *SimplifiedFalseVal =
4622 nullptr, MaxRecurse);
4623 if (!SimplifiedFalseVal)
4624 SimplifiedFalseVal = FalseVal;
4626 Value *SimplifiedTrueVal =
4629 nullptr, MaxRecurse);
4630 if (!SimplifiedTrueVal)
4631 SimplifiedTrueVal = TrueVal;
4633 if (SimplifiedFalseVal == SimplifiedTrueVal)
4644 unsigned MaxRecurse) {
4646 Value *CmpLHS, *CmpRHS;
4654 if (Pred == ICmpInst::ICMP_NE) {
4655 Pred = ICmpInst::ICMP_EQ;
4662 if (TrueVal->getType()->isIntOrIntVectorTy()) {
4670 X->getType()->getScalarSizeInBits());
4676 if (Pred == ICmpInst::ICMP_EQ &&
match(CmpRHS,
m_Zero())) {
4690 if (
match(TrueVal, isFsh) && FalseVal ==
X && CmpLHS == ShAmt)
4703 if (
match(FalseVal, isRotate) && TrueVal ==
X && CmpLHS == ShAmt &&
4704 Pred == ICmpInst::ICMP_EQ)
4709 if (
match(TrueVal, m_Intrinsic<Intrinsic::abs>(
m_Specific(CmpLHS))) &&
4721 if (Pred == ICmpInst::ICMP_EQ) {
4725 FalseVal, Q, MaxRecurse))
4730 FalseVal, Q, MaxRecurse))
4740 {{
X, CmpRHS}, {
Y, CmpRHS}}, TrueVal, FalseVal, Q, MaxRecurse))
4749 {{
X, CmpRHS}, {
Y, CmpRHS}}, TrueVal, FalseVal, Q, MaxRecurse))
4761 unsigned MaxRecurse) {
4763 Value *CmpLHS, *CmpRHS;
4768 bool IsEquiv =
I->isEquivalence();
4769 if (
I->isEquivalence(
true)) {
4771 Pred = FCmpInst::getInversePredicate(Pred);
4787 if (CmpLHS ==
F && CmpRHS ==
T)
4790 if (CmpLHS !=
T || CmpRHS !=
F)
4796 if (Pred == FCmpInst::FCMP_OEQ)
4800 if (Pred == FCmpInst::FCMP_UNE)
4811 if (
auto *CondC = dyn_cast<Constant>(
Cond)) {
4812 if (
auto *TrueC = dyn_cast<Constant>(TrueVal))
4813 if (
auto *FalseC = dyn_cast<Constant>(FalseVal))
4818 if (isa<PoisonValue>(CondC))
4823 return isa<Constant>(FalseVal) ? FalseVal : TrueVal;
4835 assert(
Cond->getType()->isIntOrIntVectorTy(1) &&
4836 "Select must have bool or bool vector condition");
4837 assert(TrueVal->getType() == FalseVal->getType() &&
4838 "Select must have same types for true/false ops");
4840 if (
Cond->getType() == TrueVal->getType()) {
4903 if (TrueVal == FalseVal)
4906 if (
Cond == TrueVal) {
4914 if (
Cond == FalseVal) {
4928 if (isa<PoisonValue>(TrueVal) ||
4933 if (isa<PoisonValue>(FalseVal) ||
4939 if (isa<FixedVectorType>(TrueVal->getType()) &&
4943 cast<FixedVectorType>(TrueC->
getType())->getNumElements();
4945 for (
unsigned i = 0; i != NumElts; ++i) {
4949 if (!TEltC || !FEltC)
4956 else if (isa<PoisonValue>(TEltC) ||
4959 else if (isa<PoisonValue>(FEltC) ||
4965 if (NewC.
size() == NumElts)
4981 return *Imp ? TrueVal : FalseVal;
4998 cast<PointerType>(
Ptr->getType()->getScalarType())->getAddressSpace();
5001 if (Indices.
empty())
5011 if (
VectorType *VT = dyn_cast<VectorType>(
Op->getType())) {
5012 GEPTy = VectorType::get(GEPTy, VT->getElementCount());
5019 if (
Ptr->getType() == GEPTy &&
5025 if (isa<PoisonValue>(
Ptr) ||
5026 any_of(Indices, [](
const auto *V) {
return isa<PoisonValue>(V); }))
5033 bool IsScalableVec =
5035 return isa<ScalableVectorType>(V->getType());
5038 if (Indices.
size() == 1) {
5040 if (!IsScalableVec && Ty->
isSized()) {
5045 if (TyAllocSize == 0 &&
Ptr->getType() == GEPTy)
5050 if (Indices[0]->
getType()->getScalarSizeInBits() ==
5052 auto CanSimplify = [GEPTy, &
P,
Ptr]() ->
bool {
5053 return P->getType() == GEPTy &&
5057 if (TyAllocSize == 1 &&
5068 TyAllocSize == 1ULL <<
C && CanSimplify())
5084 [](
Value *
Idx) { return match(Idx, m_Zero()); })) {
5088 APInt BasePtrOffset(IdxWidth, 0);
5089 Value *StrippedBasePtr =
5090 Ptr->stripAndAccumulateInBoundsConstantOffsets(Q.
DL, BasePtrOffset);
5099 !BasePtrOffset.
isZero()) {
5100 auto *CI = ConstantInt::get(GEPTy->
getContext(), BasePtrOffset);
5106 !BasePtrOffset.
isOne()) {
5107 auto *CI = ConstantInt::get(GEPTy->
getContext(), BasePtrOffset - 1);
5114 if (!isa<Constant>(
Ptr) ||
5115 !
all_of(Indices, [](
Value *V) {
return isa<Constant>(V); }))
5137 if (
Constant *CAgg = dyn_cast<Constant>(Agg))
5138 if (
Constant *CVal = dyn_cast<Constant>(Val))
5143 if (isa<PoisonValue>(Val) ||
5149 if (EV->getAggregateOperand()->getType() == Agg->
getType() &&
5150 EV->getIndices() == Idxs) {
5153 if (isa<PoisonValue>(Agg) ||
5156 return EV->getAggregateOperand();
5159 if (Agg == EV->getAggregateOperand())
5169 return ::simplifyInsertValueInst(Agg, Val, Idxs, Q,
RecursionLimit);
5175 auto *VecC = dyn_cast<Constant>(Vec);
5176 auto *ValC = dyn_cast<Constant>(Val);
5177 auto *IdxC = dyn_cast<Constant>(
Idx);
5178 if (VecC && ValC && IdxC)
5182 if (
auto *CI = dyn_cast<ConstantInt>(
Idx)) {
5183 if (isa<FixedVectorType>(Vec->
getType()) &&
5184 CI->uge(cast<FixedVectorType>(Vec->
getType())->getNumElements()))
5194 if (isa<PoisonValue>(Val) ||
5199 if (VecC && ValC && VecC->getSplatValue() == ValC)
5215 if (
auto *CAgg = dyn_cast<Constant>(Agg))
5219 unsigned NumIdxs = Idxs.
size();
5220 for (
auto *IVI = dyn_cast<InsertValueInst>(Agg); IVI !=
nullptr;
5221 IVI = dyn_cast<InsertValueInst>(IVI->getAggregateOperand())) {
5223 unsigned NumInsertValueIdxs = InsertValueIdxs.
size();
5224 unsigned NumCommonIdxs = std::min(NumInsertValueIdxs, NumIdxs);
5225 if (InsertValueIdxs.
slice(0, NumCommonIdxs) ==
5226 Idxs.
slice(0, NumCommonIdxs)) {
5227 if (NumIdxs == NumInsertValueIdxs)
5228 return IVI->getInsertedValueOperand();
5245 auto *VecVTy = cast<VectorType>(Vec->
getType());
5246 if (
auto *CVec = dyn_cast<Constant>(Vec)) {
5247 if (
auto *CIdx = dyn_cast<Constant>(
Idx))
5261 if (
auto *IdxC = dyn_cast<ConstantInt>(
Idx)) {
5263 unsigned MinNumElts = VecVTy->getElementCount().getKnownMinValue();
5264 if (isa<FixedVectorType>(VecVTy) && IdxC->getValue().uge(MinNumElts))
5267 if (IdxC->getValue().ult(MinNumElts))
5277 auto *IE = dyn_cast<InsertElementInst>(Vec);
5278 if (IE && IE->getOperand(2) ==
Idx)
5279 return IE->getOperand(1);
5302 Value *CommonValue =
nullptr;
5303 bool HasPoisonInput =
false;
5304 bool HasUndefInput =
false;
5310 HasPoisonInput =
true;
5315 HasUndefInput =
true;
5318 if (CommonValue &&
Incoming != CommonValue)
5329 if (HasPoisonInput || HasUndefInput) {
5337 if (HasUndefInput &&
5348 if (
auto *
C = dyn_cast<Constant>(
Op))
5351 if (
auto *CI = dyn_cast<CastInst>(
Op)) {
5352 auto *Src = CI->getOperand(0);
5353 Type *SrcTy = Src->getType();
5354 Type *MidTy = CI->getType();
5356 if (Src->getType() == Ty) {
5366 SrcIntPtrTy, MidIntPtrTy,
5367 DstIntPtrTy) == Instruction::BitCast)
5373 if (CastOpc == Instruction::BitCast)
5374 if (
Op->getType() == Ty)
5379 if (CastOpc == Instruction::PtrToInt &&
5397 int MaskVal,
Value *RootVec,
5398 unsigned MaxRecurse) {
5408 int InVecNumElts = cast<FixedVectorType>(Op0->
getType())->getNumElements();
5409 int RootElt = MaskVal;
5410 Value *SourceOp = Op0;
5411 if (MaskVal >= InVecNumElts) {
5412 RootElt = MaskVal - InVecNumElts;
5418 if (
auto *SourceShuf = dyn_cast<ShuffleVectorInst>(SourceOp)) {
5420 DestElt, SourceShuf->getOperand(0), SourceShuf->getOperand(1),
5421 SourceShuf->getMaskValue(RootElt), RootVec, MaxRecurse);
5430 if (RootVec != SourceOp)
5435 if (RootElt != DestElt)
5444 unsigned MaxRecurse) {
5448 auto *InVecTy = cast<VectorType>(Op0->
getType());
5449 unsigned MaskNumElts = Mask.size();
5450 ElementCount InVecEltCount = InVecTy->getElementCount();
5455 Indices.
assign(Mask.begin(), Mask.end());
5460 bool MaskSelects0 =
false, MaskSelects1 =
false;
5462 for (
unsigned i = 0; i != MaskNumElts; ++i) {
5463 if (Indices[i] == -1)
5465 if ((
unsigned)Indices[i] < InVecNumElts)
5466 MaskSelects0 =
true;
5468 MaskSelects1 =
true;
5476 auto *Op0Const = dyn_cast<Constant>(Op0);
5477 auto *Op1Const = dyn_cast<Constant>(Op1);
5482 if (Op0Const && Op1Const)
5488 if (!Scalable && Op0Const && !Op1Const) {
5506 if (
all_of(Indices, [InsertIndex](
int MaskElt) {
5507 return MaskElt == InsertIndex || MaskElt == -1;
5509 assert(isa<UndefValue>(Op1) &&
"Expected undef operand 1 for splat");
5513 for (
unsigned i = 0; i != MaskNumElts; ++i)
5514 if (Indices[i] == -1)
5522 if (
auto *OpShuf = dyn_cast<ShuffleVectorInst>(Op0))
5542 Value *RootVec =
nullptr;
5543 for (
unsigned i = 0; i != MaskNumElts; ++i) {
5565 if (
auto *
C = dyn_cast<Constant>(
Op))
5593 Type *Ty = In->getType();
5594 if (
auto *VecTy = dyn_cast<FixedVectorType>(Ty)) {
5595 unsigned NumElts = VecTy->getNumElements();
5597 for (
unsigned i = 0; i != NumElts; ++i) {
5598 Constant *EltC = In->getAggregateElement(i);
5601 if (EltC && isa<PoisonValue>(EltC))
5603 else if (EltC && EltC->
isNaN())
5604 NewC[i] = ConstantFP::get(
5605 EltC->
getType(), cast<ConstantFP>(EltC)->getValue().makeQuiet());
5619 if (isa<ScalableVectorType>(Ty)) {
5620 auto *
Splat = In->getSplatValue();
5622 "Found a scalable-vector NaN but not a splat");
5628 return ConstantFP::get(Ty, cast<ConstantFP>(In)->getValue().makeQuiet());
5643 for (
Value *V : Ops) {
5651 if (FMF.
noNaNs() && (IsNan || IsUndef))
5653 if (FMF.
noInfs() && (IsInf || IsUndef))
5679 RoundingMode Rounding = RoundingMode::NearestTiesToEven) {
5745 RoundingMode Rounding = RoundingMode::NearestTiesToEven) {
5860 RoundingMode Rounding = RoundingMode::NearestTiesToEven) {
5866 return simplifyFMAFMul(Op0, Op1, FMF, Q, MaxRecurse, ExBehavior, Rounding);
5873 return ::simplifyFAddInst(Op0, Op1, FMF, Q,
RecursionLimit, ExBehavior,
5881 return ::simplifyFSubInst(Op0, Op1, FMF, Q,
RecursionLimit, ExBehavior,
5889 return ::simplifyFMulInst(Op0, Op1, FMF, Q,
RecursionLimit, ExBehavior,
5897 return ::simplifyFMAFMul(Op0, Op1, FMF, Q,
RecursionLimit, ExBehavior,
5905 RoundingMode Rounding = RoundingMode::NearestTiesToEven) {
5930 return ConstantFP::get(Op0->
getType(), 1.0);
5942 return ConstantFP::get(Op0->
getType(), -1.0);
5956 return ::simplifyFDivInst(Op0, Op1, FMF, Q,
RecursionLimit, ExBehavior,
5964 RoundingMode Rounding = RoundingMode::NearestTiesToEven) {
5994 return ::simplifyFRemInst(Op0, Op1, FMF, Q,
RecursionLimit, ExBehavior,
6003 unsigned MaxRecurse) {
6005 case Instruction::FNeg:
6017 unsigned MaxRecurse) {
6019 case Instruction::FNeg:
6040 case Instruction::Add:
6043 case Instruction::Sub:
6046 case Instruction::Mul:
6049 case Instruction::SDiv:
6051 case Instruction::UDiv:
6053 case Instruction::SRem:
6055 case Instruction::URem:
6057 case Instruction::Shl:
6060 case Instruction::LShr:
6062 case Instruction::AShr:
6064 case Instruction::And:
6066 case Instruction::Or:
6068 case Instruction::Xor:
6070 case Instruction::FAdd:
6072 case Instruction::FSub:
6074 case Instruction::FMul:
6076 case Instruction::FDiv:
6078 case Instruction::FRem:
6090 unsigned MaxRecurse) {
6092 case Instruction::FAdd:
6094 case Instruction::FSub:
6096 case Instruction::FMul:
6098 case Instruction::FDiv:
6134 case Intrinsic::fabs:
6135 case Intrinsic::floor:
6136 case Intrinsic::ceil:
6137 case Intrinsic::trunc:
6138 case Intrinsic::rint:
6139 case Intrinsic::nearbyint:
6140 case Intrinsic::round:
6141 case Intrinsic::roundeven:
6142 case Intrinsic::canonicalize:
6143 case Intrinsic::arithmetic_fence:
6155 case Intrinsic::floor:
6156 case Intrinsic::ceil:
6157 case Intrinsic::trunc:
6158 case Intrinsic::rint:
6159 case Intrinsic::nearbyint:
6160 case Intrinsic::round:
6161 case Intrinsic::roundeven:
6175 auto *OffsetConstInt = dyn_cast<ConstantInt>(
Offset);
6176 if (!OffsetConstInt || OffsetConstInt->getBitWidth() > 64)
6180 DL.getIndexTypeSizeInBits(
Ptr->getType()));
6181 if (OffsetInt.
srem(4) != 0)
6189 auto *LoadedCE = dyn_cast<ConstantExpr>(Loaded);
6193 if (LoadedCE->getOpcode() == Instruction::Trunc) {
6194 LoadedCE = dyn_cast<ConstantExpr>(LoadedCE->getOperand(0));
6199 if (LoadedCE->getOpcode() != Instruction::Sub)
6202 auto *LoadedLHS = dyn_cast<ConstantExpr>(LoadedCE->getOperand(0));
6203 if (!LoadedLHS || LoadedLHS->getOpcode() != Instruction::PtrToInt)
6205 auto *LoadedLHSPtr = LoadedLHS->getOperand(0);
6209 APInt LoadedRHSOffset;
6212 PtrSym != LoadedRHSSym || PtrOffset != LoadedRHSOffset)
6215 return LoadedLHSPtr;
6223 if (isa<PoisonValue>(Op0) || isa<PoisonValue>(Op1))
6246 if (
C && (
C->isZero() ||
C->isInfinity()))
6255 if (
C &&
C->isNaN())
6256 return ConstantFP::get(Op0->
getType(),
C->makeQuiet());
6274 if (
auto *
II = dyn_cast<IntrinsicInst>(Op0))
6275 if (
II->getIntrinsicID() == IID)
6284 auto *
II = dyn_cast<IntrinsicInst>(Op0);
6292 case Intrinsic::fabs:
6296 case Intrinsic::bswap:
6301 case Intrinsic::bitreverse:
6306 case Intrinsic::ctpop: {
6310 return ConstantInt::get(Op0->
getType(), 1);
6319 case Intrinsic::exp:
6321 if (Call->hasAllowReassoc() &&
6325 case Intrinsic::exp2:
6327 if (Call->hasAllowReassoc() &&
6331 case Intrinsic::exp10:
6333 if (Call->hasAllowReassoc() &&
6337 case Intrinsic::log:
6339 if (Call->hasAllowReassoc() &&
6343 case Intrinsic::log2:
6345 if (Call->hasAllowReassoc() &&
6351 case Intrinsic::log10:
6354 if (Call->hasAllowReassoc() &&
6360 case Intrinsic::vector_reverse:
6368 case Intrinsic::frexp: {
6392 auto *MM0 = dyn_cast<IntrinsicInst>(Op0);
6397 if (Op1 ==
X || Op1 ==
Y ||
6414 assert((IID == Intrinsic::maxnum || IID == Intrinsic::minnum ||
6415 IID == Intrinsic::maximum || IID == Intrinsic::minimum) &&
6416 "Unsupported intrinsic");
6418 auto *
M0 = dyn_cast<IntrinsicInst>(Op0);
6422 if (!
M0 ||
M0->getIntrinsicID() != IID)
6424 Value *X0 =
M0->getOperand(0);
6425 Value *Y0 =
M0->getOperand(1);
6432 if (X0 == Op1 || Y0 == Op1)
6435 auto *
M1 = dyn_cast<IntrinsicInst>(Op1);
6438 Value *X1 =
M1->getOperand(0);
6439 Value *Y1 =
M1->getOperand(1);
6447 if ((X0 == X1 && Y0 == Y1) || (X0 == Y1 && Y0 == X1))
6458 unsigned BitWidth = ReturnType->getScalarSizeInBits();
6460 case Intrinsic::abs:
6468 case Intrinsic::cttz: {
6474 case Intrinsic::ctlz: {
6482 case Intrinsic::ptrmask: {
6483 if (isa<PoisonValue>(Op0) || isa<PoisonValue>(Op1))
6493 "Invalid mask width");
6510 APInt IrrelevantPtrBits =
6513 Instruction::Or,
C, ConstantInt::get(
C->getType(), IrrelevantPtrBits),
6515 if (
C !=
nullptr &&
C->isAllOnesValue())
6520 case Intrinsic::smax:
6521 case Intrinsic::smin:
6522 case Intrinsic::umax:
6523 case Intrinsic::umin: {
6534 return ConstantInt::get(
6542 return ConstantInt::get(ReturnType, *
C);
6553 auto *MinMax0 = dyn_cast<IntrinsicInst>(Op0);
6554 if (MinMax0 && MinMax0->getIntrinsicID() == IID) {
6556 Value *M00 = MinMax0->getOperand(0), *M01 = MinMax0->getOperand(1);
6557 const APInt *InnerC;
6560 ICmpInst::getNonStrictPredicate(
6580 case Intrinsic::scmp:
6581 case Intrinsic::ucmp: {
6588 IID == Intrinsic::scmp ? ICmpInst::ICMP_SGT : ICmpInst::ICMP_UGT;
6590 return ConstantInt::get(ReturnType, 1);
6593 IID == Intrinsic::scmp ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT;
6599 case Intrinsic::usub_with_overflow:
6600 case Intrinsic::ssub_with_overflow:
6607 case Intrinsic::uadd_with_overflow:
6608 case Intrinsic::sadd_with_overflow:
6613 cast<StructType>(ReturnType),
6618 case Intrinsic::umul_with_overflow:
6619 case Intrinsic::smul_with_overflow:
6629 case Intrinsic::uadd_sat:
6635 case Intrinsic::sadd_sat:
6650 case Intrinsic::usub_sat:
6655 case Intrinsic::ssub_sat:
6663 case Intrinsic::load_relative:
6664 if (
auto *C0 = dyn_cast<Constant>(Op0))
6665 if (
auto *C1 = dyn_cast<Constant>(Op1))
6668 case Intrinsic::powi:
6669 if (
auto *Power = dyn_cast<ConstantInt>(Op1)) {
6671 if (Power->isZero())
6672 return ConstantFP::get(Op0->
getType(), 1.0);
6678 case Intrinsic::ldexp:
6680 case Intrinsic::copysign:
6690 case Intrinsic::is_fpclass: {
6691 if (isa<PoisonValue>(Op0))
6694 uint64_t Mask = cast<ConstantInt>(Op1)->getZExtValue();
6697 return ConstantInt::get(ReturnType,
true);
6699 return ConstantInt::get(ReturnType,
false);
6704 case Intrinsic::maxnum:
6705 case Intrinsic::minnum:
6706 case Intrinsic::maximum:
6707 case Intrinsic::minimum: {
6713 if (isa<Constant>(Op0))
6720 bool PropagateNaN = IID == Intrinsic::minimum || IID == Intrinsic::maximum;
6721 bool IsMin = IID == Intrinsic::minimum || IID == Intrinsic::minnum;
6728 return PropagateNaN ?
propagateNaN(cast<Constant>(Op1)) : Op0;
6734 (
C->isInfinity() || (Call && Call->hasNoInfs() &&
C->isLargest()))) {
6739 if (
C->isNegative() == IsMin &&
6740 (!PropagateNaN || (Call && Call->hasNoNaNs())))
6741 return ConstantFP::get(ReturnType, *
C);
6747 if (
C->isNegative() != IsMin &&
6748 (PropagateNaN || (Call && Call->hasNoNaNs())))
6761 case Intrinsic::vector_extract: {
6763 unsigned IdxN = cast<ConstantInt>(Op1)->getZExtValue();
6767 IdxN == 0 &&
X->getType() == ReturnType)
6783 assert(Call->arg_size() == Args.size());
6784 unsigned NumOperands = Args.size();
6792 case Intrinsic::vscale: {
6796 return ConstantInt::get(
RetTy,
C->getZExtValue());
6804 if (NumOperands == 1)
6807 if (NumOperands == 2)
6813 case Intrinsic::masked_load:
6814 case Intrinsic::masked_gather: {
6815 Value *MaskArg = Args[2];
6816 Value *PassthruArg = Args[3];
6822 case Intrinsic::fshl:
6823 case Intrinsic::fshr: {
6824 Value *Op0 = Args[0], *Op1 = Args[1], *ShAmtArg = Args[2];
6832 return Args[IID == Intrinsic::fshl ? 0 : 1];
6834 const APInt *ShAmtC;
6839 return Args[IID == Intrinsic::fshl ? 0 : 1];
6844 return ConstantInt::getNullValue(
F->getReturnType());
6848 return ConstantInt::getAllOnesValue(
F->getReturnType());
6852 case Intrinsic::experimental_constrained_fma: {
6853 auto *FPI = cast<ConstrainedFPIntrinsic>(Call);
6855 *FPI->getRoundingMode()))
6859 case Intrinsic::fma:
6860 case Intrinsic::fmuladd: {
6862 RoundingMode::NearestTiesToEven))
6866 case Intrinsic::smul_fix:
6867 case Intrinsic::smul_fix_sat: {
6868 Value *Op0 = Args[0];
6869 Value *Op1 = Args[1];
6870 Value *Op2 = Args[2];
6871 Type *ReturnType =
F->getReturnType();
6876 if (isa<Constant>(Op0))
6890 cast<ConstantInt>(Op2)->getZExtValue());
6896 case Intrinsic::vector_insert: {
6897 Value *Vec = Args[0];
6898 Value *SubVec = Args[1];
6900 Type *ReturnType =
F->getReturnType();
6904 unsigned IdxN = cast<ConstantInt>(
Idx)->getZExtValue();
6909 X->getType() == ReturnType)
6914 case Intrinsic::experimental_constrained_fadd: {
6915 auto *FPI = cast<ConstrainedFPIntrinsic>(Call);
6917 *FPI->getExceptionBehavior(),
6918 *FPI->getRoundingMode());
6920 case Intrinsic::experimental_constrained_fsub: {
6921 auto *FPI = cast<ConstrainedFPIntrinsic>(Call);
6923 *FPI->getExceptionBehavior(),
6924 *FPI->getRoundingMode());
6926 case Intrinsic::experimental_constrained_fmul: {
6927 auto *FPI = cast<ConstrainedFPIntrinsic>(Call);
6929 *FPI->getExceptionBehavior(),
6930 *FPI->getRoundingMode());
6932 case Intrinsic::experimental_constrained_fdiv: {
6933 auto *FPI = cast<ConstrainedFPIntrinsic>(Call);
6935 *FPI->getExceptionBehavior(),
6936 *FPI->getRoundingMode());
6938 case Intrinsic::experimental_constrained_frem: {
6939 auto *FPI = cast<ConstrainedFPIntrinsic>(Call);
6941 *FPI->getExceptionBehavior(),
6942 *FPI->getRoundingMode());
6944 case Intrinsic::experimental_constrained_ldexp:
6946 case Intrinsic::experimental_gc_relocate: {
6952 if (isa<UndefValue>(DerivedPtr) || isa<UndefValue>(BasePtr)) {
6956 if (
auto *PT = dyn_cast<PointerType>(GCR.
getType())) {
6960 if (isa<ConstantPointerNull>(DerivedPtr)) {
6975 auto *
F = dyn_cast<Function>(Callee);
6980 ConstantArgs.
reserve(Args.size());
6981 for (
Value *Arg : Args) {
6984 if (isa<MetadataAsValue>(Arg))
6997 assert(Call->arg_size() == Args.size());
7001 if (Call->isMustTailCall())
7006 if (isa<UndefValue>(Callee) || isa<ConstantPointerNull>(Callee))
7012 auto *
F = dyn_cast<Function>(Callee);
7013 if (
F &&
F->isIntrinsic())
7021 assert(isa<ConstrainedFPIntrinsic>(Call));
7040 return ::simplifyFreezeInst(Op0, Q);
7048 if (
auto *PtrOpC = dyn_cast<Constant>(PtrOp))
7054 if (!GV || !GV->isConstant() || !GV->hasDefinitiveInitializer())
7085 unsigned MaxRecurse) {
7086 assert(
I->getFunction() &&
"instruction should be inserted in a function");
7088 "context instruction should be in the same function");
7092 switch (
I->getOpcode()) {
7097 [](
Value *V) { return cast<Constant>(V); });
7101 case Instruction::FNeg:
7103 case Instruction::FAdd:
7106 case Instruction::Add:
7110 case Instruction::FSub:
7113 case Instruction::Sub:
7117 case Instruction::FMul:
7120 case Instruction::Mul:
7124 case Instruction::SDiv:
7128 case Instruction::UDiv:
7132 case Instruction::FDiv:
7135 case Instruction::SRem:
7137 case Instruction::URem:
7139 case Instruction::FRem:
7142 case Instruction::Shl:
7146 case Instruction::LShr:
7150 case Instruction::AShr:
7154 case Instruction::And:
7156 case Instruction::Or:
7158 case Instruction::Xor:
7160 case Instruction::ICmp:
7162 NewOps[1], Q, MaxRecurse);
7163 case Instruction::FCmp:
7165 NewOps[1],
I->getFastMathFlags(), Q, MaxRecurse);
7166 case Instruction::Select:
7168 case Instruction::GetElementPtr: {
7169 auto *GEPI = cast<GetElementPtrInst>(
I);
7171 ArrayRef(NewOps).slice(1), GEPI->getNoWrapFlags(), Q,
7174 case Instruction::InsertValue: {
7179 case Instruction::InsertElement:
7181 case Instruction::ExtractValue: {
7182 auto *EVI = cast<ExtractValueInst>(
I);
7186 case Instruction::ExtractElement:
7188 case Instruction::ShuffleVector: {
7189 auto *SVI = cast<ShuffleVectorInst>(
I);
7191 SVI->getShuffleMask(), SVI->getType(), Q,
7194 case Instruction::PHI:
7196 case Instruction::Call:
7198 cast<CallInst>(
I), NewOps.
back(),
7199 NewOps.
drop_back(1 + cast<CallInst>(
I)->getNumTotalBundleOperands()), Q);
7200 case Instruction::Freeze:
7202#define HANDLE_CAST_INST(num, opc, clas) case Instruction::opc:
7203#include "llvm/IR/Instruction.def"
7204#undef HANDLE_CAST_INST
7207 case Instruction::Alloca:
7210 case Instruction::Load:
7219 "Number of operands should match the instruction!");
7220 return ::simplifyInstructionWithOperands(
I, NewOps, SQ,
RecursionLimit);
7250 bool Simplified =
false;
7257 for (
User *U :
I->users())
7259 Worklist.
insert(cast<Instruction>(U));
7262 I->replaceAllUsesWith(SimpleV);
7264 if (!
I->isEHPad() && !
I->isTerminator() && !
I->mayHaveSideEffects())
7265 I->eraseFromParent();
7277 if (UnsimplifiedUsers)
7278 UnsimplifiedUsers->insert(
I);
7287 for (
User *U :
I->users())
7288 Worklist.
insert(cast<Instruction>(U));
7291 I->replaceAllUsesWith(SimpleV);
7293 if (!
I->isEHPad() && !
I->isTerminator() && !
I->mayHaveSideEffects())
7294 I->eraseFromParent();
7303 assert(
I != SimpleV &&
"replaceAndRecursivelySimplify(X,X) is not valid!");
7304 assert(SimpleV &&
"Must provide a simplified value.");
7312 auto *DT = DTWP ? &DTWP->getDomTree() :
nullptr;
7314 auto *TLI = TLIWP ? &TLIWP->
getTLI(
F) :
nullptr;
7317 return {
F.getDataLayout(), TLI, DT, AC};
7325template <
class T,
class... TArgs>
7328 auto *DT = AM.template getCachedResult<DominatorTreeAnalysis>(
F);
7329 auto *TLI = AM.template getCachedResult<TargetLibraryAnalysis>(
F);
7330 auto *AC = AM.template getCachedResult<AssumptionAnalysis>(
F);
7331 return {
F.getDataLayout(), TLI, DT, AC};
7345void InstSimplifyFolder::anchor() {}
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")
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
static GCMetadataPrinterRegistry::Add< ErlangGCPrinter > X("erlang", "erlang-compatible garbage collector")
static Value * simplifyFreezeInst(Value *Op0, const SimplifyQuery &Q)
Given operands for a Freeze, see if we can fold the result.
static Value * simplifyCmpSelFalseCase(CmpPredicate Pred, Value *LHS, Value *RHS, Value *Cond, const SimplifyQuery &Q, unsigned MaxRecurse)
Simplify comparison with false branch of select.
static Value * simplifyCmpSelCase(CmpPredicate Pred, Value *LHS, Value *RHS, Value *Cond, const SimplifyQuery &Q, unsigned MaxRecurse, Constant *TrueOrFalse)
Simplify comparison with true or false branch of select: sel = select i1 cond, i32 tv,...
static Value * simplifyLShrInst(Value *Op0, Value *Op1, bool IsExact, const SimplifyQuery &Q, unsigned MaxRecurse)
Given operands for an LShr, see if we can fold the result.
static Value * simplifyUDivInst(Value *Op0, Value *Op1, bool IsExact, const SimplifyQuery &Q, unsigned MaxRecurse)
Given operands for a UDiv, see if we can fold the result.
static Value * simplifyShuffleVectorInst(Value *Op0, Value *Op1, ArrayRef< int > Mask, Type *RetTy, const SimplifyQuery &Q, unsigned MaxRecurse)
static Value * foldMinMaxSharedOp(Intrinsic::ID IID, Value *Op0, Value *Op1)
Given a min/max intrinsic, see if it can be removed based on having an operand that is another min/ma...
static Value * simplifySubInst(Value *Op0, Value *Op1, bool IsNSW, bool IsNUW, const SimplifyQuery &Q, unsigned MaxRecurse)
Given operands for a Sub, see if we can fold the result.
static Value * simplifyFCmpInst(CmpPredicate Pred, Value *LHS, Value *RHS, FastMathFlags FMF, const SimplifyQuery &Q, unsigned MaxRecurse)
Given operands for an FCmpInst, see if we can fold the result.
static Value * expandCommutativeBinOp(Instruction::BinaryOps Opcode, Value *L, Value *R, Instruction::BinaryOps OpcodeToExpand, const SimplifyQuery &Q, unsigned MaxRecurse)
Try to simplify binops of form "A op (B op' C)" or the commuted variant by distributing op over op'.
static Constant * foldOrCommuteConstant(Instruction::BinaryOps Opcode, Value *&Op0, Value *&Op1, const SimplifyQuery &Q)
static bool haveNonOverlappingStorage(const Value *V1, const Value *V2)
Return true if V1 and V2 are each the base of some distict storage region [V, object_size(V)] which d...
static Constant * foldConstant(Instruction::UnaryOps Opcode, Value *&Op, const SimplifyQuery &Q)
static Value * handleOtherCmpSelSimplifications(Value *TCmp, Value *FCmp, Value *Cond, const SimplifyQuery &Q, unsigned MaxRecurse)
We know comparison with both branches of select can be simplified, but they are not equal.
static Value * threadCmpOverPHI(CmpPredicate Pred, Value *LHS, Value *RHS, const SimplifyQuery &Q, unsigned MaxRecurse)
In the case of a comparison with a PHI instruction, try to simplify the comparison by seeing whether ...
static Constant * propagateNaN(Constant *In)
Try to propagate existing NaN values when possible.
static Value * simplifyICmpOfBools(CmpPredicate Pred, Value *LHS, Value *RHS, const SimplifyQuery &Q)
Fold an icmp when its operands have i1 scalar type.
static Value * simplifyICmpWithBinOpOnLHS(CmpPredicate Pred, BinaryOperator *LBO, Value *RHS, const SimplifyQuery &Q, unsigned MaxRecurse)
static Value * simplifyAShrInst(Value *Op0, Value *Op1, bool IsExact, const SimplifyQuery &Q, unsigned MaxRecurse)
Given operands for an AShr, see if we can fold the result.
static Value * simplifyRelativeLoad(Constant *Ptr, Constant *Offset, const DataLayout &DL)
static Value * simplifyDiv(Instruction::BinaryOps Opcode, Value *Op0, Value *Op1, bool IsExact, const SimplifyQuery &Q, unsigned MaxRecurse)
These are simplifications common to SDiv and UDiv.
static Value * simplifyPHINode(PHINode *PN, ArrayRef< Value * > IncomingValues, const SimplifyQuery &Q)
See if we can fold the given phi. If not, returns null.
static Value * simplifyExtractValueInst(Value *Agg, ArrayRef< unsigned > Idxs, const SimplifyQuery &, unsigned)
Given operands for an ExtractValueInst, see if we can fold the result.
static Value * simplifySelectInst(Value *, Value *, Value *, const SimplifyQuery &, unsigned)
Given operands for a SelectInst, see if we can fold the result.
static Value * simplifyAddInst(Value *Op0, Value *Op1, bool IsNSW, bool IsNUW, const SimplifyQuery &Q, unsigned MaxRecurse)
Given operands for an Add, see if we can fold the result.
static Value * simplifyUnOp(unsigned, Value *, const SimplifyQuery &, unsigned)
Given the operand for a UnaryOperator, see if we can fold the result.
static bool isSameCompare(Value *V, CmpPredicate Pred, Value *LHS, Value *RHS)
isSameCompare - Is V equivalent to the comparison "LHS Pred RHS"?
static Value * simplifyAndCommutative(Value *Op0, Value *Op1, const SimplifyQuery &Q, unsigned MaxRecurse)
static Value * simplifyInstructionWithOperands(Instruction *I, ArrayRef< Value * > NewOps, const SimplifyQuery &SQ, unsigned MaxRecurse)
See if we can compute a simplified version of this instruction.
static bool isIdempotent(Intrinsic::ID ID)
static std::optional< ConstantRange > getRange(Value *V, const InstrInfoQuery &IIQ)
Helper method to get range from metadata or attribute.
static Value * simplifyAndOrOfICmpsWithCtpop(ICmpInst *Cmp0, ICmpInst *Cmp1, bool IsAnd)
Try to simplify and/or of icmp with ctpop intrinsic.
static Value * simplifyUnsignedRangeCheck(ICmpInst *ZeroICmp, ICmpInst *UnsignedICmp, bool IsAnd, const SimplifyQuery &Q)
Commuted variants are assumed to be handled by calling this function again with the parameters swappe...
static Value * tryConstantFoldCall(CallBase *Call, Value *Callee, ArrayRef< Value * > Args, const SimplifyQuery &Q)
static Value * simplifyWithOpsReplaced(Value *V, ArrayRef< std::pair< Value *, Value * > > Ops, const SimplifyQuery &Q, bool AllowRefinement, SmallVectorImpl< Instruction * > *DropFlags, unsigned MaxRecurse)
static Value * simplifyICmpInst(CmpPredicate Predicate, Value *LHS, Value *RHS, const SimplifyQuery &Q, unsigned MaxRecurse)
Given operands for an ICmpInst, see if we can fold the result.
static Value * simplifyExtractElementInst(Value *Vec, Value *Idx, const SimplifyQuery &Q, unsigned)
Given operands for an ExtractElementInst, see if we can fold the result.
static Value * simplifyAndOfICmpsWithAdd(ICmpInst *Op0, ICmpInst *Op1, const InstrInfoQuery &IIQ)
static Value * simplifyICmpWithMinMax(CmpPredicate Pred, Value *LHS, Value *RHS, const SimplifyQuery &Q, unsigned MaxRecurse)
simplify integer comparisons where at least one operand of the compare matches an integer min/max idi...
static Value * simplifyCmpSelTrueCase(CmpPredicate Pred, Value *LHS, Value *RHS, Value *Cond, const SimplifyQuery &Q, unsigned MaxRecurse)
Simplify comparison with true branch of select.
static Value * simplifyIntrinsic(CallBase *Call, Value *Callee, ArrayRef< Value * > Args, const SimplifyQuery &Q)
static void getUnsignedMonotonicValues(SmallPtrSetImpl< Value * > &Res, Value *V, MonotonicType Type, unsigned Depth=0)
Get values V_i such that V uge V_i (GreaterEq) or V ule V_i (LowerEq).
static bool isPoisonShift(Value *Amount, const SimplifyQuery &Q)
Returns true if a shift by Amount always yields poison.
static APInt stripAndComputeConstantOffsets(const DataLayout &DL, Value *&V, bool AllowNonInbounds=false)
Compute the base pointer and cumulative constant offsets for V.
static Value * simplifyCmpInst(CmpPredicate, Value *, Value *, const SimplifyQuery &, unsigned)
Given operands for a CmpInst, see if we can fold the result.
static Value * simplifyFMAFMul(Value *Op0, Value *Op1, FastMathFlags FMF, const SimplifyQuery &Q, unsigned MaxRecurse, fp::ExceptionBehavior ExBehavior, RoundingMode Rounding)
static Value * simplifyRightShift(Instruction::BinaryOps Opcode, Value *Op0, Value *Op1, bool IsExact, const SimplifyQuery &Q, unsigned MaxRecurse)
Given operands for an LShr or AShr, see if we can fold the result.
static Value * simplifyICmpWithIntrinsicOnLHS(CmpPredicate Pred, Value *LHS, Value *RHS)
static Value * simplifySDivInst(Value *Op0, Value *Op1, bool IsExact, const SimplifyQuery &Q, unsigned MaxRecurse)
Given operands for an SDiv, see if we can fold the result.
static Value * simplifyByDomEq(unsigned Opcode, Value *Op0, Value *Op1, const SimplifyQuery &Q, unsigned MaxRecurse)
Test if there is a dominating equivalence condition for the two operands.
static Value * simplifyFPUnOp(unsigned, Value *, const FastMathFlags &, const SimplifyQuery &, unsigned)
Given the operand for a UnaryOperator, see if we can fold the result.
static Value * simplifyICmpWithBinOp(CmpPredicate Pred, Value *LHS, Value *RHS, const SimplifyQuery &Q, unsigned MaxRecurse)
TODO: A large part of this logic is duplicated in InstCombine's foldICmpBinOp().
static Value * simplifyFAddInst(Value *Op0, Value *Op1, FastMathFlags FMF, const SimplifyQuery &Q, unsigned MaxRecurse, fp::ExceptionBehavior ExBehavior=fp::ebIgnore, RoundingMode Rounding=RoundingMode::NearestTiesToEven)
Given operands for an FAdd, see if we can fold the result.
static Value * simplifyOrOfICmps(ICmpInst *Op0, ICmpInst *Op1, const SimplifyQuery &Q)
static Value * expandBinOp(Instruction::BinaryOps Opcode, Value *V, Value *OtherOp, Instruction::BinaryOps OpcodeToExpand, const SimplifyQuery &Q, unsigned MaxRecurse)
Try to simplify a binary operator of form "V op OtherOp" where V is "(B0 opex B1)" by distributing 'o...
static Value * simplifyICmpWithZero(CmpPredicate Pred, Value *LHS, Value *RHS, const SimplifyQuery &Q)
Try hard to fold icmp with zero RHS because this is a common case.
static Value * simplifyICmpWithConstant(CmpPredicate Pred, Value *LHS, Value *RHS, const InstrInfoQuery &IIQ)
static Value * simplifySelectWithFCmp(Value *Cond, Value *T, Value *F, const SimplifyQuery &Q, unsigned MaxRecurse)
Try to simplify a select instruction when its condition operand is a floating-point comparison.
static Constant * getFalse(Type *Ty)
For a boolean type or a vector of boolean type, return false or a vector with every element false.
static Value * simplifyDivRem(Instruction::BinaryOps Opcode, Value *Op0, Value *Op1, const SimplifyQuery &Q, unsigned MaxRecurse)
Check for common or similar folds of integer division or integer remainder.
static bool removesFPFraction(Intrinsic::ID ID)
Return true if the intrinsic rounds a floating-point value to an integral floating-point value (not a...
static Value * simplifyFDivInst(Value *Op0, Value *Op1, FastMathFlags FMF, const SimplifyQuery &Q, unsigned, fp::ExceptionBehavior ExBehavior=fp::ebIgnore, RoundingMode Rounding=RoundingMode::NearestTiesToEven)
static Value * simplifyOrOfICmpsWithAdd(ICmpInst *Op0, ICmpInst *Op1, const InstrInfoQuery &IIQ)
static Value * simplifySelectWithEquivalence(ArrayRef< std::pair< Value *, Value * > > Replacements, Value *TrueVal, Value *FalseVal, const SimplifyQuery &Q, unsigned MaxRecurse)
Try to simplify a select instruction when its condition operand is an integer equality or floating-po...
static Value * simplifyMulInst(Value *Op0, Value *Op1, bool IsNSW, bool IsNUW, const SimplifyQuery &Q, unsigned MaxRecurse)
Given operands for a Mul, see if we can fold the result.
static Value * simplifyFNegInst(Value *Op, FastMathFlags FMF, const SimplifyQuery &Q, unsigned MaxRecurse)
Given the operand for an FNeg, see if we can fold the result.
static Value * simplifyOrInst(Value *, Value *, const SimplifyQuery &, unsigned)
Given operands for an Or, see if we can fold the result.
static bool trySimplifyICmpWithAdds(CmpPredicate Pred, Value *LHS, Value *RHS, const InstrInfoQuery &IIQ)
static Value * simplifySelectBitTest(Value *TrueVal, Value *FalseVal, Value *X, const APInt *Y, bool TrueWhenUnset)
Try to simplify a select instruction when its condition operand is an integer comparison where one op...
static Value * simplifyAssociativeBinOp(Instruction::BinaryOps Opcode, Value *LHS, Value *RHS, const SimplifyQuery &Q, unsigned MaxRecurse)
Generic simplifications for associative binary operations.
static Value * simplifyShlInst(Value *Op0, Value *Op1, bool IsNSW, bool IsNUW, const SimplifyQuery &Q, unsigned MaxRecurse)
Given operands for an Shl, see if we can fold the result.
static Value * threadBinOpOverPHI(Instruction::BinaryOps Opcode, Value *LHS, Value *RHS, const SimplifyQuery &Q, unsigned MaxRecurse)
In the case of a binary operation with an operand that is a PHI instruction, try to simplify the bino...
static Value * simplifyCmpSelOfMaxMin(Value *CmpLHS, Value *CmpRHS, CmpPredicate Pred, Value *TVal, Value *FVal)
static Value * simplifyFRemInst(Value *Op0, Value *Op1, FastMathFlags FMF, const SimplifyQuery &Q, unsigned, fp::ExceptionBehavior ExBehavior=fp::ebIgnore, RoundingMode Rounding=RoundingMode::NearestTiesToEven)
static Value * simplifyFSubInst(Value *Op0, Value *Op1, FastMathFlags FMF, const SimplifyQuery &Q, unsigned MaxRecurse, fp::ExceptionBehavior ExBehavior=fp::ebIgnore, RoundingMode Rounding=RoundingMode::NearestTiesToEven)
Given operands for an FSub, see if we can fold the result.
static Value * simplifyXorInst(Value *, Value *, const SimplifyQuery &, unsigned)
Given operands for a Xor, see if we can fold the result.
static Value * simplifyURemInst(Value *Op0, Value *Op1, const SimplifyQuery &Q, unsigned MaxRecurse)
Given operands for a URem, see if we can fold the result.
static Constant * simplifyFPOp(ArrayRef< Value * > Ops, FastMathFlags FMF, const SimplifyQuery &Q, fp::ExceptionBehavior ExBehavior, RoundingMode Rounding)
Perform folds that are common to any floating-point operation.
static Value * threadCmpOverSelect(CmpPredicate Pred, Value *LHS, Value *RHS, const SimplifyQuery &Q, unsigned MaxRecurse)
In the case of a comparison with a select instruction, try to simplify the comparison by seeing wheth...
static bool replaceAndRecursivelySimplifyImpl(Instruction *I, Value *SimpleV, const TargetLibraryInfo *TLI, const DominatorTree *DT, AssumptionCache *AC, SmallSetVector< Instruction *, 8 > *UnsimplifiedUsers=nullptr)
Implementation of recursive simplification through an instruction's uses.
static bool isAllocDisjoint(const Value *V)
Return true if the underlying object (storage) must be disjoint from storage returned by any noalias ...
static Constant * getTrue(Type *Ty)
For a boolean type or a vector of boolean type, return true or a vector with every element true.
static Value * simplifyGEPInst(Type *, Value *, ArrayRef< Value * >, GEPNoWrapFlags, const SimplifyQuery &, unsigned)
Given operands for an GetElementPtrInst, see if we can fold the result.
static bool isDivZero(Value *X, Value *Y, const SimplifyQuery &Q, unsigned MaxRecurse, bool IsSigned)
Return true if we can simplify X / Y to 0.
static Value * simplifyLdexp(Value *Op0, Value *Op1, const SimplifyQuery &Q, bool IsStrict)
static Value * simplifyLogicOfAddSub(Value *Op0, Value *Op1, Instruction::BinaryOps Opcode)
Given a bitwise logic op, check if the operands are add/sub with a common source value and inverted c...
static Value * simplifySelectWithBitTest(Value *CondVal, Value *TrueVal, Value *FalseVal)
An alternative way to test if a bit is set or not.
static Value * simplifyOrLogic(Value *X, Value *Y)
static Type * getCompareTy(Value *Op)
static Value * simplifyCastInst(unsigned, Value *, Type *, const SimplifyQuery &, unsigned)
static Value * simplifyAndOfICmps(ICmpInst *Op0, ICmpInst *Op1, const SimplifyQuery &Q)
static Value * simplifyBinOp(unsigned, Value *, Value *, const SimplifyQuery &, unsigned)
Given operands for a BinaryOperator, see if we can fold the result.
static bool isICmpTrue(CmpPredicate Pred, Value *LHS, Value *RHS, const SimplifyQuery &Q, unsigned MaxRecurse)
Given a predicate and two operands, return true if the comparison is true.
static Value * simplifyInsertValueInst(Value *Agg, Value *Val, ArrayRef< unsigned > Idxs, const SimplifyQuery &Q, unsigned)
Given operands for an InsertValueInst, see if we can fold the result.
static Value * simplifyAndInst(Value *, Value *, const SimplifyQuery &, unsigned)
Given operands for an And, see if we can fold the result.
static Value * foldIdentityShuffles(int DestElt, Value *Op0, Value *Op1, int MaskVal, Value *RootVec, unsigned MaxRecurse)
For the given destination element of a shuffle, peek through shuffles to match a root vector source o...
static Value * simplifyAndOrOfFCmps(const SimplifyQuery &Q, FCmpInst *LHS, FCmpInst *RHS, bool IsAnd)
static Value * extractEquivalentCondition(Value *V, CmpPredicate Pred, Value *LHS, Value *RHS)
Rummage around inside V looking for something equivalent to the comparison "LHS Pred RHS".
static Value * simplifyAndOrOfCmps(const SimplifyQuery &Q, Value *Op0, Value *Op1, bool IsAnd)
static Value * simplifyWithOpReplaced(Value *V, Value *Op, Value *RepOp, const SimplifyQuery &Q, bool AllowRefinement, SmallVectorImpl< Instruction * > *DropFlags, unsigned MaxRecurse)
static Value * threadBinOpOverSelect(Instruction::BinaryOps Opcode, Value *LHS, Value *RHS, const SimplifyQuery &Q, unsigned MaxRecurse)
In the case of a binary operation with a select instruction as an operand, try to simplify the binop ...
static Value * simplifyICmpUsingMonotonicValues(CmpPredicate Pred, Value *LHS, Value *RHS)
static Constant * computePointerDifference(const DataLayout &DL, Value *LHS, Value *RHS)
Compute the constant difference between two pointer values.
static Value * simplifySRemInst(Value *Op0, Value *Op1, const SimplifyQuery &Q, unsigned MaxRecurse)
Given operands for an SRem, see if we can fold the result.
static Value * simplifyFMulInst(Value *Op0, Value *Op1, FastMathFlags FMF, const SimplifyQuery &Q, unsigned MaxRecurse, fp::ExceptionBehavior ExBehavior=fp::ebIgnore, RoundingMode Rounding=RoundingMode::NearestTiesToEven)
Given the operands for an FMul, see if we can fold the result.
static Value * simplifyAndOrOfICmpsWithConstants(ICmpInst *Cmp0, ICmpInst *Cmp1, bool IsAnd)
Test if a pair of compares with a shared operand and 2 constants has an empty set intersection,...
static Value * simplifyAndOrWithICmpEq(unsigned Opcode, Value *Op0, Value *Op1, const SimplifyQuery &Q, unsigned MaxRecurse)
static Value * simplifyICmpWithDominatingAssume(CmpPredicate Predicate, Value *LHS, Value *RHS, const SimplifyQuery &Q)
static Value * simplifyShift(Instruction::BinaryOps Opcode, Value *Op0, Value *Op1, bool IsNSW, const SimplifyQuery &Q, unsigned MaxRecurse)
Given operands for an Shl, LShr or AShr, see if we can fold the result.
static Constant * computePointerICmp(CmpPredicate Pred, Value *LHS, Value *RHS, const SimplifyQuery &Q)
static Value * simplifyRem(Instruction::BinaryOps Opcode, Value *Op0, Value *Op1, const SimplifyQuery &Q, unsigned MaxRecurse)
These are simplifications common to SRem and URem.
static bool valueDominatesPHI(Value *V, PHINode *P, const DominatorTree *DT)
Does the given value dominate the specified phi node?
static Value * simplifySelectWithICmpCond(Value *CondVal, Value *TrueVal, Value *FalseVal, const SimplifyQuery &Q, unsigned MaxRecurse)
Try to simplify a select instruction when its condition operand is an integer comparison.
static Value * foldMinimumMaximumSharedOp(Intrinsic::ID IID, Value *Op0, Value *Op1)
Given a min/max intrinsic, see if it can be removed based on having an operand that is another min/ma...
static Value * simplifyUnaryIntrinsic(Function *F, Value *Op0, const SimplifyQuery &Q, const CallBase *Call)
This header provides classes for managing per-loop analyses.
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 implements a set that has insertion order iteration characteristics.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
static SymbolRef::Type getType(const Symbol *Sym)
static const uint32_t IV[8]
Class for arbitrary precision integers.
APInt zextOrTrunc(unsigned width) const
Zero extend or truncate to width.
unsigned getActiveBits() const
Compute the number of active bits in the value.
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
APInt urem(const APInt &RHS) const
Unsigned remainder operation.
void setSignBit()
Set the sign bit to 1.
unsigned getBitWidth() const
Return the number of bits in the APInt.
bool ult(const APInt &RHS) const
Unsigned less than comparison.
bool intersects(const APInt &RHS) const
This operation tests if there are any pairs of corresponding bits between this APInt and RHS that are...
unsigned countr_zero() const
Count the number of trailing zero bits.
bool isNonPositive() const
Determine if this APInt Value is non-positive (<= 0).
APInt sextOrTrunc(unsigned width) const
Sign extend or truncate to width.
bool isStrictlyPositive() const
Determine if this APInt Value is positive.
uint64_t getLimitedValue(uint64_t Limit=UINT64_MAX) const
If this value is smaller than the specified limit, return it, otherwise return the limit value.
bool getBoolValue() const
Convert APInt to a boolean value.
APInt srem(const APInt &RHS) const
Function for signed remainder operation.
bool isMask(unsigned numBits) const
bool isMaxSignedValue() const
Determine if this is the largest signed value.
bool isNonNegative() const
Determine if this APInt Value is non-negative (>= 0)
bool ule(const APInt &RHS) const
Unsigned less or equal comparison.
bool isSubsetOf(const APInt &RHS) const
This operation checks that all bits set in this APInt are also set in RHS.
bool isPowerOf2() const
Check if this APInt's value is a power of two greater than zero.
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
bool isSignBitSet() const
Determine if sign bit of this APInt is set.
bool slt(const APInt &RHS) const
Signed less than comparison.
static APInt getHighBitsSet(unsigned numBits, unsigned hiBitsSet)
Constructs an APInt value that has the top hiBitsSet bits set.
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
bool isOne() const
Determine if this is a value of 1.
static APInt getOneBitSet(unsigned numBits, unsigned BitNo)
Return an APInt with exactly one bit set in the result.
bool uge(const APInt &RHS) const
Unsigned greater or equal comparison.
an instruction to allocate memory on the stack
A container for analyses that lazily runs them and caches their results.
This class represents an incoming formal argument to a Function.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
const T & back() const
back - Get the last element.
size_t size() const
size - Get the array size.
ArrayRef< T > drop_back(size_t N=1) const
Drop the last N elements of the array.
bool empty() const
empty - Check if the array is empty.
ArrayRef< T > slice(size_t N, size_t M) const
slice(n, m) - Chop off the first N elements of the array, and keep M elements in the array.
An immutable pass that tracks lazily created AssumptionCache objects.
AssumptionCache & getAssumptionCache(Function &F)
Get the cached assumptions for a function.
A cache of @llvm.assume calls within a function.
MutableArrayRef< ResultElem > assumptionsFor(const Value *V)
Access the list of assumptions which affect this value.
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction if the block is well formed or null if the block is not well forme...
BinaryOps getOpcode() const
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
This class represents a function call, abstracting a target machine's calling convention.
static unsigned isEliminableCastPair(Instruction::CastOps firstOpcode, Instruction::CastOps secondOpcode, Type *SrcTy, Type *MidTy, Type *DstTy, Type *SrcIntPtrTy, Type *MidIntPtrTy, Type *DstIntPtrTy)
Determine how a pair of casts can be eliminated, if they can be at all.
This class is the base class for the comparison instructions.
static Type * makeCmpResultType(Type *opnd_type)
Create a result type for fcmp/icmp.
Predicate getStrictPredicate() const
For example, SGE -> SGT, SLE -> SLT, ULE -> ULT, UGE -> UGT.
bool isFalseWhenEqual() const
This is just a convenience.
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
@ ICMP_SLT
signed less than
@ ICMP_SLE
signed less or equal
@ ICMP_UGE
unsigned greater or equal
@ ICMP_UGT
unsigned greater than
@ ICMP_SGT
signed greater than
@ ICMP_ULT
unsigned less than
@ ICMP_SGE
signed greater or equal
@ ICMP_ULE
unsigned less or equal
@ FCMP_UNO
1 0 0 0 True if unordered: isnan(X) | isnan(Y)
Predicate getSwappedPredicate() const
For example, EQ->EQ, SLE->SGE, ULT->UGT, OEQ->OEQ, ULE->UGE, OLT->OGT, etc.
bool isTrueWhenEqual() const
This is just a convenience.
bool isFPPredicate() const
Predicate getInversePredicate() const
For example, EQ -> NE, UGT -> ULE, SLT -> SGE, OEQ -> UNE, UGT -> OLE, OLT -> UGE,...
Predicate getPredicate() const
Return the predicate for this instruction.
static bool isUnordered(Predicate predicate)
Determine if the predicate is an unordered operation.
bool isIntPredicate() const
An abstraction over a floating-point predicate, and a pack of an integer predicate with samesign info...
static Constant * getIntToPtr(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static Constant * getExtractElement(Constant *Vec, Constant *Idx, Type *OnlyIfReducedTy=nullptr)
static Constant * getBinOpAbsorber(unsigned Opcode, Type *Ty, bool AllowLHSConstant=false)
Return the absorbing element for the given binary operation, i.e.
static Constant * getNot(Constant *C)
static Constant * getInsertElement(Constant *Vec, Constant *Elt, Constant *Idx, Type *OnlyIfReducedTy=nullptr)
static Constant * getShuffleVector(Constant *V1, Constant *V2, ArrayRef< int > Mask, Type *OnlyIfReducedTy=nullptr)
static bool isSupportedGetElementPtr(const Type *SrcElemTy)
Whether creating a constant expression for this getelementptr type is supported.
static Constant * getGetElementPtr(Type *Ty, Constant *C, ArrayRef< Constant * > IdxList, GEPNoWrapFlags NW=GEPNoWrapFlags::none(), std::optional< ConstantRange > InRange=std::nullopt, Type *OnlyIfReducedTy=nullptr)
Getelementptr form.
static Constant * getBinOpIdentity(unsigned Opcode, Type *Ty, bool AllowRHSConstant=false, bool NSZ=false)
Return the identity constant for a binary opcode.
static Constant * getZero(Type *Ty, bool Negative=false)
static Constant * getNegativeZero(Type *Ty)
static Constant * getNaN(Type *Ty, bool Negative=false, uint64_t Payload=0)
This is the shared class of boolean and integer constants.
static ConstantInt * getTrue(LLVMContext &Context)
static ConstantInt * getSigned(IntegerType *Ty, int64_t V)
Return a ConstantInt with the specified value for the specified type.
static ConstantInt * getFalse(LLVMContext &Context)
uint64_t getZExtValue() const
Return the constant as a 64-bit unsigned integer value after it has been zero extended as appropriate...
static ConstantInt * getBool(LLVMContext &Context, bool V)
static ConstantPointerNull * get(PointerType *T)
Static factory methods - Return objects of the specified value.
This class represents a range of values.
const APInt * getSingleElement() const
If this set contains a single element, return it, otherwise return null.
bool isFullSet() const
Return true if this set contains all of the elements possible for this data-type.
bool isEmptySet() const
Return true if this set contains no members.
static ConstantRange makeExactICmpRegion(CmpInst::Predicate Pred, const APInt &Other)
Produce the exact range such that all values in the returned range satisfy the given predicate with a...
ConstantRange inverse() const
Return a new range that is the logical not of the current set.
bool contains(const APInt &Val) const
Return true if the specified value is in the set.
static Constant * get(StructType *T, ArrayRef< Constant * > V)
static Constant * getSplat(ElementCount EC, Constant *Elt)
Return a ConstantVector with the specified constant in each element.
static Constant * get(ArrayRef< Constant * > V)
This is an important base class in LLVM.
static Constant * getAllOnesValue(Type *Ty)
bool isAllOnesValue() const
Return true if this is the value that would be returned by getAllOnesValue.
static Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
bool isNaN() const
Return true if this is a floating-point NaN constant or a vector floating-point constant with all NaN...
Constant * getAggregateElement(unsigned Elt) const
For aggregates (struct/array/vector) return the constant that corresponds to the specified element if...
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.
unsigned getPointerSizeInBits(unsigned AS=0) const
Layout pointer size, in bits FIXME: The defaults need to be removed once all of the backends/clients ...
IntegerType * getIntPtrType(LLVMContext &C, unsigned AddressSpace=0) const
Returns an integer type with size at least as big as that of a pointer in the given address space.
unsigned getIndexTypeSizeInBits(Type *Ty) const
Layout size of the index used in GEP calculation.
IntegerType * getIndexType(LLVMContext &C, unsigned AddressSpace) const
Returns the type of a GEP index in AddressSpace.
TypeSize getTypeAllocSize(Type *Ty) const
Returns the offset in bytes between successive objects of the specified type, including alignment pad...
unsigned getIndexSizeInBits(unsigned AS) const
Size in bits of index used for address calculation in getelementptr.
TypeSize getTypeSizeInBits(Type *Ty) const
Size examples:
Legacy analysis pass which computes a DominatorTree.
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
bool dominates(const BasicBlock *BB, const Use &U) const
Return true if the (end of the) basic block BB dominates the use U.
This instruction compares its operands according to the predicate given to the constructor.
Convenience struct for specifying and reasoning about fast-math flags.
bool noSignedZeros() const
bool allowReassoc() const
Flag queries.
Represents calls to the gc.relocate intrinsic.
Value * getBasePtr() const
Value * getDerivedPtr() const
Represents flags for the getelementptr instruction/expression.
static Type * getIndexedType(Type *Ty, ArrayRef< Value * > IdxList)
Returns the result type of a getelementptr with the given source element type and indexes.
This instruction compares its operands according to the predicate given to the constructor.
static bool compare(const APInt &LHS, const APInt &RHS, ICmpInst::Predicate Pred)
Return result of LHS Pred RHS comparison.
Predicate getSignedPredicate() const
For example, EQ->EQ, SLE->SLE, UGT->SGT, etc.
bool isEquality() const
Return true if this predicate is either EQ or NE.
bool isRelational() const
Return true if the predicate is relational (not EQ or NE).
Predicate getUnsignedPredicate() const
For example, EQ->EQ, SLE->ULE, UGT->UGT, etc.
This instruction inserts a struct field of array element value into an aggregate value.
bool hasNoSignedZeros() const LLVM_READONLY
Determine whether the no-signed-zeros flag is set.
bool isAssociative() const LLVM_READONLY
Return true if the instruction is associative:
bool isCommutative() const LLVM_READONLY
Return true if the instruction is commutative:
const Function * getFunction() const
Return the function this instruction belongs to.
An instruction for reading from memory.
bool isVolatile() const
Return true if this is a load from a volatile memory location.
static APInt getSaturationPoint(Intrinsic::ID ID, unsigned numBits)
Min/max intrinsics are monotonic, they operate on a fixed-bitwidth values, so there is a certain thre...
ICmpInst::Predicate getPredicate() const
Returns the comparison predicate underlying the intrinsic.
op_range incoming_values()
BasicBlock * getIncomingBlock(unsigned i) const
Return incoming basic block number i.
Value * getIncomingValue(unsigned i) const
Return incoming value number x.
unsigned getNumIncomingValues() const
Return the number of incoming edges.
Pass interface - Implemented by all 'passes'.
static PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
This class represents a cast from a pointer to an integer.
This class represents a sign extension of integer types.
This class represents the LLVM 'select' instruction.
size_type size() const
Determine the number of elements in the SetVector.
bool insert(const value_type &X)
Insert a new element into the SetVector.
static void commuteShuffleMask(MutableArrayRef< int > Mask, unsigned InVecNumElts)
Change values in a shuffle permute mask assuming the two vector operands of length InVecNumElts have ...
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
bool contains(ConstPtrType Ptr) const
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
A SetVector that performs no allocations if smaller than a certain size.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void assign(size_type NumElts, ValueParamT Elt)
void reserve(size_type N)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
TargetLibraryInfo & getTLI(const Function &F)
Provides information about what library functions are available for the current target.
The instances of the Type class are immutable: once they are created, they are never changed.
bool isVectorTy() const
True if this is an instance of VectorType.
bool isIntOrIntVectorTy() const
Return true if this is an integer type or a vector of integer types.
bool isPointerTy() const
True if this is an instance of PointerType.
unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
bool isSized(SmallPtrSetImpl< Type * > *Visited=nullptr) const
Return true if it makes sense to take the size of this type.
bool isScalableTy(SmallPtrSetImpl< const Type * > &Visited) const
Return true if this is a type whose size is a known multiple of vscale.
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
bool isPtrOrPtrVectorTy() const
Return true if this is a pointer type or a vector of pointer types.
static IntegerType * getInt32Ty(LLVMContext &C)
TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
static UndefValue * get(Type *T)
Static factory methods - Return an 'undef' object of the specified type.
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.
const Value * stripAndAccumulateConstantOffsets(const DataLayout &DL, APInt &Offset, bool AllowNonInbounds, bool AllowInvariantGroup=false, function_ref< bool(Value &Value, APInt &Offset)> ExternalAnalysis=nullptr, bool LookThroughIntToPtr=false) const
Accumulate the constant offset this value has compared to a base pointer.
LLVMContext & getContext() const
All values hold a context through their type.
This class represents zero extension of integer types.
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
#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.
class_match< PoisonValue > m_Poison()
Match an arbitrary poison constant.
cst_pred_ty< is_lowbit_mask > m_LowBitMask()
Match an integer or vector with only the low bit(s) set.
BinaryOp_match< LHS, RHS, Instruction::And > m_And(const LHS &L, const RHS &R)
PtrAdd_match< PointerOpTy, OffsetOpTy > m_PtrAdd(const PointerOpTy &PointerOp, const OffsetOpTy &OffsetOp)
Matches GEP with i8 source element type.
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.
CmpClass_match< LHS, RHS, FCmpInst > m_FCmp(CmpPredicate &Pred, const LHS &L, const RHS &R)
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)
cstfp_pred_ty< is_inf > m_Inf()
Match a positive or negative infinity FP constant.
m_Intrinsic_Ty< Opnd0 >::Ty m_BitReverse(const Opnd0 &Op0)
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< cstfp_pred_ty< is_any_zero_fp >, RHS, Instruction::FSub > m_FNegNSZ(const RHS &X)
Match 'fneg X' as 'fsub +-0.0, X'.
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.
BinaryOp_match< LHS, RHS, Instruction::And, true > m_c_And(const LHS &L, const RHS &R)
Matches an And with LHS and RHS in either order.
CastInst_match< OpTy, TruncInst > m_Trunc(const OpTy &Op)
Matches Trunc.
BinaryOp_match< LHS, RHS, Instruction::Xor > m_Xor(const LHS &L, const RHS &R)
specific_intval< false > m_SpecificInt(const APInt &V)
Match a specific integer value or vector with all elements equal to the value.
bool match(Val *V, const Pattern &P)
BinOpPred_match< LHS, RHS, is_idiv_op > m_IDiv(const LHS &L, const RHS &R)
Matches integer division operations.
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.
BinOpPred_match< LHS, RHS, is_right_shift_op > m_Shr(const LHS &L, const RHS &R)
Matches logical shift operations.
CmpClass_match< LHS, RHS, ICmpInst, true > m_c_ICmp(CmpPredicate &Pred, const LHS &L, const RHS &R)
Matches an ICmp with a predicate over LHS and RHS in either order.
TwoOps_match< Val_t, Idx_t, Instruction::ExtractElement > m_ExtractElt(const Val_t &Val, const Idx_t &Idx)
Matches ExtractElementInst.
class_match< ConstantInt > m_ConstantInt()
Match an arbitrary ConstantInt and ignore it.
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.
cstfp_pred_ty< is_neg_zero_fp > m_NegZeroFP()
Match a floating-point negative zero.
specific_fpval m_SpecificFP(double V)
Match a specific floating point value or vector with all elements equal to the value.
match_combine_and< LTy, RTy > m_CombineAnd(const LTy &L, const RTy &R)
Combine two pattern matchers matching L && R.
MaxMin_match< ICmpInst, LHS, RHS, smin_pred_ty > m_SMin(const LHS &L, const RHS &R)
m_Intrinsic_Ty< Opnd0 >::Ty m_Sqrt(const Opnd0 &Op0)
BinaryOp_match< LHS, RHS, Instruction::Xor, true > m_c_Xor(const LHS &L, const RHS &R)
Matches an Xor with LHS and RHS in either order.
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()...
cst_pred_ty< is_zero_int > m_ZeroInt()
Match an integer 0 or a vector with all elements equal to 0.
apint_match m_APIntAllowPoison(const APInt *&Res)
Match APInt while allowing poison in splat vector constants.
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)
MaxMin_match< ICmpInst, LHS, RHS, umax_pred_ty > m_UMax(const LHS &L, const RHS &R)
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.
specific_fpval m_FPOne()
Match a float 1.0 or vector with all elements equal to 1.0.
BinaryOp_match< LHS, RHS, Instruction::Add, true > m_c_Add(const LHS &L, const RHS &R)
Matches a Add with LHS and RHS in either order.
apfloat_match m_APFloatAllowPoison(const APFloat *&Res)
Match APFloat while allowing poison in splat vector constants.
CastInst_match< OpTy, UIToFPInst > m_UIToFP(const OpTy &Op)
m_Intrinsic_Ty< Opnd0, Opnd1, Opnd2 >::Ty m_FShl(const Opnd0 &Op0, const Opnd1 &Op1, const Opnd2 &Op2)
match_combine_or< match_combine_or< MaxMin_match< ICmpInst, LHS, RHS, smax_pred_ty, true >, MaxMin_match< ICmpInst, LHS, RHS, smin_pred_ty, true > >, match_combine_or< MaxMin_match< ICmpInst, LHS, RHS, umax_pred_ty, true >, MaxMin_match< ICmpInst, LHS, RHS, umin_pred_ty, true > > > m_c_MaxOrMin(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::SDiv > m_SDiv(const LHS &L, const RHS &R)
OverflowingBinaryOp_match< LHS, RHS, Instruction::Sub, OverflowingBinaryOperator::NoUnsignedWrap > m_NUWSub(const LHS &L, const RHS &R)
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.
OverflowingBinaryOp_match< LHS, RHS, Instruction::Add, OverflowingBinaryOperator::NoSignedWrap > m_NSWAdd(const LHS &L, const RHS &R)
CastInst_match< OpTy, SIToFPInst > m_SIToFP(const OpTy &Op)
BinaryOp_match< LHS, RHS, Instruction::LShr > m_LShr(const LHS &L, const RHS &R)
CmpClass_match< LHS, RHS, ICmpInst > m_ICmp(CmpPredicate &Pred, 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::FAdd, true > m_c_FAdd(const LHS &L, const RHS &R)
Matches FAdd with LHS and RHS in either order.
LogicalOp_match< LHS, RHS, Instruction::And, true > m_c_LogicalAnd(const LHS &L, const RHS &R)
Matches L && R with LHS and RHS in either order.
BinaryOp_match< LHS, RHS, Instruction::Shl > m_Shl(const LHS &L, const RHS &R)
m_Intrinsic_Ty< Opnd0 >::Ty m_VecReverse(const Opnd0 &Op0)
apfloat_match m_APFloat(const APFloat *&Res)
Match a ConstantFP or splatted ConstantVector, binding the specified pointer to the contained APFloat...
match_combine_or< match_combine_or< MaxMin_match< ICmpInst, LHS, RHS, smax_pred_ty >, MaxMin_match< ICmpInst, LHS, RHS, smin_pred_ty > >, match_combine_or< MaxMin_match< ICmpInst, LHS, RHS, umax_pred_ty >, MaxMin_match< ICmpInst, LHS, RHS, umin_pred_ty > > > m_MaxOrMin(const LHS &L, const RHS &R)
m_Intrinsic_Ty< Opnd0, Opnd1, Opnd2 >::Ty m_FShr(const Opnd0 &Op0, const Opnd1 &Op1, const Opnd2 &Op2)
BinaryOp_match< LHS, RHS, Instruction::SRem > m_SRem(const LHS &L, const RHS &R)
auto m_Undef()
Match an arbitrary undef constant.
cstfp_pred_ty< is_nan > m_NaN()
Match an arbitrary NaN constant.
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)
m_Intrinsic_Ty< Opnd0 >::Ty m_BSwap(const Opnd0 &Op0)
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.
BinaryOp_match< LHS, RHS, Instruction::Or, true > m_c_Or(const LHS &L, const RHS &R)
Matches an Or with LHS and RHS in either order.
LogicalOp_match< LHS, RHS, Instruction::Or, true > m_c_LogicalOr(const LHS &L, const RHS &R)
Matches L || R with LHS and RHS in either order.
ThreeOps_match< Val_t, Elt_t, Idx_t, Instruction::InsertElement > m_InsertElt(const Val_t &Val, const Elt_t &Elt, const Idx_t &Idx)
Matches InsertElementInst.
ElementWiseBitCast_match< OpTy > m_ElementWiseBitCast(const OpTy &Op)
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.
CastOperator_match< OpTy, Instruction::PtrToInt > m_PtrToInt(const OpTy &Op)
Matches PtrToInt.
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)
MaxMin_match< ICmpInst, LHS, RHS, umin_pred_ty > m_UMin(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.
ExceptionBehavior
Exception behavior used for floating point operations.
@ ebStrict
This corresponds to "fpexcept.strict".
@ ebIgnore
This corresponds to "fpexcept.ignore".
This is an optimization pass for GlobalISel generic memory operations.
Intrinsic::ID getInverseMinMaxIntrinsic(Intrinsic::ID MinMaxID)
Value * simplifyAShrInst(Value *Op0, Value *Op1, bool IsExact, const SimplifyQuery &Q)
Given operands for a AShr, fold the result or return nulll.
unsigned Log2_32_Ceil(uint32_t Value)
Return the ceil log base 2 of the specified value, 32 if the value is zero.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
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 * simplifyGEPInst(Type *SrcTy, Value *Ptr, ArrayRef< Value * > Indices, GEPNoWrapFlags NW, const SimplifyQuery &Q)
Given operands for a GetElementPtrInst, fold the result or return null.
bool isValidAssumeForContext(const Instruction *I, const Instruction *CxtI, const DominatorTree *DT=nullptr, bool AllowEphemerals=false)
Return true if it is valid to use the assumptions provided by an assume intrinsic,...
bool canCreatePoison(const Operator *Op, bool ConsiderFlagsAndMetadata=true)
Constant * ConstantFoldSelectInstruction(Constant *Cond, Constant *V1, Constant *V2)
Attempt to constant fold a select instruction with the specified operands.
Value * simplifyFreezeInst(Value *Op, const SimplifyQuery &Q)
Given an operand for a Freeze, see if we can fold the result.
Constant * ConstantFoldFPInstOperands(unsigned Opcode, Constant *LHS, Constant *RHS, const DataLayout &DL, const Instruction *I, bool AllowNonDeterministic=true)
Attempt to constant fold a floating point binary operation with the specified operands,...
bool isSignBitCheck(ICmpInst::Predicate Pred, const APInt &RHS, bool &TrueIfSigned)
Given an exploded icmp instruction, return true if the comparison only checks the sign bit.
bool canConstantFoldCallTo(const CallBase *Call, const Function *F)
canConstantFoldCallTo - Return true if its even possible to fold a call to the specified function.
APInt getMinMaxLimit(SelectPatternFlavor SPF, unsigned BitWidth)
Return the minimum or maximum constant value for the specified integer min/max flavor and type.
Value * simplifySDivInst(Value *LHS, Value *RHS, bool IsExact, const SimplifyQuery &Q)
Given operands for an SDiv, fold the result or return null.
Value * simplifyUnOp(unsigned Opcode, Value *Op, const SimplifyQuery &Q)
Given operand for a UnaryOperator, fold the result or return null.
bool isDefaultFPEnvironment(fp::ExceptionBehavior EB, RoundingMode RM)
Returns true if the exception handling behavior and rounding mode match what is used in the default f...
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 IsConstantOffsetFromGlobal(Constant *C, GlobalValue *&GV, APInt &Offset, const DataLayout &DL, DSOLocalEquivalent **DSOEquiv=nullptr)
If this constant is a constant offset from a global, return the global and the constant.
Value * simplifyInstructionWithOperands(Instruction *I, ArrayRef< Value * > NewOps, const SimplifyQuery &Q)
Like simplifyInstruction but the operands of I are replaced with NewOps.
const Value * getUnderlyingObject(const Value *V, unsigned MaxLookup=6)
This method strips off any GEP address adjustments, pointer casts or llvm.threadlocal....
Value * simplifyCall(CallBase *Call, Value *Callee, ArrayRef< Value * > Args, const SimplifyQuery &Q)
Given a callsite, callee, and arguments, fold the result or return null.
Constant * ConstantFoldCompareInstOperands(unsigned Predicate, Constant *LHS, Constant *RHS, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, const Instruction *I=nullptr)
Attempt to constant fold a compare instruction (icmp/fcmp) with the specified operands.
bool isKnownToBeAPowerOfTwo(const Value *V, const DataLayout &DL, bool OrZero=false, unsigned Depth=0, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true)
Return true if the given value is known to have exactly one bit set when defined.
bool canRoundingModeBe(RoundingMode RM, RoundingMode QRM)
Returns true if the rounding mode RM may be QRM at compile time or at run time.
bool isNoAliasCall(const Value *V)
Return true if this pointer is returned by a noalias function.
Value * simplifyFCmpInst(CmpPredicate Predicate, Value *LHS, Value *RHS, FastMathFlags FMF, const SimplifyQuery &Q)
Given operands for an FCmpInst, fold the result or return null.
Value * getSplatValue(const Value *V)
Get splat value if the input is a splat vector or return nullptr.
Constant * ConstantFoldGetElementPtr(Type *Ty, Constant *C, std::optional< ConstantRange > InRange, ArrayRef< Value * > Idxs)
CmpInst::Predicate getMinMaxPred(SelectPatternFlavor SPF, bool Ordered=false)
Return the canonical comparison predicate for the specified minimum/maximum flavor.
Value * simplifyShuffleVectorInst(Value *Op0, Value *Op1, ArrayRef< int > Mask, Type *RetTy, const SimplifyQuery &Q)
Given operands for a ShuffleVectorInst, fold the result or return null.
Constant * ConstantFoldCall(const CallBase *Call, Function *F, ArrayRef< Constant * > Operands, const TargetLibraryInfo *TLI=nullptr, bool AllowNonDeterministic=true)
ConstantFoldCall - Attempt to constant fold a call to the specified function with the specified argum...
Value * simplifyOrInst(Value *LHS, Value *RHS, const SimplifyQuery &Q)
Given operands for an Or, fold the result or return null.
Value * simplifyXorInst(Value *LHS, Value *RHS, const SimplifyQuery &Q)
Given operands for an Xor, fold the result or return null.
ConstantRange getConstantRangeFromMetadata(const MDNode &RangeMD)
Parse out a conservative ConstantRange from !range metadata.
std::optional< DecomposedBitTest > decomposeBitTest(Value *Cond, bool LookThroughTrunc=true, bool AllowNonZeroC=false)
Decompose an icmp into the form ((X & Mask) pred C) if possible.
ConstantRange computeConstantRange(const Value *V, bool ForSigned, bool UseInstrInfo=true, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, unsigned Depth=0)
Determine the possible constant range of an integer or vector of integer value.
Constant * ConstantFoldExtractValueInstruction(Constant *Agg, ArrayRef< unsigned > Idxs)
Attempt to constant fold an extractvalue instruction with the specified operands and indices.
bool isAllocLikeFn(const Value *V, const TargetLibraryInfo *TLI)
Tests if a value is a call or invoke to a library function that allocates memory (either malloc,...
bool MaskedValueIsZero(const Value *V, const APInt &Mask, const SimplifyQuery &SQ, unsigned Depth=0)
Return true if 'V & Mask' is known to be zero.
Value * simplifyCastInst(unsigned CastOpc, Value *Op, Type *Ty, const SimplifyQuery &Q)
Given operands for a CastInst, fold the result or return null.
Value * simplifyInstruction(Instruction *I, const SimplifyQuery &Q)
See if we can compute a simplified version of this instruction.
unsigned M1(unsigned Val)
Value * simplifySubInst(Value *LHS, Value *RHS, bool IsNSW, bool IsNUW, const SimplifyQuery &Q)
Given operands for a Sub, fold the result or return null.
Value * simplifyAddInst(Value *LHS, Value *RHS, bool IsNSW, bool IsNUW, const SimplifyQuery &Q)
Given operands for an Add, fold the result or return null.
Constant * ConstantFoldConstant(const Constant *C, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr)
ConstantFoldConstant - Fold the constant using the specified DataLayout.
OutputIt transform(R &&Range, OutputIt d_first, UnaryFunction F)
Wrapper function around std::transform to apply a function to a range and store the result elsewhere.
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
bool getObjectSize(const Value *Ptr, uint64_t &Size, const DataLayout &DL, const TargetLibraryInfo *TLI, ObjectSizeOpts Opts={})
Compute the size of the object pointed by Ptr.
bool isSplatValue(const Value *V, int Index=-1, unsigned Depth=0)
Return true if each element of the vector value V is poisoned or equal to every other non-poisoned el...
Constant * ConstantFoldLoadFromUniformValue(Constant *C, Type *Ty, const DataLayout &DL)
If C is a uniform value where all bits are the same (either all zero, all ones, all undef or all pois...
SelectPatternFlavor getInverseMinMaxFlavor(SelectPatternFlavor SPF)
Return the inverse minimum/maximum flavor of the specified flavor.
bool replaceAndRecursivelySimplify(Instruction *I, Value *SimpleV, const TargetLibraryInfo *TLI=nullptr, const DominatorTree *DT=nullptr, AssumptionCache *AC=nullptr, SmallSetVector< Instruction *, 8 > *UnsimplifiedUsers=nullptr)
Replace all uses of 'I' with 'SimpleV' and simplify the uses recursively.
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.
Value * simplifyShlInst(Value *Op0, Value *Op1, bool IsNSW, bool IsNUW, const SimplifyQuery &Q)
Given operands for a Shl, fold the result or return null.
Value * simplifyFNegInst(Value *Op, FastMathFlags FMF, const SimplifyQuery &Q)
Given operand for an FNeg, fold the result or return null.
Value * simplifyFSubInst(Value *LHS, Value *RHS, FastMathFlags FMF, const SimplifyQuery &Q, fp::ExceptionBehavior ExBehavior=fp::ebIgnore, RoundingMode Rounding=RoundingMode::NearestTiesToEven)
Given operands for an FSub, fold the result or return null.
bool canReplacePointersIfEqual(const Value *From, const Value *To, const DataLayout &DL)
Returns true if a pointer value From can be replaced with another pointer value \To if they are deeme...
bool impliesPoison(const Value *ValAssumedPoison, const Value *V)
Return true if V is poison given that ValAssumedPoison is already poison.
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 * simplifyFAddInst(Value *LHS, Value *RHS, FastMathFlags FMF, const SimplifyQuery &Q, fp::ExceptionBehavior ExBehavior=fp::ebIgnore, RoundingMode Rounding=RoundingMode::NearestTiesToEven)
Given operands for an FAdd, fold the result or return null.
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
bool PointerMayBeCaptured(const Value *V, bool ReturnCaptures, bool StoreCaptures, unsigned MaxUsesToExplore=0)
PointerMayBeCaptured - Return true if this pointer value may be captured by the enclosing function (w...
Value * simplifyLShrInst(Value *Op0, Value *Op1, bool IsExact, const SimplifyQuery &Q)
Given operands for a LShr, fold the result or return null.
bool NullPointerIsDefined(const Function *F, unsigned AS=0)
Check whether null pointer dereferencing is considered undefined behavior for a given function or an ...
Value * simplifyICmpInst(CmpPredicate Pred, Value *LHS, Value *RHS, const SimplifyQuery &Q)
Given operands for an ICmpInst, fold the result or return null.
ConstantRange getVScaleRange(const Function *F, unsigned BitWidth)
Determine the possible constant range of vscale with the given bit width, based on the vscale_range f...
Constant * ConstantFoldInstOperands(Instruction *I, ArrayRef< Constant * > Ops, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, bool AllowNonDeterministic=true)
ConstantFoldInstOperands - Attempt to constant fold an instruction with the specified operands.
Constant * ConstantFoldCastOperand(unsigned Opcode, Constant *C, Type *DestTy, const DataLayout &DL)
Attempt to constant fold a cast with the specified operand.
Value * simplifyAndInst(Value *LHS, Value *RHS, const SimplifyQuery &Q)
Given operands for an And, fold the result or return null.
Value * simplifyExtractValueInst(Value *Agg, ArrayRef< unsigned > Idxs, const SimplifyQuery &Q)
Given operands for an ExtractValueInst, fold the result or return null.
bool isNotCrossLaneOperation(const Instruction *I)
Return true if the instruction doesn't potentially cross vector lanes.
Value * simplifyInsertValueInst(Value *Agg, Value *Val, ArrayRef< unsigned > Idxs, const SimplifyQuery &Q)
Given operands for an InsertValueInst, 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.
bool isKnownNonZero(const Value *V, const SimplifyQuery &Q, unsigned Depth=0)
Return true if the given value is known to be non-zero when defined.
constexpr int PoisonMaskElem
Value * simplifyLoadInst(LoadInst *LI, Value *PtrOp, const SimplifyQuery &Q)
Given a load instruction and its pointer operand, fold the result or return null.
Value * simplifyFMAFMul(Value *LHS, Value *RHS, FastMathFlags FMF, const SimplifyQuery &Q, fp::ExceptionBehavior ExBehavior=fp::ebIgnore, RoundingMode Rounding=RoundingMode::NearestTiesToEven)
Given operands for the multiplication of a FMA, fold the result or return null.
Value * simplifyConstrainedFPCall(CallBase *Call, const SimplifyQuery &Q)
Given a constrained FP intrinsic call, tries to compute its simplified version.
Value * simplifyBinOp(unsigned Opcode, Value *LHS, Value *RHS, const SimplifyQuery &Q)
Given operands for a BinaryOperator, fold the result or return null.
@ Or
Bitwise or logical OR of integers.
Value * findScalarElement(Value *V, unsigned EltNo)
Given a vector and an element number, see if the scalar value is already around as a register,...
void computeKnownBits(const Value *V, KnownBits &Known, const DataLayout &DL, unsigned Depth=0, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true)
Determine which bits of V are known to be either zero or one and return them in the KnownZero/KnownOn...
bool isKnownNonEqual(const Value *V1, const Value *V2, const SimplifyQuery &SQ, unsigned Depth=0)
Return true if the given values are known to be non-equal when defined.
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
Value * simplifyBinaryIntrinsic(Intrinsic::ID IID, Type *ReturnType, Value *Op0, Value *Op1, const SimplifyQuery &Q, const CallBase *Call)
Given operands for a BinaryIntrinsic, fold the result or return null.
RoundingMode
Rounding mode.
bool isGuaranteedNotToBeUndefOrPoison(const Value *V, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, unsigned Depth=0)
Return true if this function can prove that V does not have undef bits and is never poison.
unsigned M0(unsigned Val)
Value * simplifyInsertElementInst(Value *Vec, Value *Elt, Value *Idx, const SimplifyQuery &Q)
Given operands for an InsertElement, fold the result or return null.
constexpr unsigned BitWidth
SelectPatternResult matchDecomposedSelectPattern(CmpInst *CmpI, Value *TrueVal, Value *FalseVal, Value *&LHS, Value *&RHS, Instruction::CastOps *CastOp=nullptr, unsigned Depth=0)
Determine the pattern that a select with the given compare as its predicate and given values as its t...
Value * simplifyWithOpReplaced(Value *V, Value *Op, Value *RepOp, const SimplifyQuery &Q, bool AllowRefinement, SmallVectorImpl< Instruction * > *DropFlags=nullptr)
See if V simplifies when its operand Op is replaced with RepOp.
bool maskIsAllZeroOrUndef(Value *Mask)
Given a mask vector of i1, Return true if all of the elements of this predicate mask are known to be ...
std::pair< Value *, FPClassTest > fcmpToClassTest(CmpInst::Predicate Pred, const Function &F, Value *LHS, Value *RHS, bool LookThroughSrc=true)
Returns a pair of values, which if passed to llvm.is.fpclass, returns the same result as an fcmp with...
Value * simplifySRemInst(Value *LHS, Value *RHS, const SimplifyQuery &Q)
Given operands for an SRem, fold the result or return null.
void getUnderlyingObjects(const Value *V, SmallVectorImpl< const Value * > &Objects, const LoopInfo *LI=nullptr, unsigned MaxLookup=6)
This method is similar to getUnderlyingObject except that it can look through phi and select instruct...
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
std::optional< bool > computeKnownFPSignBit(const Value *V, unsigned Depth, const SimplifyQuery &SQ)
Return false if we can prove that the specified FP value's sign bit is 0.
unsigned ComputeNumSignBits(const Value *Op, const DataLayout &DL, unsigned Depth=0, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true)
Return the number of times the sign bit of the register is replicated into the other bits.
bool cannotBeNegativeZero(const Value *V, unsigned Depth, const SimplifyQuery &SQ)
Return true if we can prove that the specified FP value is never equal to -0.0.
bool all_equal(std::initializer_list< T > Values)
Returns true if all Values in the initializer lists are equal or the list.
Constant * ConstantFoldInsertValueInstruction(Constant *Agg, Constant *Val, ArrayRef< unsigned > Idxs)
ConstantFoldInsertValueInstruction - Attempt to constant fold an insertvalue instruction with the spe...
Constant * ConstantFoldLoadFromConstPtr(Constant *C, Type *Ty, APInt Offset, const DataLayout &DL)
Return the value that a load from C with offset Offset would produce if it is constant and determinab...
std::optional< bool > isImpliedByDomCondition(const Value *Cond, const Instruction *ContextI, const DataLayout &DL)
Return the boolean condition value in the context of the given instruction if it is known based on do...
Value * simplifyCmpInst(CmpPredicate Predicate, Value *LHS, Value *RHS, const SimplifyQuery &Q)
Given operands for a CmpInst, fold the result or return null.
bool isGuaranteedNotToBePoison(const Value *V, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, unsigned Depth=0)
Returns true if V cannot be poison, but may be undef.
KnownFPClass computeKnownFPClass(const Value *V, const APInt &DemandedElts, FPClassTest InterestedClasses, unsigned Depth, const SimplifyQuery &SQ)
Determine which floating-point classes are valid for V, and return them in KnownFPClass bit sets.
bool isKnownNegation(const Value *X, const Value *Y, bool NeedNSW=false, bool AllowPoison=true)
Return true if the two given values are negation.
Constant * ConstantFoldIntegerCast(Constant *C, Type *DestTy, bool IsSigned, const DataLayout &DL)
Constant fold a zext, sext or trunc, depending on IsSigned and whether the DestTy is wider or narrowe...
const SimplifyQuery getBestSimplifyQuery(Pass &, Function &)
bool isCheckForZeroAndMulWithOverflow(Value *Op0, Value *Op1, bool IsAnd, Use *&Y)
Match one of the patterns up to the select/logic op: Op0 = icmp ne i4 X, 0 Agg = call { i4,...
bool canIgnoreSNaN(fp::ExceptionBehavior EB, FastMathFlags FMF)
Returns true if the possibility of a signaling NaN can be safely ignored.
Value * simplifyURemInst(Value *LHS, Value *RHS, const SimplifyQuery &Q)
Given operands for a URem, fold the result or return null.
Value * simplifyExtractElementInst(Value *Vec, Value *Idx, const SimplifyQuery &Q)
Given operands for an ExtractElementInst, fold the result or return null.
Value * simplifySelectInst(Value *Cond, Value *TrueVal, Value *FalseVal, const SimplifyQuery &Q)
Given operands for a SelectInst, fold the result or return null.
std::optional< bool > isImpliedCondition(const Value *LHS, const Value *RHS, const DataLayout &DL, bool LHSIsTrue=true, unsigned Depth=0)
Return true if RHS is known to be implied true by LHS.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
This callback is used in conjunction with PointerMayBeCaptured.
virtual void tooManyUses()=0
tooManyUses - The depth of traversal has breached a limit.
virtual bool captured(const Use *U)=0
captured - Information about the pointer was captured by the user of use U.
Incoming for lane maks phi as machine instruction, incoming register Reg and incoming block Block are...
InstrInfoQuery provides an interface to query additional information for instructions like metadata o...
bool isExact(const BinaryOperator *Op) const
MDNode * getMetadata(const Instruction *I, unsigned KindID) const
bool hasNoSignedWrap(const InstT *Op) const
bool hasNoUnsignedWrap(const InstT *Op) const
bool isNonNegative() const
Returns true if this value is known to be non-negative.
bool isZero() const
Returns true if value is all zero.
unsigned countMinTrailingZeros() const
Returns the minimum number of trailing zero bits.
unsigned countMaxTrailingZeros() const
Returns the maximum number of trailing zero bits possible.
bool hasConflict() const
Returns true if there is conflicting information.
unsigned getBitWidth() const
Get the bit width of this value.
unsigned countMaxActiveBits() const
Returns the maximum number of bits needed to represent all possible unsigned values with these known ...
unsigned countMinLeadingZeros() const
Returns the minimum number of leading zero bits.
APInt getMaxValue() const
Return the maximal unsigned value possible given these KnownBits.
APInt getMinValue() const
Return the minimal unsigned value possible given these KnownBits.
bool isNegative() const
Returns true if this value is known to be negative.
static KnownBits shl(const KnownBits &LHS, const KnownBits &RHS, bool NUW=false, bool NSW=false, bool ShAmtNonZero=false)
Compute known bits for shl(LHS, RHS).
bool isKnownAlwaysNaN() const
Return true if it's known this must always be a nan.
static constexpr FPClassTest OrderedLessThanZeroMask
std::optional< bool > SignBit
std::nullopt if the sign bit is unknown, true if the sign bit is definitely set or false if the sign ...
bool isKnownNeverNaN() const
Return true if it's known this can never be a nan.
bool isKnownNever(FPClassTest Mask) const
Return true if it's known this can never be one of the mask entries.
bool cannotBeOrderedLessThanZero() const
Return true if we can prove that the analyzed floating-point value is either NaN or never less than -...
The adaptor from a function pass to a loop pass computes these analyses and makes them available to t...
Various options to control the behavior of getObjectSize.
bool NullIsUnknownSize
If this is true, null pointers in address space 0 will be treated as though they can't be evaluated.
Mode EvalMode
How we want to evaluate this object's size.
SelectPatternFlavor Flavor
static bool isMinOrMax(SelectPatternFlavor SPF)
When implementing this min/max pattern as fcmp; select, does the fcmp have to be ordered?
bool CanUseUndef
Controls whether simplifications are allowed to constrain the range of possible values for uses of un...
SimplifyQuery getWithInstruction(const Instruction *I) const
bool isUndefValue(Value *V) const
If CanUseUndef is true, returns whether V is undef.
const TargetLibraryInfo * TLI
SimplifyQuery getWithoutUndef() const