54#define DEBUG_TYPE "instsimplify" 
  102  Value *CLHS = Cmp->getOperand(0), *CRHS = Cmp->getOperand(1);
 
  103  if (CPred == Pred && CLHS == 
LHS && CRHS == 
RHS)
 
 
  116                                 unsigned MaxRecurse, 
Constant *TrueOrFalse) {
 
  118  if (SimplifiedCmp == 
Cond) {
 
  126  return SimplifiedCmp;
 
 
  132                                     unsigned MaxRecurse) {
 
 
  140                                      unsigned MaxRecurse) {
 
 
  150                                               unsigned MaxRecurse) {
 
 
  201  if (!
B || 
B->getOpcode() != OpcodeToExpand)
 
  203  Value *B0 = 
B->getOperand(0), *B1 = 
B->getOperand(1);
 
  214  if ((L == B0 && R == B1) ||
 
 
  235                                     unsigned MaxRecurse) {
 
 
  252                                       unsigned MaxRecurse) {
 
 
  355                                    unsigned MaxRecurse) {
 
  392  if (TV == 
SI->getTrueValue() && FV == 
SI->getFalseValue())
 
  398  if ((FV && !TV) || (TV && !FV)) {
 
  402    if (Simplified && Simplified->getOpcode() == 
unsigned(Opcode) &&
 
  403        !Simplified->hasPoisonGeneratingFlags()) {
 
  407      Value *UnsimplifiedBranch = FV ? 
SI->getTrueValue() : 
SI->getFalseValue();
 
  408      Value *UnsimplifiedLHS = 
SI == 
LHS ? UnsimplifiedBranch : 
LHS;
 
  409      Value *UnsimplifiedRHS = 
SI == 
LHS ? 
RHS : UnsimplifiedBranch;
 
  410      if (Simplified->getOperand(0) == UnsimplifiedLHS &&
 
  411          Simplified->getOperand(1) == UnsimplifiedRHS)
 
  413      if (Simplified->isCommutative() &&
 
  414          Simplified->getOperand(1) == UnsimplifiedLHS &&
 
  415          Simplified->getOperand(0) == UnsimplifiedRHS)
 
 
  446  Value *TV = 
SI->getTrueValue();
 
  447  Value *FV = 
SI->getFalseValue();
 
  467  if (
Cond->getType()->isVectorTy() == 
RHS->getType()->isVectorTy())
 
 
  479                                 unsigned MaxRecurse) {
 
  499  Value *CommonValue = 
nullptr;
 
  512    if (!V || (CommonValue && V != CommonValue))
 
 
  543  Value *CommonValue = 
nullptr;
 
  557    if (!V || (CommonValue && V != CommonValue))
 
 
  573      case Instruction::FAdd:
 
  574      case Instruction::FSub:
 
  575      case Instruction::FMul:
 
  576      case Instruction::FDiv:
 
  577      case Instruction::FRem:
 
  578        if (Q.
CxtI != 
nullptr)
 
 
  662  return ::simplifyAddInst(Op0, Op1, IsNSW, IsNUW, Query, 
RecursionLimit);
 
 
  675  assert(V->getType()->isPtrOrPtrVectorTy());
 
  678  V = V->stripAndAccumulateConstantOffsets(
DL, 
Offset,
 
  682  return Offset.sextOrTrunc(
DL.getIndexTypeSizeInBits(V->getType()));
 
 
  701  Constant *Res = ConstantInt::get(
LHS->getContext(), LHSOffset - RHSOffset);
 
 
  717  std::optional<bool> Imp =
 
  722    case Instruction::Sub:
 
  723    case Instruction::Xor:
 
  724    case Instruction::URem:
 
  725    case Instruction::SRem:
 
  728    case Instruction::SDiv:
 
  729    case Instruction::UDiv:
 
  730      return ConstantInt::get(Ty, 1);
 
  732    case Instruction::And:
 
  733    case Instruction::Or:
 
 
  788  Value *
X = 
nullptr, *
Y = 
nullptr, *Z = Op1;
 
  846    if (
X->getType() == 
Y->getType())
 
 
  893  return ::simplifySubInst(Op0, Op1, IsNSW, IsNUW, Q, 
RecursionLimit);
 
 
  943                                        Instruction::Add, Q, MaxRecurse))
 
 
  965  return ::simplifyMulInst(Op0, Op1, IsNSW, IsNUW, Q, 
RecursionLimit);
 
 
  975  return (
C && 
C->isAllOnesValue());
 
 
  981                      unsigned MaxRecurse, 
bool IsSigned) {
 
  998    Type *Ty = 
X->getType();
 
 1004      Constant *PosDividendC = ConstantInt::get(Ty, 
C->abs());
 
 1005      Constant *NegDividendC = ConstantInt::get(Ty, -
C->abs());
 
 1014      if (
C->isMinSignedValue())
 
 1020      Constant *PosDivisorC = ConstantInt::get(Ty, 
C->abs());
 
 1021      Constant *NegDivisorC = ConstantInt::get(Ty, -
C->abs());
 
 
 1047                             unsigned MaxRecurse) {
 
 1048  bool IsDiv = (Opcode == Instruction::SDiv || Opcode == Instruction::UDiv);
 
 1049  bool IsSigned = (Opcode == Instruction::SDiv || Opcode == Instruction::SRem);
 
 1117  if (
isDivZero(Op0, Op1, Q, MaxRecurse, IsSigned))
 
 
 1141                          unsigned MaxRecurse) {
 
 1164        (Opcode == Instruction::UDiv
 
 
 1184    if ((Opcode == Instruction::SRem &&
 
 1186        (Opcode == Instruction::URem &&
 
 1194      if (Opcode == Instruction::SRem
 
 1197                                 return C.srem(*C0).isZero();
 
 1201                                 return C.urem(*C0).isZero();
 
 
 1217  return simplifyDiv(Instruction::SDiv, Op0, Op1, IsExact, Q, MaxRecurse);
 
 
 1229  return simplifyDiv(Instruction::UDiv, Op0, Op1, IsExact, Q, MaxRecurse);
 
 
 1240                               unsigned MaxRecurse) {
 
 1251  return simplifyRem(Instruction::SRem, Op0, Op1, Q, MaxRecurse);
 
 
 1261                               unsigned MaxRecurse) {
 
 1262  return simplifyRem(Instruction::URem, Op0, Op1, Q, MaxRecurse);
 
 
 1281  const APInt *AmountC;
 
 1288    for (
unsigned I = 0,
 
 
 1303                            unsigned MaxRecurse) {
 
 1353    assert(Opcode == Instruction::Shl && 
"Expected shl for nsw instruction");
 
 
 1372                                 Value *Op1, 
bool IsExact,
 
 1391    if (Op0Known.
One[0])
 
 
 1403          simplifyShift(Instruction::Shl, Op0, Op1, IsNSW, Q, MaxRecurse))
 
 1427  if (IsNSW && IsNUW &&
 
 
 1436  return ::simplifyShlInst(Op0, Op1, IsNSW, IsNUW, Q, 
RecursionLimit);
 
 
 1458  const APInt *ShRAmt, *ShLAmt;
 
 1461      *ShRAmt == *ShLAmt) {
 
 1464    if (ShRAmt->
uge(EffWidthY))
 
 
 1512                                         ICmpInst *UnsignedICmp, 
bool IsAnd,
 
 1526    if (
match(UnsignedICmp,
 
 1544        return IsAnd ? UnsignedICmp : ZeroICmp;
 
 1550        return IsAnd ? ZeroICmp : UnsignedICmp;
 
 1556    if (
match(UnsignedICmp,
 
 1560        return UnsignedICmp;
 
 1563        return UnsignedICmp;
 
 1570  else if (
match(UnsignedICmp,
 
 1581    return IsAnd ? ZeroICmp : UnsignedICmp;
 
 1587    return IsAnd ? UnsignedICmp : ZeroICmp;
 
 1597    return IsAnd ? UnsignedICmp : ZeroICmp;
 
 1602    return IsAnd ? ZeroICmp : UnsignedICmp;
 
 
 1626  const APInt *C0, *C1;
 
 1636  if (IsAnd && Range0.intersectWith(Range1).isEmptySet())
 
 1641  if (!IsAnd && Range0.unionWith(Range1).isFullSet())
 
 1649  if (Range0.contains(Range1))
 
 1650    return IsAnd ? Cmp1 : Cmp0;
 
 1651  if (Range1.contains(Range0))
 
 1652    return IsAnd ? Cmp0 : Cmp1;
 
 
 1661  const APInt *C0, *C1;
 
 1670  if (AddInst->getOperand(1) != Op1->
getOperand(1))
 
 1677  const APInt Delta = *C1 - *C0;
 
 
 1752  const APInt *C0, *C1;
 
 1761  if (AddInst->getOperand(1) != Op1->
getOperand(1))
 
 1768  const APInt Delta = *C1 - *C0;
 
 
 1837  if (!Range0 || !Range1)
 
 1842  if (Range0->intersectWith(*Range1).isEmptySet())
 
 1850  if (Range0->contains(*Range1))
 
 1852  if (Range1->contains(*Range0))
 
 
 1860  Value *LHS0 = 
LHS->getOperand(0), *LHS1 = 
LHS->getOperand(1);
 
 1861  Value *RHS0 = 
RHS->getOperand(0), *RHS1 = 
RHS->getOperand(1);
 
 1874    if ((
match(RHS0, AbsOrSelfLHS0) || 
match(RHS1, AbsOrSelfLHS0)) &&
 
 1889    if ((
match(LHS0, AbsOrSelfRHS0) || 
match(LHS1, AbsOrSelfRHS0)) &&
 
 
 1903                                  Value *Op1, 
bool IsAnd) {
 
 1907  if (Cast0 && Cast1 && Cast0->getOpcode() == Cast1->getOpcode() &&
 
 1908      Cast0->getSrcTy() == Cast1->getSrcTy()) {
 
 1909    Op0 = Cast0->getOperand(0);
 
 1910    Op1 = Cast1->getOperand(0);
 
 
 1941                                     bool AllowRefinement,
 
 1943                                     unsigned MaxRecurse);
 
 1947                                      unsigned MaxRecurse) {
 
 1948  assert((Opcode == Instruction::And || Opcode == Instruction::Or) &&
 
 1964      if (Res == Absorber)
 
 1974    if (Res == Absorber)
 
 1984                                           nullptr, MaxRecurse))
 
 1985    return Simplify(Res);
 
 1988                                           nullptr, MaxRecurse))
 
 1989    return Simplify(Res);
 
 
 2021                                     unsigned MaxRecurse) {
 
 2055  const APInt *Shift1, *Shift2;
 
 2059      Shift1->
uge(*Shift2))
 
 
 2072                              unsigned MaxRecurse) {
 
 2112        (~(*Mask)).lshr(*ShAmt).isZero())
 
 2118        (~(*Mask)).shl(*ShAmt).isZero())
 
 2123  const APInt *PowerC;
 
 2145                                        Instruction::Or, Q, MaxRecurse))
 
 2150                                        Instruction::Xor, Q, MaxRecurse))
 
 2195    if (EffWidthY <= ShftCnt) {
 
 2228      if (*Implied == 
true)
 
 2231      if (*Implied == 
false)
 
 
 2256  assert(
X->getType() == 
Y->getType() && 
"Expected same type for 'or' ops");
 
 2257  Type *Ty = 
X->getType();
 
 
 2347                             unsigned MaxRecurse) {
 
 2386        C->ule(
X->getType()->getScalarSizeInBits())) {
 
 2441                                        Instruction::And, Q, MaxRecurse))
 
 2462  const APInt *C1, *C2;
 
 2498    if (std::optional<bool> Implied =
 
 2501      if (*Implied == 
false)
 
 2504      if (*Implied == 
true)
 
 2507    if (std::optional<bool> Implied =
 
 2510      if (*Implied == 
false)
 
 2513      if (*Implied == 
true)
 
 
 2531                              unsigned MaxRecurse) {
 
 2573  if (
Value *R = foldAndOrNot(Op0, Op1))
 
 2575  if (
Value *R = foldAndOrNot(Op1, Op0))
 
 
 2628  Value *CmpLHS = Cmp->getOperand(0), *CmpRHS = Cmp->getOperand(1);
 
 2629  if (Pred == Cmp->getPredicate() && 
LHS == CmpLHS && 
RHS == CmpRHS)
 
 2632      LHS == CmpRHS && 
RHS == CmpLHS)
 
 
 2646    return AI->isStaticAlloca();
 
 2648    return (GV->hasLocalLinkage() || GV->hasHiddenVisibility() ||
 
 2649            GV->hasProtectedVisibility() || GV->hasGlobalUnnamedAddr()) &&
 
 2650           !GV->isThreadLocal();
 
 2652    return A->hasByValAttr();
 
 
 2685  auto isByValArg = [](
const Value *V) {
 
 2687    return A && 
A->hasByValAttr();
 
 
 2731  assert(
LHS->getType() == 
RHS->getType() && 
"Must have same types");
 
 2754  unsigned IndexSize = 
DL.getIndexTypeSizeInBits(
LHS->getType());
 
 2755  APInt LHSOffset(IndexSize, 0), RHSOffset(IndexSize, 0);
 
 2756  LHS = 
LHS->stripAndAccumulateConstantOffsets(
DL, LHSOffset, AllowNonInbounds);
 
 2757  RHS = 
RHS->stripAndAccumulateConstantOffsets(
DL, RHSOffset, AllowNonInbounds);
 
 2778          return I->getFunction();
 
 2780          return A->getParent();
 
 2786        APInt Dist = LHSOffset - RHSOffset;
 
 2814    if ((IsNAC(LHSUObjs) && IsAllocDisjoint(RHSUObjs)) ||
 
 2815        (IsNAC(RHSUObjs) && IsAllocDisjoint(LHSUObjs)))
 
 2835        bool Captured = 
false;
 
 2843            unsigned OtherIdx = 1 - U->getOperandNo();
 
 2853      CustomCaptureTracker Tracker;
 
 2855      if (!Tracker.Captured)
 
 
 2877  auto ExtractNotLHS = [](
Value *V) -> 
Value * {
 
 
 3069        *MulC != 0 && 
C->urem(*MulC) != 0) ||
 
 3071        *MulC != 0 && 
C->srem(*MulC) != 0)))
 
 
 3086                                       unsigned Depth = 0) {
 
 3087  if (!Res.
insert(V).second)
 
 3114    switch (
I->getOpcode()) {
 
 3115    case Instruction::And:
 
 3119    case Instruction::URem:
 
 3120    case Instruction::UDiv:
 
 3121    case Instruction::LShr:
 
 3124    case Instruction::Call:
 
 
 3146  for (
Value *GV : GreaterValues)
 
 
 3155                                         unsigned MaxRecurse) {
 
 3239  const APInt *C1, *C2;
 
 
 3286  const APInt *C1, *C2;
 
 
 3300                                    unsigned MaxRecurse) {
 
 3303  if (MaxRecurse && (LBO || RBO)) {
 
 3305    Value *
A = 
nullptr, *
B = 
nullptr, *
C = 
nullptr, *
D = 
nullptr;
 
 3307    bool NoLHSWrapProblem = 
false, NoRHSWrapProblem = 
false;
 
 3308    if (LBO && LBO->
getOpcode() == Instruction::Add) {
 
 3318    if (RBO && RBO->
getOpcode() == Instruction::Add) {
 
 3330    if ((
A == 
RHS || 
B == 
RHS) && NoLHSWrapProblem)
 
 3337    if ((
C == 
LHS || 
D == 
LHS) && NoRHSWrapProblem)
 
 3340                               C == 
LHS ? 
D : 
C, Q, MaxRecurse - 1))
 
 3344    bool CanSimplify = (NoLHSWrapProblem && NoRHSWrapProblem) ||
 
 3346    if (
A && 
C && (
A == 
C || 
A == 
D || 
B == 
C || 
B == 
D) && CanSimplify) {
 
 3353      } 
else if (
A == 
D) {
 
 3357      } 
else if (
B == 
C) {
 
 3385      if (
C->isStrictlyPositive()) {
 
 3391      if (
C->isNonNegative()) {
 
 3441    case Instruction::Shl: {
 
 3457    case Instruction::And:
 
 3458    case Instruction::Or: {
 
 3459      const APInt *C1, *C2;
 
 3489    case Instruction::UDiv:
 
 3490    case Instruction::LShr:
 
 3498    case Instruction::SDiv:
 
 3506    case Instruction::AShr:
 
 3513    case Instruction::Shl: {
 
 
 3534                                     unsigned MaxRecurse) {
 
 3696      (
A == 
C || 
A == 
D || 
B == 
C || 
B == 
D)) {
 
 3705             (
A == 
C || 
A == 
D || 
B == 
C || 
B == 
D)) {
 
 
 3746  switch (
II->getIntrinsicID()) {
 
 3747  case Intrinsic::uadd_sat:
 
 3757  case Intrinsic::usub_sat:
 
 
 3780    return A->getRange();
 
 3782    return CB->getRange();
 
 3784  return std::nullopt;
 
 
 3835      if (LhsCr->icmp(Pred, *RhsCr))
 
 3860        if (RI->getOperand(0)->getType() == SrcTy)
 
 3872        if (MaxRecurse && SrcTy == RI->getOperand(0)->getType())
 
 3876                                   RI->getOperand(0), Q, MaxRecurse - 1))
 
 3881        if (
SrcOp == RI->getOperand(0)) {
 
 3898        assert(Trunc && 
"Constant-fold of ImmConstant should not fail");
 
 3901        assert(RExt && 
"Constant-fold of ImmConstant should not fail");
 
 3904        assert(AnyEq && 
"Constant-fold of ImmConstant should not fail");
 
 3911                                          SrcOp, Trunc, Q, MaxRecurse - 1))
 
 3952        if (MaxRecurse && SrcTy == RI->getOperand(0)->getType())
 
 3960        if (
SrcOp == RI->getOperand(0)) {
 
 3976        assert(Trunc && 
"Constant-fold of ImmConstant should not fail");
 
 3979        assert(RExt && 
"Constant-fold of ImmConstant should not fail");
 
 3982        assert(AnyEq && 
"Constant-fold of ImmConstant should not fail");
 
 4070  if (std::optional<bool> Res =
 
 4076  if (
LHS->getType()->isPointerTy())
 
 4081      if (CLHS->getPointerOperandType() == CRHS->getPointerOperandType() &&
 
 4085                                         CRHS->getPointerOperand(), Q))
 
 
 4105  return ::simplifyICmpInst(Predicate, LHS, RHS, Q, 
RecursionLimit);
 
 
 4112                               unsigned MaxRecurse) {
 
 4169  if (std::optional<bool> Res =
 
 4175  std::optional<KnownFPClass> FullKnownClassLHS;
 
 4179  auto computeLHSClass = [=, &FullKnownClassLHS](
FPClassTest InterestedFlags =
 
 4181    if (FullKnownClassLHS)
 
 4182      return *FullKnownClassLHS;
 
 4195      FullKnownClassLHS = computeLHSClass();
 
 4196      if ((FullKnownClassLHS->KnownFPClasses & ClassTest) == 
fcNone)
 
 4198      if ((FullKnownClassLHS->KnownFPClasses & ~ClassTest) == 
fcNone)
 
 4213    if (
C->isNegative() && !
C->isNegZero()) {
 
 4272        return ConstantInt::get(RetTy, IsMaxNum);
 
 4281        return ConstantInt::get(RetTy, !IsMaxNum);
 
 4297        Interested |= 
fcNan;
 
 
 4341  return ::simplifyFCmpInst(Predicate, LHS, RHS, FMF, Q, 
RecursionLimit);
 
 
 4347                                      bool AllowRefinement,
 
 4349                                      unsigned MaxRecurse) {
 
 4351         "If AllowRefinement=false then CanUseUndef=false");
 
 4352  for (
const auto &OpAndRepOp : 
Ops) {
 
 4358    if (V == OpAndRepOp.first)
 
 4359      return OpAndRepOp.second;
 
 4382  for (
const auto &OpAndRepOp : 
Ops) {
 
 4385    if (OpAndRepOp.first->getType()->isVectorTy() &&
 
 4392  bool AnyReplaced = 
false;
 
 4393  for (
Value *InstOp : 
I->operands()) {
 
 4395            InstOp, 
Ops, Q, AllowRefinement, DropFlags, MaxRecurse)) {
 
 4397      AnyReplaced = InstOp != NewInstOp;
 
 4411  if (!AllowRefinement) {
 
 4417      unsigned Opcode = BO->getOpcode();
 
 4420      if (!BO->getType()->isFPOrFPVectorTy()) {
 
 4429      if ((Opcode == Instruction::And || Opcode == Instruction::Or) &&
 
 4430          NewOps[0] == NewOps[1]) {
 
 4433          if (PDI->isDisjoint()) {
 
 4445      if ((Opcode == Instruction::Sub || Opcode == Instruction::Xor) &&
 
 4446          NewOps[0] == NewOps[1] &&
 
 4447          any_of(
Ops, [=](
const auto &Rep) { 
return NewOps[0] == Rep.second; }))
 
 4458      if ((NewOps[0] == Absorber || NewOps[1] == Absorber) &&
 
 4460                 [=](
const auto &Rep) { 
return impliesPoison(BO, Rep.first); }))
 
 4480    auto PreventSelfSimplify = [V](
Value *Simplified) {
 
 4481      return Simplified != V ? Simplified : 
nullptr;
 
 4484    return PreventSelfSimplify(
 
 4491  for (
Value *NewOp : NewOps) {
 
 4507  if (!AllowRefinement) {
 
 4511          II && 
II->getIntrinsicID() == Intrinsic::abs) {
 
 4512        if (!ConstOps[0]->isNotMinSignedValue())
 
 4519    if (DropFlags && Res && 
I->hasPoisonGeneratingAnnotations())
 
 
 4530                                     bool AllowRefinement,
 
 4532                                     unsigned MaxRecurse) {
 
 4534                                 DropFlags, MaxRecurse);
 
 
 4539                                    bool AllowRefinement,
 
 4543  if (!AllowRefinement)
 
 4546  return ::simplifyWithOpReplaced(V, 
Op, RepOp, Q, AllowRefinement, DropFlags,
 
 
 4553                                    const APInt *
Y, 
bool TrueWhenUnset) {
 
 4560    return TrueWhenUnset ? FalseVal : TrueVal;
 
 4566    return TrueWhenUnset ? FalseVal : TrueVal;
 
 4568  if (
Y->isPowerOf2()) {
 
 4576      return TrueWhenUnset ? TrueVal : FalseVal;
 
 4586      return TrueWhenUnset ? TrueVal : FalseVal;
 
 
 4597  if (CmpRHS == TVal || CmpRHS == FVal) {
 
 4603  if (CmpLHS == FVal) {
 
 4610  Value *
X = CmpLHS, *
Y = CmpRHS;
 
 4611  bool PeekedThroughSelectShuffle = 
false;
 
 4613  if (Shuf && Shuf->isSelect()) {
 
 4614    if (Shuf->getOperand(0) == 
Y)
 
 4615      FVal = Shuf->getOperand(1);
 
 4616    else if (Shuf->getOperand(1) == 
Y)
 
 4617      FVal = Shuf->getOperand(0);
 
 4620    PeekedThroughSelectShuffle = 
true;
 
 4625  if (!MMI || TVal != 
X ||
 
 4643  if (PeekedThroughSelectShuffle)
 
 
 4679    ArrayRef<std::pair<Value *, Value *>> Replacements, 
Value *TrueVal,
 
 4681  Value *SimplifiedFalseVal =
 
 4684                               nullptr, MaxRecurse);
 
 4685  if (!SimplifiedFalseVal)
 
 4686    SimplifiedFalseVal = FalseVal;
 
 4688  Value *SimplifiedTrueVal =
 
 4691                               nullptr, MaxRecurse);
 
 4692  if (!SimplifiedTrueVal)
 
 4693    SimplifiedTrueVal = TrueVal;
 
 4695  if (SimplifiedFalseVal == SimplifiedTrueVal)
 
 
 4706                                         unsigned MaxRecurse) {
 
 4708  Value *CmpLHS, *CmpRHS;
 
 4724  if (TrueVal->getType()->isIntOrIntVectorTy()) {
 
 4732                                    X->getType()->getScalarSizeInBits());
 
 4752    if (
match(TrueVal, isFsh) && FalseVal == 
X && CmpLHS == ShAmt)
 
 4765    if (
match(FalseVal, isRotate) && TrueVal == 
X && CmpLHS == ShAmt &&
 
 4787                                                   FalseVal, Q, MaxRecurse))
 
 4792                                                   FalseVal, Q, MaxRecurse))
 
 4802              {{
X, CmpRHS}, {
Y, CmpRHS}}, TrueVal, FalseVal, Q, MaxRecurse))
 
 4811              {{
X, CmpRHS}, {
Y, CmpRHS}}, TrueVal, FalseVal, Q, MaxRecurse))
 
 
 4823                                     unsigned MaxRecurse) {
 
 4825  Value *CmpLHS, *CmpRHS;
 
 4830  bool IsEquiv = 
I->isEquivalence();
 
 4831  if (
I->isEquivalence(
true)) {
 
 4849  if (CmpLHS == 
F && CmpRHS == 
T)
 
 4852  if (CmpLHS != 
T || CmpRHS != 
F)
 
 
 4905  unsigned DiffVals = 0;
 
 4907  for (
unsigned i = 0; i < 2; i++) {
 
 4923  if (!
SI || !IdenticalSI)
 
 4925  if (
SI->getCondition() != IdenticalSI->getCondition())
 
 4929  Value *IdenticalSIOtherVal = 
nullptr;
 
 4930  if (
SI->getTrueValue() == IdenticalSI->getTrueValue()) {
 
 4932    IdenticalSIOtherVal = IdenticalSI->getFalseValue();
 
 4933  } 
else if (
SI->getFalseValue() == IdenticalSI->getFalseValue()) {
 
 4935    IdenticalSIOtherVal = IdenticalSI->getTrueValue();
 
 4942  if (!SIOtherVal || IdenticalSIOtherVal != &IdenticalPN)
 
 
 4980  assert(
Cond->getType()->isIntOrIntVectorTy(1) &&
 
 4981         "Select must have bool or bool vector condition");
 
 4982  assert(TrueVal->getType() == FalseVal->getType() &&
 
 4983         "Select must have same types for true/false ops");
 
 4985  if (
Cond->getType() == TrueVal->getType()) {
 
 5048  if (TrueVal == FalseVal)
 
 5051  if (
Cond == TrueVal) {
 
 5059  if (
Cond == FalseVal) {
 
 5090    for (
unsigned i = 0; i != NumElts; ++i) {
 
 5094      if (!TEltC || !FEltC)
 
 5110    if (NewC.
size() == NumElts)
 
 5126    return *Imp ? TrueVal : FalseVal;
 
 
 5153  if (Indices.
empty())
 
 5183  bool IsScalableVec =
 
 5184      SrcTy->isScalableTy() || 
any_of(Indices, [](
const Value *V) {
 
 5188  if (Indices.
size() == 1) {
 
 5190    if (!IsScalableVec && Ty->isSized()) {
 
 5195      if (TyAllocSize == 0 && 
Ptr->getType() == GEPTy)
 
 5203        auto CanSimplify = [GEPTy, &
P, 
Ptr]() -> 
bool {
 
 5204          return P->getType() == GEPTy &&
 
 5208        if (TyAllocSize == 1 &&
 
 5219            TyAllocSize == 1ULL << 
C && CanSimplify())
 
 5238      APInt BasePtrOffset(IdxWidth, 0);
 
 5239      Value *StrippedBasePtr =
 
 5240          Ptr->stripAndAccumulateInBoundsConstantOffsets(Q.
DL, BasePtrOffset);
 
 5249          !BasePtrOffset.
isZero()) {
 
 5250        auto *CI = ConstantInt::get(GEPTy->
getContext(), BasePtrOffset);
 
 5256          !BasePtrOffset.
isOne()) {
 
 5257        auto *CI = ConstantInt::get(GEPTy->
getContext(), BasePtrOffset - 1);
 
 
 5298    if (EV->getAggregateOperand()->getType() == Agg->
getType() &&
 
 5299        EV->getIndices() == Idxs) {
 
 5305        return EV->getAggregateOperand();
 
 5308      if (Agg == EV->getAggregateOperand())
 
 
 5318  return ::simplifyInsertValueInst(Agg, Val, Idxs, Q, 
RecursionLimit);
 
 
 5327  if (VecC && ValC && IdxC)
 
 5348  if (VecC && ValC && VecC->getSplatValue() == ValC)
 
 
 5368  unsigned NumIdxs = Idxs.
size();
 
 5372    unsigned NumInsertValueIdxs = InsertValueIdxs.
size();
 
 5373    unsigned NumCommonIdxs = std::min(NumInsertValueIdxs, NumIdxs);
 
 5374    if (InsertValueIdxs.
slice(0, NumCommonIdxs) ==
 
 5375        Idxs.
slice(0, NumCommonIdxs)) {
 
 5376      if (NumIdxs == NumInsertValueIdxs)
 
 5377        return IVI->getInsertedValueOperand();
 
 5384  if (Idxs.
size() == 1 &&
 
 5391    assert(Idxs[0] == 1 && 
"invalid index");
 
 
 5425    unsigned MinNumElts = VecVTy->getElementCount().getKnownMinValue();
 
 5429    if (IdxC->getValue().ult(MinNumElts))
 
 5440    if (IE && IE->getOperand(2) == Idx)
 
 5441      return IE->getOperand(1);
 
 
 5452  return ::simplifyExtractElementInst(Vec, Idx, Q, 
RecursionLimit);
 
 
 5464  Value *CommonValue = 
nullptr;
 
 5465  bool HasPoisonInput = 
false;
 
 5466  bool HasUndefInput = 
false;
 
 5472      HasPoisonInput = 
true;
 
 5477      HasUndefInput = 
true;
 
 5480    if (CommonValue && 
Incoming != CommonValue)
 
 5491  if (HasPoisonInput || HasUndefInput) {
 
 5499    if (HasUndefInput &&
 
 
 5514    auto *Src = CI->getOperand(0);
 
 5515    Type *SrcTy = Src->getType();
 
 5516    Type *MidTy = CI->getType();
 
 5518    if (Src->getType() == Ty) {
 
 5519      auto FirstOp = CI->getOpcode();
 
 5522                                         &Q.
DL) == Instruction::BitCast)
 
 5528  if (CastOpc == Instruction::BitCast)
 
 5529    if (
Op->getType() == Ty)
 
 5534  if ((CastOpc == Instruction::PtrToInt || CastOpc == Instruction::PtrToAddr) &&
 
 
 5553                                   int MaskVal, 
Value *RootVec,
 
 5554                                   unsigned MaxRecurse) {
 
 5565  int RootElt = MaskVal;
 
 5566  Value *SourceOp = Op0;
 
 5567  if (MaskVal >= InVecNumElts) {
 
 5568    RootElt = MaskVal - InVecNumElts;
 
 5576        DestElt, SourceShuf->getOperand(0), SourceShuf->getOperand(1),
 
 5577        SourceShuf->getMaskValue(RootElt), RootVec, MaxRecurse);
 
 5586  if (RootVec != SourceOp)
 
 5591  if (RootElt != DestElt)
 
 
 5600                                        unsigned MaxRecurse) {
 
 5605  unsigned MaskNumElts = Mask.size();
 
 5606  ElementCount InVecEltCount = InVecTy->getElementCount();
 
 5611  Indices.
assign(Mask.begin(), Mask.end());
 
 5616    bool MaskSelects0 = 
false, MaskSelects1 = 
false;
 
 5618    for (
unsigned i = 0; i != MaskNumElts; ++i) {
 
 5619      if (Indices[i] == -1)
 
 5621      if ((
unsigned)Indices[i] < InVecNumElts)
 
 5622        MaskSelects0 = 
true;
 
 5624        MaskSelects1 = 
true;
 
 5638  if (Op0Const && Op1Const)
 
 5644  if (!Scalable && Op0Const && !Op1Const) {
 
 5662    if (
all_of(Indices, [InsertIndex](
int MaskElt) {
 
 5663          return MaskElt == InsertIndex || MaskElt == -1;
 
 5669      for (
unsigned i = 0; i != MaskNumElts; ++i)
 
 5670        if (Indices[i] == -1)
 
 5698  Value *RootVec = 
nullptr;
 
 5699  for (
unsigned i = 0; i != MaskNumElts; ++i) {
 
 5706    if (!RootVec || RootVec->
getType() != RetTy)
 
 
 5716  return ::simplifyShuffleVectorInst(Op0, Op1, Mask, RetTy, Q, 
RecursionLimit);
 
 
 5749  Type *Ty = In->getType();
 
 5751    unsigned NumElts = VecTy->getNumElements();
 
 5753    for (
unsigned i = 0; i != NumElts; ++i) {
 
 5754      Constant *EltC = In->getAggregateElement(i);
 
 5759      else if (EltC && EltC->
isNaN())
 
 5760        NewC[i] = ConstantFP::get(
 
 5776    auto *
Splat = In->getSplatValue();
 
 5778           "Found a scalable-vector NaN but not a splat");
 
 
 5807    if (FMF.
noNaNs() && (IsNan || IsUndef))
 
 5809    if (FMF.
noInfs() && (IsInf || IsUndef))
 
 
 6024  return simplifyFMAFMul(Op0, Op1, FMF, Q, MaxRecurse, ExBehavior, Rounding);
 
 
 6031  return ::simplifyFAddInst(Op0, Op1, FMF, Q, 
RecursionLimit, ExBehavior,
 
 
 6039  return ::simplifyFSubInst(Op0, Op1, FMF, Q, 
RecursionLimit, ExBehavior,
 
 
 6047  return ::simplifyFMulInst(Op0, Op1, FMF, Q, 
RecursionLimit, ExBehavior,
 
 
 6055  return ::simplifyFMAFMul(Op0, Op1, FMF, Q, 
RecursionLimit, ExBehavior,
 
 
 6088      return ConstantFP::get(Op0->
getType(), 1.0);
 
 6100      return ConstantFP::get(Op0->
getType(), -1.0);
 
 
 6114  return ::simplifyFDivInst(Op0, Op1, FMF, Q, 
RecursionLimit, ExBehavior,
 
 
 6152  return ::simplifyFRemInst(Op0, Op1, FMF, Q, 
RecursionLimit, ExBehavior,
 
 
 6161                           unsigned MaxRecurse) {
 
 6163  case Instruction::FNeg:
 
 
 6175                             unsigned MaxRecurse) {
 
 6177  case Instruction::FNeg:
 
 
 6198  case Instruction::Add:
 
 6201  case Instruction::Sub:
 
 6204  case Instruction::Mul:
 
 6207  case Instruction::SDiv:
 
 6209  case Instruction::UDiv:
 
 6211  case Instruction::SRem:
 
 6213  case Instruction::URem:
 
 6215  case Instruction::Shl:
 
 6218  case Instruction::LShr:
 
 6220  case Instruction::AShr:
 
 6222  case Instruction::And:
 
 6224  case Instruction::Or:
 
 6226  case Instruction::Xor:
 
 6228  case Instruction::FAdd:
 
 6230  case Instruction::FSub:
 
 6232  case Instruction::FMul:
 
 6234  case Instruction::FDiv:
 
 6236  case Instruction::FRem:
 
 
 6248                            unsigned MaxRecurse) {
 
 6250  case Instruction::FAdd:
 
 6252  case Instruction::FSub:
 
 6254  case Instruction::FMul:
 
 6256  case Instruction::FDiv:
 
 
 6270  return ::simplifyBinOp(Opcode, LHS, RHS, FMF, Q, 
RecursionLimit);
 
 
 6283  return ::simplifyCmpInst(Predicate, LHS, RHS, Q, 
RecursionLimit);
 
 
 6292  case Intrinsic::fabs:
 
 6293  case Intrinsic::floor:
 
 6294  case Intrinsic::ceil:
 
 6295  case Intrinsic::trunc:
 
 6296  case Intrinsic::rint:
 
 6297  case Intrinsic::nearbyint:
 
 6298  case Intrinsic::round:
 
 6299  case Intrinsic::roundeven:
 
 6300  case Intrinsic::canonicalize:
 
 6301  case Intrinsic::arithmetic_fence:
 
 
 6313  case Intrinsic::floor:
 
 6314  case Intrinsic::ceil:
 
 6315  case Intrinsic::trunc:
 
 6316  case Intrinsic::rint:
 
 6317  case Intrinsic::nearbyint:
 
 6318  case Intrinsic::round:
 
 6319  case Intrinsic::roundeven:
 
 
 6334  if (!OffsetConstInt || OffsetConstInt->getBitWidth() > 64)
 
 6338      DL.getIndexTypeSizeInBits(
Ptr->getType()));
 
 6339  if (OffsetInt.
srem(4) != 0)
 
 6351  if (LoadedCE->getOpcode() == Instruction::Trunc) {
 
 6357  if (LoadedCE->getOpcode() != Instruction::Sub)
 
 6361  if (!LoadedLHS || LoadedLHS->getOpcode() != Instruction::PtrToInt)
 
 6363  auto *LoadedLHSPtr = LoadedLHS->getOperand(0);
 
 6367  APInt LoadedRHSOffset;
 
 6370      PtrSym != LoadedRHSSym || PtrOffset != LoadedRHSOffset)
 
 6373  return LoadedLHSPtr;
 
 
 6404  if (
C && (
C->isZero() || 
C->isInfinity()))
 
 6413  if (
C && 
C->isNaN())
 
 6414    return ConstantFP::get(Op0->
getType(), 
C->makeQuiet());
 
 
 6433      if (
II->getIntrinsicID() == IID)
 
 6450  case Intrinsic::fabs:
 
 6454  case Intrinsic::bswap:
 
 6459  case Intrinsic::bitreverse:
 
 6464  case Intrinsic::ctpop: {
 
 6467      return ConstantInt::get(Op0->
getType(), 1);
 
 6476  case Intrinsic::exp:
 
 6478    if (
Call->hasAllowReassoc() &&
 
 6482  case Intrinsic::exp2:
 
 6484    if (
Call->hasAllowReassoc() &&
 
 6488  case Intrinsic::exp10:
 
 6490    if (
Call->hasAllowReassoc() &&
 
 6494  case Intrinsic::log:
 
 6496    if (
Call->hasAllowReassoc() &&
 
 6500  case Intrinsic::log2:
 
 6502    if (
Call->hasAllowReassoc() &&
 
 6508  case Intrinsic::log10:
 
 6511    if (
Call->hasAllowReassoc() &&
 
 6517  case Intrinsic::vector_reverse:
 
 
 6545  if (Op1 == 
X || Op1 == 
Y ||
 
 
 6562  assert((IID == Intrinsic::maxnum || IID == Intrinsic::minnum ||
 
 6563          IID == Intrinsic::maximum || IID == Intrinsic::minimum ||
 
 6564          IID == Intrinsic::maximumnum || IID == Intrinsic::minimumnum) &&
 
 6565         "Unsupported intrinsic");
 
 6571  if (!
M0 || 
M0->getIntrinsicID() != IID)
 
 6573  Value *X0 = 
M0->getOperand(0);
 
 6574  Value *Y0 = 
M0->getOperand(1);
 
 6581  if (X0 == Op1 || Y0 == Op1)
 
 6587  Value *X1 = 
M1->getOperand(0);
 
 6588  Value *Y1 = 
M1->getOperand(1);
 
 6596  if ((X0 == X1 && Y0 == Y1) || (X0 == Y1 && Y0 == X1))
 
 
 6619  assert(OutNewConstVal != 
nullptr);
 
 6621  bool PropagateNaN = IID == Intrinsic::minimum || IID == Intrinsic::maximum;
 
 6622  bool PropagateSNaN = IID == Intrinsic::minnum || IID == Intrinsic::maxnum;
 
 6623  bool IsMin = IID == Intrinsic::minimum || IID == Intrinsic::minnum ||
 
 6624               IID == Intrinsic::minimumnum;
 
 6628    *OutNewConstVal = 
const_cast<Constant *
>(RHSConst);
 
 6646    if (PropagateNaN || (PropagateSNaN && CAPF.
isSignaling())) {
 
 6661        (!PropagateNaN || (
Call && 
Call->hasNoNaNs()))) {
 
 6662      *OutNewConstVal = 
const_cast<Constant *
>(RHSConst);
 
 6673        (PropagateNaN || (
Call && 
Call->hasNoNaNs())))
 
 
 6683  unsigned BitWidth = ReturnType->getScalarSizeInBits();
 
 6685  case Intrinsic::get_active_lane_mask: {
 
 6691    Attribute Attr = 
F->getFnAttribute(Attribute::VScaleRange);
 
 6692    if (ScalableTy && Attr.
isValid()) {
 
 6697          (
uint64_t)ScalableTy->getMinNumElements() * (*VScaleMax);
 
 6699      const APInt *Op1Val;
 
 6701          Op1Val->
uge(MaxPossibleMaskElements))
 
 6706  case Intrinsic::abs:
 
 6714  case Intrinsic::cttz: {
 
 6720  case Intrinsic::ctlz: {
 
 6728  case Intrinsic::ptrmask: {
 
 6736           "Invalid mask width");
 
 6753      APInt IrrelevantPtrBits =
 
 6756          Instruction::Or, 
C, ConstantInt::get(
C->getType(), IrrelevantPtrBits),
 
 6758      if (
C != 
nullptr && 
C->isAllOnesValue())
 
 6763  case Intrinsic::smax:
 
 6764  case Intrinsic::smin:
 
 6765  case Intrinsic::umax:
 
 6766  case Intrinsic::umin: {
 
 6777      return ConstantInt::get(
 
 6785        return ConstantInt::get(ReturnType, *
C);
 
 6797      if (MinMax0 && MinMax0->getIntrinsicID() == IID) {
 
 6799        Value *M00 = MinMax0->getOperand(0), *M01 = MinMax0->getOperand(1);
 
 6800        const APInt *InnerC;
 
 6823  case Intrinsic::scmp:
 
 6824  case Intrinsic::ucmp: {
 
 6833      return ConstantInt::get(ReturnType, 1);
 
 6842  case Intrinsic::usub_with_overflow:
 
 6843  case Intrinsic::ssub_with_overflow:
 
 6850  case Intrinsic::uadd_with_overflow:
 
 6851  case Intrinsic::sadd_with_overflow:
 
 6861  case Intrinsic::umul_with_overflow:
 
 6862  case Intrinsic::smul_with_overflow:
 
 6872  case Intrinsic::uadd_sat:
 
 6878  case Intrinsic::sadd_sat:
 
 6893  case Intrinsic::usub_sat:
 
 6898  case Intrinsic::ssub_sat:
 
 6906  case Intrinsic::load_relative:
 
 6911  case Intrinsic::powi:
 
 6914      if (Power->isZero())
 
 6915        return ConstantFP::get(Op0->
getType(), 1.0);
 
 6921  case Intrinsic::ldexp:
 
 6923  case Intrinsic::copysign:
 
 6933  case Intrinsic::is_fpclass: {
 
 6937      return ConstantInt::get(ReturnType, 
true);
 
 6939      return ConstantInt::get(ReturnType, 
false);
 
 6944  case Intrinsic::maxnum:
 
 6945  case Intrinsic::minnum:
 
 6946  case Intrinsic::maximum:
 
 6947  case Intrinsic::minimum:
 
 6948  case Intrinsic::maximumnum:
 
 6949  case Intrinsic::minimumnum: {
 
 6972        if (
Constant *SplatVal = 
C->getSplatValue()) {
 
 6978        } 
else if (ElemCount.
isFixed()) {
 
 6989                                                  IID, 
Call, &NewConst);
 
 6991                (ElemResult != OptResult &&
 
 6999              OptResult = ElemResult;
 
 7025  case Intrinsic::vector_extract: {
 
 7031        IdxN == 0 && 
X->getType() == ReturnType)
 
 
 7048  unsigned NumOperands = Args.size();
 
 7059    case Intrinsic::vscale: {
 
 7060      Type *RetTy = 
F->getReturnType();
 
 7063        return ConstantInt::get(RetTy, 
C->getZExtValue());
 
 7071  if (NumOperands == 1)
 
 7074  if (NumOperands == 2)
 
 7080  case Intrinsic::masked_load:
 
 7081  case Intrinsic::masked_gather: {
 
 7082    Value *MaskArg = Args[1];
 
 7083    Value *PassthruArg = Args[2];
 
 7089  case Intrinsic::fshl:
 
 7090  case Intrinsic::fshr: {
 
 7091    Value *Op0 = Args[0], *Op1 = Args[1], *ShAmtArg = Args[2];
 
 7099      return Args[IID == Intrinsic::fshl ? 0 : 1];
 
 7101    const APInt *ShAmtC;
 
 7106        return Args[IID == Intrinsic::fshl ? 0 : 1];
 
 7119  case Intrinsic::experimental_constrained_fma: {
 
 7122                                *FPI->getRoundingMode()))
 
 7126  case Intrinsic::fma:
 
 7127  case Intrinsic::fmuladd: {
 
 7133  case Intrinsic::smul_fix:
 
 7134  case Intrinsic::smul_fix_sat: {
 
 7135    Value *Op0 = Args[0];
 
 7136    Value *Op1 = Args[1];
 
 7137    Value *Op2 = Args[2];
 
 7138    Type *ReturnType = 
F->getReturnType();
 
 7163  case Intrinsic::vector_insert: {
 
 7164    Value *Vec = Args[0];
 
 7165    Value *SubVec = Args[1];
 
 7166    Value *Idx = Args[2];
 
 7167    Type *ReturnType = 
F->getReturnType();
 
 7176        X->getType() == ReturnType)
 
 7181  case Intrinsic::experimental_constrained_fadd: {
 
 7184                            *FPI->getExceptionBehavior(),
 
 7185                            *FPI->getRoundingMode());
 
 7187  case Intrinsic::experimental_constrained_fsub: {
 
 7190                            *FPI->getExceptionBehavior(),
 
 7191                            *FPI->getRoundingMode());
 
 7193  case Intrinsic::experimental_constrained_fmul: {
 
 7196                            *FPI->getExceptionBehavior(),
 
 7197                            *FPI->getRoundingMode());
 
 7199  case Intrinsic::experimental_constrained_fdiv: {
 
 7202                            *FPI->getExceptionBehavior(),
 
 7203                            *FPI->getRoundingMode());
 
 7205  case Intrinsic::experimental_constrained_frem: {
 
 7208                            *FPI->getExceptionBehavior(),
 
 7209                            *FPI->getRoundingMode());
 
 7211  case Intrinsic::experimental_constrained_ldexp:
 
 7213  case Intrinsic::experimental_gc_relocate: {
 
 7234  case Intrinsic::experimental_vp_reverse: {
 
 
 7264  ConstantArgs.
reserve(Args.size());
 
 7265  for (
Value *Arg : Args) {
 
 
 7285  if (
Call->isMustTailCall())
 
 7297  if (
F && 
F->isIntrinsic())
 
 
 7324  return ::simplifyFreezeInst(Op0, Q);
 
 
 7338  if (!GV || !GV->isConstant() || !GV->hasDefinitiveInitializer())
 
 
 7369                                              unsigned MaxRecurse) {
 
 7370  assert(
I->getFunction() && 
"instruction should be inserted in a function");
 
 7372         "context instruction should be in the same function");
 
 7376  switch (
I->getOpcode()) {
 
 7381                [](
Value *V) { return cast<Constant>(V); });
 
 7385  case Instruction::FNeg:
 
 7387  case Instruction::FAdd:
 
 7390  case Instruction::Add:
 
 7394  case Instruction::FSub:
 
 7397  case Instruction::Sub:
 
 7401  case Instruction::FMul:
 
 7404  case Instruction::Mul:
 
 7408  case Instruction::SDiv:
 
 7412  case Instruction::UDiv:
 
 7416  case Instruction::FDiv:
 
 7419  case Instruction::SRem:
 
 7421  case Instruction::URem:
 
 7423  case Instruction::FRem:
 
 7426  case Instruction::Shl:
 
 7430  case Instruction::LShr:
 
 7434  case Instruction::AShr:
 
 7438  case Instruction::And:
 
 7440  case Instruction::Or:
 
 7442  case Instruction::Xor:
 
 7444  case Instruction::ICmp:
 
 7446                            NewOps[1], Q, MaxRecurse);
 
 7447  case Instruction::FCmp:
 
 7449                            NewOps[1], 
I->getFastMathFlags(), Q, MaxRecurse);
 
 7450  case Instruction::Select:
 
 7452  case Instruction::GetElementPtr: {
 
 7455                           ArrayRef(NewOps).slice(1), GEPI->getNoWrapFlags(), Q,
 
 7458  case Instruction::InsertValue: {
 
 7463  case Instruction::InsertElement:
 
 7465  case Instruction::ExtractValue: {
 
 7470  case Instruction::ExtractElement:
 
 7472  case Instruction::ShuffleVector: {
 
 7475                                     SVI->getShuffleMask(), SVI->getType(), Q,
 
 7478  case Instruction::PHI:
 
 7480  case Instruction::Call:
 
 7484  case Instruction::Freeze:
 
 7486#define HANDLE_CAST_INST(num, opc, clas) case Instruction::opc: 
 7487#include "llvm/IR/Instruction.def" 
 7488#undef HANDLE_CAST_INST 
 7491  case Instruction::Alloca:
 
 7494  case Instruction::Load:
 
 
 7503         "Number of operands should match the instruction!");
 
 7504  return ::simplifyInstructionWithOperands(
I, NewOps, SQ, 
RecursionLimit);
 
 
 7534  bool Simplified = 
false;
 
 7541    for (
User *U : 
I->users())
 
 7546    I->replaceAllUsesWith(SimpleV);
 
 7548    if (!
I->isEHPad() && !
I->isTerminator() && !
I->mayHaveSideEffects())
 
 7549      I->eraseFromParent();
 
 7555  for (
unsigned Idx = 0; Idx != Worklist.
size(); ++Idx) {
 
 7561      if (UnsimplifiedUsers)
 
 7562        UnsimplifiedUsers->insert(
I);
 
 7571    for (
User *U : 
I->users())
 
 7575    I->replaceAllUsesWith(SimpleV);
 
 7577    if (!
I->isEHPad() && !
I->isTerminator() && !
I->mayHaveSideEffects())
 
 7578      I->eraseFromParent();
 
 
 7587  assert(
I != SimpleV && 
"replaceAndRecursivelySimplify(X,X) is not valid!");
 
 7588  assert(SimpleV && 
"Must provide a simplified value.");
 
 
 7596  auto *DT = DTWP ? &DTWP->
getDomTree() : 
nullptr;
 
 7598  auto *TLI = TLIWP ? &TLIWP->
getTLI(
F) : 
nullptr;
 
 7601  return {
F.getDataLayout(), TLI, DT, AC};
 
 
 7609template <
class T, 
class... TArgs>
 
 7612  auto *DT = AM.template getCachedResult<DominatorTreeAnalysis>(
F);
 
 7613  auto *TLI = AM.template getCachedResult<TargetLibraryAnalysis>(
F);
 
 7614  auto *AC = AM.template getCachedResult<AssumptionAnalysis>(
F);
 
 7615  return {
F.getDataLayout(), TLI, DT, AC};
 
 
 7629void InstSimplifyFolder::anchor() {}
 
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
 
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
 
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
 
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
 
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
 
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
 
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 * 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 * 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 void getUnsignedMonotonicValues(SmallPtrSetImpl< Value * > &Res, Value *V, MonotonicType Type, const SimplifyQuery &Q, unsigned Depth=0)
Get values V_i such that V uge V_i (GreaterEq) or V ule V_i (LowerEq).
 
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 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 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 * simplifyAndOfICmpsWithAdd(ICmpInst *Op0, ICmpInst *Op1, const InstrInfoQuery &IIQ)
 
static Value * simplifyAndOrOfFCmpsWithConstants(FCmpInst *Cmp0, FCmpInst *Cmp1, bool IsAnd)
Test if a pair of compares with a shared operand and 2 constants has an empty set intersection,...
 
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 Value * simplifyICmpUsingMonotonicValues(CmpPredicate Pred, Value *LHS, Value *RHS, const SimplifyQuery &Q)
 
static bool isPoisonShift(Value *Amount, const SimplifyQuery &Q)
Returns true if a shift by Amount always yields poison.
 
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 * 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 * 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 * 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 * 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 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 * 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 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 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 * simplifyAndOfICmps(ICmpInst *Op0, ICmpInst *Op1, const SimplifyQuery &Q)
 
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.
 
bool isSelectWithIdenticalPHI(PHINode &PN, PHINode &IdenticalPN)
Look for the following pattern and simplify to_fold to identicalPhi.
 
static APInt stripAndComputeConstantOffsets(const DataLayout &DL, Value *&V)
Compute the base pointer and cumulative constant offsets for V.
 
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 MinMaxOptResult OptimizeConstMinMax(const Constant *RHSConst, const Intrinsic::ID IID, const CallBase *Call, Constant **OutNewConstVal)
 
static Value * simplifyICmpWithConstant(CmpPredicate Pred, Value *LHS, Value *RHS, const SimplifyQuery &Q)
 
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 * 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 Constant * computePointerDifference(const DataLayout &DL, Value *LHS, Value *RHS)
Compute the constant difference between two pointer values.
 
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)
 
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
 
This header provides classes for managing per-loop analyses.
 
uint64_t IntrinsicInst * II
 
const SmallVectorImpl< MachineOperand > & Cond
 
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 TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
 
static TableGen::Emitter::OptClass< SkeletonEmitter > X("gen-skeleton-class", "Generate example skeleton class")
 
static SymbolRef::Type getType(const Symbol *Sym)
 
static const uint32_t IV[8]
 
APFloat makeQuiet() const
Assuming this is an IEEE-754 NaN value, quiet its signaling bit.
 
Class for arbitrary precision integers.
 
LLVM_ABI 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.
 
LLVM_ABI 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).
 
LLVM_ABI 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.
 
LLVM_ABI 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.
 
Functions, function parameters, and return types can have attributes to indicate how they should be t...
 
LLVM_ABI std::optional< unsigned > getVScaleRangeMax() const
Returns the maximum value for the vscale_range attribute or std::nullopt when unknown.
 
bool isValid() const
Return true if the attribute is any kind of attribute.
 
LLVM Basic Block Representation.
 
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 LLVM_ABI unsigned isEliminableCastPair(Instruction::CastOps firstOpcode, Instruction::CastOps secondOpcode, Type *SrcTy, Type *MidTy, Type *DstTy, const DataLayout *DL)
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.
 
@ FCMP_OEQ
0 0 0 1 True if ordered and equal
 
@ FCMP_TRUE
1 1 1 1 Always true (always folded)
 
@ ICMP_SLT
signed less than
 
@ ICMP_SLE
signed less or equal
 
@ FCMP_OLT
0 1 0 0 True if ordered and less than
 
@ FCMP_ULE
1 1 0 1 True if unordered, less than, or equal
 
@ FCMP_OGT
0 0 1 0 True if ordered and greater than
 
@ FCMP_OGE
0 0 1 1 True if ordered and greater than or equal
 
@ ICMP_UGE
unsigned greater or equal
 
@ ICMP_UGT
unsigned greater than
 
@ ICMP_SGT
signed greater than
 
@ FCMP_ULT
1 1 0 0 True if unordered or less than
 
@ FCMP_ONE
0 1 1 0 True if ordered and operands are unequal
 
@ FCMP_UEQ
1 0 0 1 True if unordered or equal
 
@ ICMP_ULT
unsigned less than
 
@ FCMP_UGT
1 0 1 0 True if unordered or greater than
 
@ FCMP_OLE
0 1 0 1 True if ordered and less than or equal
 
@ FCMP_ORD
0 1 1 1 True if ordered (no nans)
 
@ ICMP_SGE
signed greater or equal
 
@ FCMP_UNE
1 1 1 0 True if unordered or not equal
 
@ ICMP_ULE
unsigned less or equal
 
@ FCMP_UGE
1 0 1 1 True if unordered, greater than, or equal
 
@ FCMP_FALSE
0 0 0 0 Always false (always folded)
 
@ 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.
 
static bool isFPPredicate(Predicate P)
 
Predicate getNonStrictPredicate() const
For example, SGT -> SGE, SLT -> SLE, ULT -> ULE, UGT -> UGE.
 
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 LLVM_ABI bool isUnordered(Predicate predicate)
Determine if the predicate is an unordered operation.
 
static bool isIntPredicate(Predicate P)
 
static LLVM_ABI bool isOrdered(Predicate predicate)
Determine if the predicate is an ordered operation.
 
An abstraction over a floating-point predicate, and a pack of an integer predicate with samesign info...
 
static LLVM_ABI Constant * getIntToPtr(Constant *C, Type *Ty, bool OnlyIfReduced=false)
 
static LLVM_ABI Constant * getExtractElement(Constant *Vec, Constant *Idx, Type *OnlyIfReducedTy=nullptr)
 
static LLVM_ABI Constant * getBinOpAbsorber(unsigned Opcode, Type *Ty, bool AllowLHSConstant=false)
Return the absorbing element for the given binary operation, i.e.
 
static LLVM_ABI Constant * getNot(Constant *C)
 
static LLVM_ABI Constant * getInsertElement(Constant *Vec, Constant *Elt, Constant *Idx, Type *OnlyIfReducedTy=nullptr)
 
static LLVM_ABI 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 LLVM_ABI Constant * getBinOpIdentity(unsigned Opcode, Type *Ty, bool AllowRHSConstant=false, bool NSZ=false)
Return the identity constant for a binary opcode.
 
static LLVM_ABI std::optional< ConstantFPRange > makeExactFCmpRegion(FCmpInst::Predicate Pred, const APFloat &Other)
Produce the exact range such that all values in the returned range satisfy the given predicate with a...
 
ConstantFP - Floating Point Values [float, double].
 
const APFloat & getValueAPF() const
 
static LLVM_ABI Constant * getZero(Type *Ty, bool Negative=false)
 
static Constant * getNegativeZero(Type *Ty)
 
static LLVM_ABI Constant * getNaN(Type *Ty, bool Negative=false, uint64_t Payload=0)
 
This is the shared class of boolean and integer constants.
 
static LLVM_ABI ConstantInt * getTrue(LLVMContext &Context)
 
static ConstantInt * getSigned(IntegerType *Ty, int64_t V)
Return a ConstantInt with the specified value for the specified type.
 
static LLVM_ABI 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 LLVM_ABI ConstantInt * getBool(LLVMContext &Context, bool V)
 
static LLVM_ABI 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.
 
LLVM_ABI bool isFullSet() const
Return true if this set contains all of the elements possible for this data-type.
 
LLVM_ABI bool isEmptySet() const
Return true if this set contains no members.
 
static LLVM_ABI 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...
 
LLVM_ABI ConstantRange inverse() const
Return a new range that is the logical not of the current set.
 
LLVM_ABI bool contains(const APInt &Val) const
Return true if the specified value is in the set.
 
static LLVM_ABI Constant * get(StructType *T, ArrayRef< Constant * > V)
 
static LLVM_ABI Constant * getSplat(ElementCount EC, Constant *Elt)
Return a ConstantVector with the specified constant in each element.
 
static LLVM_ABI Constant * get(ArrayRef< Constant * > V)
 
This is an important base class in LLVM.
 
static LLVM_ABI Constant * getAllOnesValue(Type *Ty)
 
LLVM_ABI bool isAllOnesValue() const
Return true if this is the value that would be returned by getAllOnesValue.
 
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
 
LLVM_ABI bool isNaN() const
Return true if this is a floating-point NaN constant or a vector floating-point constant with all NaN...
 
LLVM_ABI Constant * getAggregateElement(unsigned Elt) const
For aggregates (struct/array/vector) return the constant that corresponds to the specified element if...
 
LLVM_ABI bool isNullValue() const
Return true if this is the value that would be returned by getNullValue.
 
A parsed version of the target data layout string in and methods for querying it.
 
unsigned getAddressSizeInBits(unsigned AS) const
The size in bits of an address in for the given AS.
 
LLVM_ABI unsigned getIndexTypeSizeInBits(Type *Ty) const
The size in bits of the index used in GEP calculation for this type.
 
LLVM_ABI IntegerType * getIndexType(LLVMContext &C, unsigned AddressSpace) const
Returns the type of a GEP index in AddressSpace.
 
LLVM_ABI 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
The size in bits of indices used for address calculation in getelementptr and for addresses in the gi...
 
TypeSize getTypeSizeInBits(Type *Ty) const
Size examples:
 
Legacy analysis pass which computes a DominatorTree.
 
DominatorTree & getDomTree()
 
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
 
LLVM_ABI 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.
 
LLVM_ABI Value * getBasePtr() const
 
LLVM_ABI Value * getDerivedPtr() const
 
Represents flags for the getelementptr instruction/expression.
 
static LLVM_ABI 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 LLVM_ABI 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.
 
static bool isEquality(Predicate P)
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.
 
LLVM_ABI bool hasNoSignedZeros() const LLVM_READONLY
Determine whether the no-signed-zeros flag is set.
 
static bool isBitwiseLogicOp(unsigned Opcode)
Determine if the Opcode is and/or/xor.
 
LLVM_ABI bool isAssociative() const LLVM_READONLY
Return true if the instruction is associative:
 
LLVM_ABI bool isCommutative() const LLVM_READONLY
Return true if the instruction is commutative:
 
LLVM_ABI 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...
 
static ICmpInst::Predicate getPredicate(Intrinsic::ID ID)
Returns the comparison predicate underlying the intrinsic.
 
op_range incoming_values()
 
Value * getIncomingValueForBlock(const BasicBlock *BB) const
 
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 LLVM_ABI 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.
 
const Value * getFalseValue() const
 
const Value * getTrueValue() const
 
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.
 
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
 
bool isIntOrIntVectorTy() const
Return true if this is an integer type or a vector of integer types.
 
LLVM_ABI TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
 
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
 
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
 
static LLVM_ABI 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.
 
LLVM_ABI 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.
 
Base class of all SIMD vector types.
 
static LLVM_ABI VectorType * get(Type *ElementType, ElementCount EC)
This static method is the primary way to construct an VectorType.
 
This class represents zero extension of integer types.
 
constexpr ScalarTy getFixedValue() const
 
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
 
constexpr bool isFixed() const
Returns true if the quantity is not scaled by vscale.
 
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
 
const ParentTy * getParent() const
 
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
 
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
 
@ C
The default llvm calling convention, compatible with C.
 
SpecificConstantMatch m_ZeroInt()
Convenience matchers for specific integer values.
 
BinaryOp_match< SpecificConstantMatch, SrcTy, TargetOpcode::G_SUB > m_Neg(const SrcTy &&Src)
Matches a register negated by a G_SUB.
 
BinaryOp_match< SrcTy, SpecificConstantMatch, TargetOpcode::G_XOR, true > m_Not(const SrcTy &&Src)
Matches a register not-ed by a G_XOR.
 
cst_pred_ty< is_all_ones > m_AllOnes()
Match an integer or vector with all bits set.
 
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)
 
auto m_PtrToIntOrAddr(const OpTy &Op)
Matches PtrToInt or PtrToAddr.
 
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.
 
ap_match< APInt > m_APInt(const APInt *&Res)
Match a ConstantInt or splatted ConstantVector, binding the specified pointer to the contained APInt.
 
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)
 
ap_match< APInt > m_APIntAllowPoison(const APInt *&Res)
Match APInt while allowing poison in splat vector constants.
 
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.
 
ap_match< APFloat > m_APFloat(const APFloat *&Res)
Match a ConstantFP or splatted ConstantVector, binding the specified pointer to the contained APFloat...
 
ap_match< APFloat > m_APFloatAllowPoison(const APFloat *&Res)
Match APFloat while allowing poison in splat vector constants.
 
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.
 
IntrinsicID_match m_Intrinsic()
Match intrinsic calls like this: m_Intrinsic<Intrinsic::fabs>(m_Value(X))
 
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.
 
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)
 
match_immconstant_ty m_ImmConstant()
Match an arbitrary immediate Constant and ignore it.
 
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.
 
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)
 
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)
 
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< 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.
 
MatchFunctor< Val, Pattern > match_fn(const Pattern &P)
A match functor that can be used as a UnaryPredicate in functional algorithms like all_of.
 
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.
 
LLVM_ABI Intrinsic::ID getInverseMinMaxIntrinsic(Intrinsic::ID MinMaxID)
 
LLVM_ABI 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.
 
LLVM_ABI KnownFPClass computeKnownFPClass(const Value *V, const APInt &DemandedElts, FPClassTest InterestedClasses, const SimplifyQuery &SQ, unsigned Depth=0)
Determine which floating-point classes are valid for V, and return them in KnownFPClass bit sets.
 
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
 
LLVM_ABI 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.
 
LLVM_ABI 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.
 
LLVM_ABI 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,...
 
LLVM_ABI bool canCreatePoison(const Operator *Op, bool ConsiderFlagsAndMetadata=true)
 
LLVM_ABI Constant * ConstantFoldSelectInstruction(Constant *Cond, Constant *V1, Constant *V2)
Attempt to constant fold a select instruction with the specified operands.
 
LLVM_ABI Value * simplifyFreezeInst(Value *Op, const SimplifyQuery &Q)
Given an operand for a Freeze, see if we can fold the result.
 
LLVM_ABI 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,...
 
LLVM_ABI 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.
 
LLVM_ABI bool canConstantFoldCallTo(const CallBase *Call, const Function *F)
canConstantFoldCallTo - Return true if its even possible to fold a call to the specified function.
 
LLVM_ABI APInt getMinMaxLimit(SelectPatternFlavor SPF, unsigned BitWidth)
Return the minimum or maximum constant value for the specified integer min/max flavor and type.
 
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
 
LLVM_ABI Value * simplifySDivInst(Value *LHS, Value *RHS, bool IsExact, const SimplifyQuery &Q)
Given operands for an SDiv, fold the result or return null.
 
FunctionAddr VTableAddr uintptr_t uintptr_t Int32Ty
 
LLVM_ABI 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...
 
LLVM_ABI Value * simplifyMulInst(Value *LHS, Value *RHS, bool IsNSW, bool IsNUW, const SimplifyQuery &Q)
Given operands for a Mul, fold the result or return null.
 
LLVM_ABI 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.
 
LLVM_ABI Value * simplifyInstructionWithOperands(Instruction *I, ArrayRef< Value * > NewOps, const SimplifyQuery &Q)
Like simplifyInstruction but the operands of I are replaced with NewOps.
 
LLVM_ABI Value * simplifyCall(CallBase *Call, Value *Callee, ArrayRef< Value * > Args, const SimplifyQuery &Q)
Given a callsite, callee, and arguments, fold the result or return null.
 
LLVM_ABI 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 canRoundingModeBe(RoundingMode RM, RoundingMode QRM)
Returns true if the rounding mode RM may be QRM at compile time or at run time.
 
LLVM_ABI bool isNoAliasCall(const Value *V)
Return true if this pointer is returned by a noalias function.
 
LLVM_ABI Value * simplifyFCmpInst(CmpPredicate Predicate, Value *LHS, Value *RHS, FastMathFlags FMF, const SimplifyQuery &Q)
Given operands for an FCmpInst, fold the result or return null.
 
LLVM_ABI Value * getSplatValue(const Value *V)
Get splat value if the input is a splat vector or return nullptr.
 
LLVM_ABI Constant * ConstantFoldGetElementPtr(Type *Ty, Constant *C, std::optional< ConstantRange > InRange, ArrayRef< Value * > Idxs)
 
LLVM_ABI CmpInst::Predicate getMinMaxPred(SelectPatternFlavor SPF, bool Ordered=false)
Return the canonical comparison predicate for the specified minimum/maximum flavor.
 
LLVM_ABI 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.
 
LLVM_ABI 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...
 
LLVM_ABI Value * simplifyOrInst(Value *LHS, Value *RHS, const SimplifyQuery &Q)
Given operands for an Or, fold the result or return null.
 
LLVM_ABI Value * simplifyXorInst(Value *LHS, Value *RHS, const SimplifyQuery &Q)
Given operands for an Xor, fold the result or return null.
 
LLVM_ABI ConstantRange getConstantRangeFromMetadata(const MDNode &RangeMD)
Parse out a conservative ConstantRange from !range metadata.
 
LLVM_ABI 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.
 
LLVM_ABI Constant * ConstantFoldExtractValueInstruction(Constant *Agg, ArrayRef< unsigned > Idxs)
Attempt to constant fold an extractvalue instruction with the specified operands and indices.
 
LLVM_ABI 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,...
 
LLVM_ABI bool MaskedValueIsZero(const Value *V, const APInt &Mask, const SimplifyQuery &SQ, unsigned Depth=0)
Return true if 'V & Mask' is known to be zero.
 
LLVM_ABI Value * simplifyCastInst(unsigned CastOpc, Value *Op, Type *Ty, const SimplifyQuery &Q)
Given operands for a CastInst, fold the result or return null.
 
LLVM_ABI Value * simplifyInstruction(Instruction *I, const SimplifyQuery &Q)
See if we can compute a simplified version of this instruction.
 
unsigned M1(unsigned Val)
 
LLVM_ABI Value * simplifySubInst(Value *LHS, Value *RHS, bool IsNSW, bool IsNUW, const SimplifyQuery &Q)
Given operands for a Sub, fold the result or return null.
 
LLVM_ABI Value * simplifyAddInst(Value *LHS, Value *RHS, bool IsNSW, bool IsNUW, const SimplifyQuery &Q)
Given operands for an Add, fold the result or return null.
 
LLVM_ABI Constant * ConstantFoldConstant(const Constant *C, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr)
ConstantFoldConstant - Fold the constant using the specified DataLayout.
 
auto dyn_cast_or_null(const Y &Val)
 
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.
 
LLVM_ABI 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.
 
LLVM_ABI 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...
 
LLVM_ABI 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...
 
LLVM_ABI SelectPatternFlavor getInverseMinMaxFlavor(SelectPatternFlavor SPF)
Return the inverse minimum/maximum flavor of the specified flavor.
 
LLVM_ABI 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.
 
LLVM_ABI 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.
 
LLVM_ABI Value * simplifyShlInst(Value *Op0, Value *Op1, bool IsNSW, bool IsNUW, const SimplifyQuery &Q)
Given operands for a Shl, fold the result or return null.
 
LLVM_ABI Value * simplifyFNegInst(Value *Op, FastMathFlags FMF, const SimplifyQuery &Q)
Given operand for an FNeg, fold the result or return null.
 
LLVM_ABI 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.
 
LLVM_ABI 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...
 
LLVM_ABI bool impliesPoison(const Value *ValAssumedPoison, const Value *V)
Return true if V is poison given that ValAssumedPoison is already poison.
 
LLVM_ABI 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.
 
LLVM_ABI 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.
 
LLVM_ABI void computeKnownBits(const Value *V, KnownBits &Known, const DataLayout &DL, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true, unsigned Depth=0)
Determine which bits of V are known to be either zero or one and return them in the KnownZero/KnownOn...
 
LLVM_ABI Value * simplifyLShrInst(Value *Op0, Value *Op1, bool IsExact, const SimplifyQuery &Q)
Given operands for a LShr, fold the result or return null.
 
LLVM_ABI bool NullPointerIsDefined(const Function *F, unsigned AS=0)
Check whether null pointer dereferencing is considered undefined behavior for a given function or an ...
 
LLVM_ABI bool cannotBeNegativeZero(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Return true if we can prove that the specified FP value is never equal to -0.0.
 
LLVM_ABI Value * simplifyICmpInst(CmpPredicate Pred, Value *LHS, Value *RHS, const SimplifyQuery &Q)
Given operands for an ICmpInst, fold the result or return null.
 
LLVM_ABI 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...
 
LLVM_ABI Constant * ConstantFoldCastOperand(unsigned Opcode, Constant *C, Type *DestTy, const DataLayout &DL)
Attempt to constant fold a cast with the specified operand.
 
LLVM_ABI Value * simplifyAndInst(Value *LHS, Value *RHS, const SimplifyQuery &Q)
Given operands for an And, fold the result or return null.
 
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
 
LLVM_ABI bool intrinsicPropagatesPoison(Intrinsic::ID IID)
Return whether this intrinsic propagates poison for all operands.
 
LLVM_ABI Value * simplifyExtractValueInst(Value *Agg, ArrayRef< unsigned > Idxs, const SimplifyQuery &Q)
Given operands for an ExtractValueInst, fold the result or return null.
 
LLVM_ABI bool isNotCrossLaneOperation(const Instruction *I)
Return true if the instruction doesn't potentially cross vector lanes.
 
LLVM_ABI Value * simplifyInsertValueInst(Value *Agg, Value *Val, ArrayRef< unsigned > Idxs, const SimplifyQuery &Q)
Given operands for an InsertValueInst, fold the result or return null.
 
LLVM_ABI Constant * ConstantFoldBinaryOpOperands(unsigned Opcode, Constant *LHS, Constant *RHS, const DataLayout &DL)
Attempt to constant fold a binary operation with the specified operands.
 
LLVM_ABI 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.
 
LLVM_ABI 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
 
LLVM_ABI Value * simplifyLoadInst(LoadInst *LI, Value *PtrOp, const SimplifyQuery &Q)
Given a load instruction and its pointer operand, fold the result or return null.
 
LLVM_ABI 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.
 
LLVM_ABI SelectPatternResult matchDecomposedSelectPattern(CmpInst *CmpI, Value *TrueVal, Value *FalseVal, Value *&LHS, Value *&RHS, FastMathFlags FMF=FastMathFlags(), 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...
 
LLVM_ABI Value * simplifyConstrainedFPCall(CallBase *Call, const SimplifyQuery &Q)
Given a constrained FP intrinsic call, tries to compute its simplified version.
 
LLVM_ABI Value * simplifyBinOp(unsigned Opcode, Value *LHS, Value *RHS, const SimplifyQuery &Q)
Given operands for a BinaryOperator, fold the result or return null.
 
std::optional< DecomposedBitTest > decomposeBitTest(Value *Cond, bool LookThroughTrunc=true, bool AllowNonZeroC=false, bool DecomposeAnd=false)
Decompose an icmp into the form ((X & Mask) pred C) if possible.
 
LLVM_ABI Value * findScalarElement(Value *V, unsigned EltNo)
Given a vector and an element number, see if the scalar value is already around as a register,...
 
LLVM_ABI 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.
 
LLVM_ABI 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
 
LLVM_ABI bool PointerMayBeCaptured(const Value *V, bool ReturnCaptures, unsigned MaxUsesToExplore=0)
PointerMayBeCaptured - Return true if this pointer value may be captured by the enclosing function (w...
 
LLVM_ABI 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.
 
@ NearestTiesToEven
roundTiesToEven.
 
@ TowardNegative
roundTowardNegative.
 
LLVM_ABI 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)
 
LLVM_ABI unsigned ComputeNumSignBits(const Value *Op, const DataLayout &DL, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true, unsigned Depth=0)
Return the number of times the sign bit of the register is replicated into the other bits.
 
LLVM_ABI 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
 
LLVM_ABI 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.
 
LLVM_ABI 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 ...
 
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
 
LLVM_ABI Value * simplifySRemInst(Value *LHS, Value *RHS, const SimplifyQuery &Q)
Given operands for an SRem, fold the result or return null.
 
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
 
bool all_equal(std::initializer_list< T > Values)
Returns true if all Values in the initializer lists are equal or the list.
 
LLVM_ABI Constant * ConstantFoldInsertValueInstruction(Constant *Agg, Constant *Val, ArrayRef< unsigned > Idxs)
Attempt to constant fold an insertvalue instruction with the specified operands and indices.
 
LLVM_ABI 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...
 
LLVM_ABI bool isKnownToBeAPowerOfTwo(const Value *V, const DataLayout &DL, bool OrZero=false, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true, unsigned Depth=0)
Return true if the given value is known to have exactly one bit set when defined.
 
LLVM_ABI 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...
 
LLVM_ABI Value * simplifyCmpInst(CmpPredicate Predicate, Value *LHS, Value *RHS, const SimplifyQuery &Q)
Given operands for a CmpInst, fold the result or return null.
 
LLVM_ABI 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.
 
LLVM_ABI Constant * ConstantFoldInstOperands(const 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.
 
LLVM_ABI bool isKnownNegation(const Value *X, const Value *Y, bool NeedNSW=false, bool AllowPoison=true)
Return true if the two given values are negation.
 
LLVM_ABI const Value * getUnderlyingObject(const Value *V, unsigned MaxLookup=MaxLookupSearchDepth)
This method strips off any GEP address adjustments, pointer casts or llvm.threadlocal....
 
LLVM_ABI 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...
 
LLVM_ABI const SimplifyQuery getBestSimplifyQuery(Pass &, Function &)
 
std::pair< Value *, FPClassTest > fcmpToClassTest(FCmpInst::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...
 
LLVM_ABI void getUnderlyingObjects(const Value *V, SmallVectorImpl< const Value * > &Objects, const LoopInfo *LI=nullptr, unsigned MaxLookup=MaxLookupSearchDepth)
This method is similar to getUnderlyingObject except that it can look through phi and select instruct...
 
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.
 
LLVM_ABI Value * simplifyURemInst(Value *LHS, Value *RHS, const SimplifyQuery &Q)
Given operands for a URem, fold the result or return null.
 
LLVM_ABI Value * simplifyExtractElementInst(Value *Vec, Value *Idx, const SimplifyQuery &Q)
Given operands for an ExtractElementInst, fold the result or return null.
 
LLVM_ABI Value * simplifySelectInst(Value *Cond, Value *TrueVal, Value *FalseVal, const SimplifyQuery &Q)
Given operands for a SelectInst, fold the result or return null.
 
constexpr detail::IsaCheckPredicate< Types... > IsaPred
Function object wrapper for the llvm::isa type check.
 
LLVM_ABI 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.
 
LLVM_ABI std::optional< bool > computeKnownFPSignBit(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Return false if we can prove that the specified FP value's sign bit is 0.
 
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 Action captured(const Use *U, UseCaptureInfo CI)=0
Use U directly captures CI.UseCC and additionally CI.ResultCC through the return value of the user of...
 
virtual void tooManyUses()=0
tooManyUses - The depth of traversal has breached a limit.
 
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 LLVM_ABI 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.
 
@ Min
Evaluate all branches of an unknown condition.
 
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
 
LLVM_ABI bool isUndefValue(Value *V) const
If CanUseUndef is true, returns whether V is undef.
 
const TargetLibraryInfo * TLI
 
SimplifyQuery getWithoutUndef() const
 
Capture information for a specific Use.