28#ifndef LLVM_IR_PATTERNMATCH_H
29#define LLVM_IR_PATTERNMATCH_H
53template <
typename Val,
typename Pattern>
bool match(Val *V,
const Pattern &
P) {
59template <
typename Val = const Value,
typename Pattern>
73 template <
typename OpTy>
bool match(OpTy *V)
const {
88 template <
typename OpTy>
bool match(OpTy *V)
const {
158 return checkAggregate(CA);
161 template <
typename ITy>
bool match(ITy *V)
const {
return check(V); }
188 template <
typename ITy>
bool match(ITy *V)
const {
190 return C &&
C->containsMatchingVectorElement(
198template <
typename SPTy>
215 template <
typename OpTy>
bool match(OpTy *V)
const {
217 auto *
Splat =
C->getSplatValue();
240 template <
typename ITy>
bool match(ITy *V)
const {
return !
M.match(V); }
249 static_assert(std::is_same_v<APTy, APInt> || std::is_same_v<APTy, APFloat>);
259 template <
typename ITy>
bool match(ITy *V)
const {
261 Res = &CI->getValue();
264 if (V->getType()->isVectorTy())
268 Res = &CI->getValue();
310 template <
typename ITy>
bool match(ITy *V)
const {
312 const APInt &CIV = CI->getValue();
314 return CIV ==
static_cast<uint64_t>(Val);
333template <
typename Predicate,
typename ConstantVal,
bool AllowPoison>
336 bool matchVector(
const Value *V)
const {
339 return this->isValue(CV->getValue());
347 unsigned NumElts = FVTy->getNumElements();
348 assert(NumElts != 0 &&
"Constant vector with no elements?");
349 bool HasNonPoisonElements =
false;
350 for (
unsigned i = 0; i != NumElts; ++i) {
351 Constant *Elt =
C->getAggregateElement(i);
357 if (!CV || !this->isValue(CV->getValue()))
359 HasNonPoisonElements =
true;
361 return HasNonPoisonElements;
370 return this->isValue(CV->getValue());
372 return matchVector(V);
376 template <
typename ITy>
bool match(ITy *V)
const {
387template <
typename Predicate,
bool AllowPoison = true>
391template <
typename Predicate>
397template <
typename Predicate>
struct api_pred_ty :
public Predicate {
402 template <
typename ITy>
bool match(ITy *V)
const {
404 if (this->isValue(CI->getValue())) {
405 Res = &CI->getValue();
408 if (V->getType()->isVectorTy())
411 C->getSplatValue(
true)))
412 if (this->isValue(CI->getValue())) {
413 Res = &CI->getValue();
424template <
typename Predicate>
struct apf_pred_ty :
public Predicate {
429 template <
typename ITy>
bool match(ITy *V)
const {
431 if (this->isValue(CI->getValue())) {
432 Res = &CI->getValue();
435 if (V->getType()->isVectorTy())
438 C->getSplatValue(
true)))
439 if (this->isValue(CI->getValue())) {
440 Res = &CI->getValue();
599 template <
typename ITy>
bool match(ITy *V)
const {
729 return C.isInfinity() && IsNegative ==
C.isNegative();
814 return !
C.isDenormal() &&
C.isNonZero();
836template <
typename Pattern>
848template <
typename Pattern>
852template <
typename Pattern>
910 if (CV->getType()->isVectorTy()) {
911 if (
auto *
Splat = CV->getSplatValue(
true)) {
934 template <
typename ITy>
bool match(ITy *V)
const {
954 template <
typename ITy>
bool match(ITy *V)
const {
return V ==
Val; }
978 template <
typename ITy>
bool match(ITy *V)
const {
980 return CFP->isExactlyValue(
Val);
981 if (V->getType()->isVectorTy())
984 return CFP->isExactlyValue(
Val);
1001 template <
typename ITy>
bool match(ITy *V)
const {
1002 const APInt *ConstInt;
1005 std::optional<uint64_t> ZExtVal = ConstInt->
tryZExtValue();
1020 template <
typename ITy>
bool match(ITy *V)
const {
1022 if (!CI && V->getType()->isVectorTy())
1035 template <
typename ITy>
bool match(ITy *V)
const {
1037 if (!CI && V->getType()->isVectorTy())
1041 return CI && CI->getValue() ==
Val;
1073 template <
typename ITy>
bool match(ITy *V)
const {
1075 return BB && BB ==
Val;
1096template <
typename LHS_t,
typename RHS_t,
bool Commutable = false>
1105 template <
typename OpTy>
bool match(OpTy *V)
const {
1107 return (
L.match(
I->getOperand(0)) &&
R.match(
I->getOperand(1))) ||
1108 (Commutable &&
L.match(
I->getOperand(1)) &&
1109 R.match(
I->getOperand(0)));
1114template <
typename LHS,
typename RHS>
1128 template <
typename OpTy>
bool match(OpTy *V)
const {
1130 return X.match(
I->getOperand(0));
1143template <
typename LHS_t,
typename RHS_t,
unsigned Opcode,
1144 bool Commutable =
false>
1153 template <
typename OpTy>
inline bool match(
unsigned Opc, OpTy *V)
const {
1154 if (V->getValueID() == Value::InstructionVal +
Opc) {
1156 return (
L.match(
I->getOperand(0)) &&
R.match(
I->getOperand(1))) ||
1157 (Commutable &&
L.match(
I->getOperand(1)) &&
1158 R.match(
I->getOperand(0)));
1163 template <
typename OpTy>
bool match(OpTy *V)
const {
1164 return match(Opcode, V);
1168template <
typename LHS,
typename RHS>
1174template <
typename LHS,
typename RHS>
1180template <
typename LHS,
typename RHS>
1186template <
typename LHS,
typename RHS>
1196 template <
typename OpTy>
bool match(OpTy *V)
const {
1201 if (FPMO->getOpcode() == Instruction::FNeg)
1202 return X.match(FPMO->getOperand(0));
1204 if (FPMO->getOpcode() == Instruction::FSub) {
1205 if (FPMO->hasNoSignedZeros()) {
1215 return X.match(FPMO->getOperand(1));
1228template <
typename RHS>
1234template <
typename LHS,
typename RHS>
1240template <
typename LHS,
typename RHS>
1246template <
typename LHS,
typename RHS>
1252template <
typename LHS,
typename RHS>
1258template <
typename LHS,
typename RHS>
1264template <
typename LHS,
typename RHS>
1270template <
typename LHS,
typename RHS>
1276template <
typename LHS,
typename RHS>
1282template <
typename LHS,
typename RHS>
1288template <
typename LHS,
typename RHS>
1294template <
typename LHS,
typename RHS>
1300template <
typename LHS,
typename RHS>
1306template <
typename LHS,
typename RHS>
1312template <
typename LHS,
typename RHS>
1324 template <
typename OpTy>
bool match(OpTy *V)
const {
1326 if (
Op->getOpcode() == Opcode)
1328 L.match(
Op->getOperand(0));
1337template <
typename LHS>
1344template <
typename LHS>
1351template <
typename LHS>
1357template <
typename LHS_t,
typename RHS_t,
unsigned Opcode,
1358 unsigned WrapFlags = 0,
bool Commutable =
false>
1366 template <
typename OpTy>
bool match(OpTy *V)
const {
1368 if (
Op->getOpcode() != Opcode)
1371 !
Op->hasNoUnsignedWrap())
1374 !
Op->hasNoSignedWrap())
1376 return (
L.match(
Op->getOperand(0)) &&
R.match(
Op->getOperand(1))) ||
1377 (Commutable &&
L.match(
Op->getOperand(1)) &&
1378 R.match(
Op->getOperand(0)));
1384template <
typename LHS,
typename RHS>
1392template <
typename LHS,
typename RHS>
1400template <
typename LHS,
typename RHS>
1408template <
typename LHS,
typename RHS>
1416template <
typename LHS,
typename RHS>
1425template <
typename LHS,
typename RHS>
1434template <
typename LHS,
typename RHS>
1443template <
typename LHS,
typename RHS>
1451template <
typename LHS,
typename RHS>
1459template <
typename LHS,
typename RHS>
1468template <
typename LHS_t,
typename RHS_t,
bool Commutable = false>
1476 template <
typename OpTy>
bool match(OpTy *V)
const {
1482template <
typename LHS,
typename RHS>
1488template <
typename LHS,
typename RHS,
bool Commutable = false>
1495 template <
typename OpTy>
bool match(OpTy *V)
const {
1497 assert(PDI->getOpcode() == Instruction::Or &&
"Only or can be disjoint");
1498 if (!PDI->isDisjoint())
1500 return (
L.match(PDI->getOperand(0)) &&
R.match(PDI->getOperand(1))) ||
1501 (Commutable &&
L.match(PDI->getOperand(1)) &&
1502 R.match(PDI->getOperand(0)));
1508template <
typename LHS,
typename RHS>
1513template <
typename LHS,
typename RHS>
1520template <
typename LHS,
typename RHS>
1528template <
typename LHS,
typename RHS>
1538template <
typename LHS,
typename RHS>
1547template <
typename LHS,
typename RHS>
1554 template <
typename OpTy>
bool match(OpTy *V)
const {
1556 if (
Op->getOpcode() == Instruction::Sub &&
Op->hasNoUnsignedWrap() &&
1559 else if (
Op->getOpcode() != Instruction::Xor)
1561 return (
L.match(
Op->getOperand(0)) &&
R.match(
Op->getOperand(1))) ||
1562 (
L.match(
Op->getOperand(1)) &&
R.match(
Op->getOperand(0)));
1570template <
typename LHS,
typename RHS>
1578template <
typename LHS_t,
typename RHS_t,
typename Predicate,
1579 bool Commutable =
false>
1586 template <
typename OpTy>
bool match(OpTy *V)
const {
1588 return this->isOpType(
I->getOpcode()) &&
1589 ((
L.match(
I->getOperand(0)) &&
R.match(
I->getOperand(1))) ||
1590 (Commutable &&
L.match(
I->getOperand(1)) &&
1591 R.match(
I->getOperand(0))));
1602 return Opcode == Instruction::LShr || Opcode == Instruction::AShr;
1608 return Opcode == Instruction::LShr || Opcode == Instruction::Shl;
1620 return Opcode == Instruction::SDiv || Opcode == Instruction::UDiv;
1626 return Opcode == Instruction::SRem || Opcode == Instruction::URem;
1631template <
typename LHS,
typename RHS>
1638template <
typename LHS,
typename RHS>
1645template <
typename LHS,
typename RHS>
1652template <
typename LHS,
typename RHS>
1659template <
typename LHS,
typename RHS>
1666template <
typename LHS,
typename RHS>
1673template <
typename LHS,
typename RHS>
1687 template <
typename OpTy>
bool match(OpTy *V)
const {
1689 return PEO->isExact() &&
SubPattern.match(V);
1702template <
typename LHS_t,
typename RHS_t,
typename Class,
1703 bool Commutable =
false>
1716 template <
typename OpTy>
bool match(OpTy *V)
const {
1718 if (
L.match(
I->getOperand(0)) &&
R.match(
I->getOperand(1))) {
1723 if (Commutable &&
L.match(
I->getOperand(1)) &&
1724 R.match(
I->getOperand(0))) {
1734template <
typename LHS,
typename RHS>
1740template <
typename LHS,
typename RHS>
1742 const LHS &L,
const RHS &R) {
1746template <
typename LHS,
typename RHS>
1748 const LHS &L,
const RHS &R) {
1752template <
typename LHS,
typename RHS>
1757template <
typename LHS,
typename RHS>
1762template <
typename LHS,
typename RHS>
1769template <
typename LHS_t,
typename RHS_t,
typename Class,
1770 bool Commutable =
false>
1779 template <
typename OpTy>
bool match(OpTy *V)
const {
1782 L.match(
I->getOperand(0)) &&
R.match(
I->getOperand(1)))
1784 if constexpr (Commutable) {
1787 L.match(
I->getOperand(1)) &&
R.match(
I->getOperand(0)))
1796template <
typename LHS,
typename RHS>
1802template <
typename LHS,
typename RHS>
1808template <
typename LHS,
typename RHS>
1814template <
typename LHS,
typename RHS>
1830 template <
typename OpTy>
bool match(OpTy *V)
const {
1831 if (V->getValueID() == Value::InstructionVal + Opcode) {
1833 return Op1.match(
I->getOperand(0));
1846 template <
typename OpTy>
bool match(OpTy *V)
const {
1847 if (V->getValueID() == Value::InstructionVal + Opcode) {
1849 return Op1.match(
I->getOperand(0)) &&
Op2.match(
I->getOperand(1));
1856template <
typename T0,
typename T1,
typename T2,
unsigned Opcode,
1857 bool CommutableOp2Op3 =
false>
1866 template <
typename OpTy>
bool match(OpTy *V)
const {
1867 if (V->getValueID() == Value::InstructionVal + Opcode) {
1869 if (!
Op1.match(
I->getOperand(0)))
1871 if (
Op2.match(
I->getOperand(1)) &&
Op3.match(
I->getOperand(2)))
1873 return CommutableOp2Op3 &&
Op2.match(
I->getOperand(2)) &&
1874 Op3.match(
I->getOperand(1));
1890 template <
int Idx,
int Last>
1891 std::enable_if_t<Idx != Last, bool>
1896 template <
int Idx,
int Last>
1897 std::enable_if_t<Idx == Last, bool>
1899 return std::get<Idx>(
Operands).match(
I->getOperand(Idx));
1902 template <
typename OpTy>
bool match(OpTy *V)
const {
1903 if (V->getValueID() == Value::InstructionVal + Opcode) {
1905 return I->getNumOperands() ==
sizeof...(OperandTypes) &&
1913template <
typename Cond,
typename LHS,
typename RHS>
1921template <
int64_t L,
int64_t R,
typename Cond>
1923 Instruction::Select>
1929template <
typename LHS,
typename RHS>
1937template <
typename OpTy>
1943template <
typename Val_t,
typename Elt_t,
typename Idx_t>
1951template <
typename Val_t,
typename Idx_t>
1966 template <
typename OpTy>
bool match(OpTy *V)
const {
1968 return Op1.match(
I->getOperand(0)) &&
Op2.match(
I->getOperand(1)) &&
1969 Mask.match(
I->getShuffleMask());
1986 return all_of(Mask, [](
int Elem) {
return Elem == 0 || Elem == -1; });
2004 const auto *
First =
find_if(Mask, [](
int Elem) {
return Elem != -1; });
2005 if (
First == Mask.end())
2009 [
First](
int Elem) {
return Elem == *
First || Elem == -1; });
2020 template <
typename OpTy>
bool match(OpTy *V)
const {
2022 return GEP &&
GEP->getSourceElementType()->isIntegerTy(8) &&
2029template <
typename V1_t,
typename V2_t>
2035template <
typename V1_t,
typename V2_t,
typename Mask_t>
2042template <
typename OpTy>
2048template <
typename ValueOpTy,
typename Po
interOpTy>
2050m_Store(
const ValueOpTy &ValueOp,
const PointerOpTy &PointerOp) {
2056template <
typename... OperandTypes>
2058 return AnyOps_match<Instruction::GetElementPtr, OperandTypes...>(
Ops...);
2062template <
typename Po
interOpTy,
typename OffsetOpTy>
2077 template <
typename OpTy>
bool match(OpTy *V)
const {
2079 return O->getOpcode() == Opcode &&
Op.match(O->getOperand(0));
2089 template <
typename OpTy>
bool match(OpTy *V)
const {
2091 return Op.match(
I->getOperand(0));
2103 template <
typename OpTy>
bool match(OpTy *V)
const {
2105 return O->getOpcode() == Instruction::PtrToInt &&
2106 DL.getTypeSizeInBits(O->getType()) ==
2107 DL.getTypeSizeInBits(O->getOperand(0)->getType()) &&
2108 Op.match(O->getOperand(0));
2118 template <
typename OpTy>
bool match(OpTy *V)
const {
2120 return I->hasNonNeg() &&
Op.match(
I->getOperand(0));
2130 template <
typename OpTy>
bool match(OpTy *V)
const {
2132 return (
I->getNoWrapKind() & WrapFlags) == WrapFlags &&
2133 Op.match(
I->getOperand(0));
2139template <
typename OpTy>
2150 template <
typename OpTy>
bool match(OpTy *V)
const {
2154 Type *SrcType =
I->getSrcTy();
2155 Type *DstType =
I->getType();
2158 if (SrcType->isVectorTy() != DstType->isVectorTy())
2161 SrcVecTy && SrcVecTy->getElementCount() !=
2164 return Op.match(
I->getOperand(0));
2168template <
typename OpTy>
2174template <
typename OpTy>
2180template <
typename OpTy>
2187template <
typename OpTy>
2199template <
typename OpTy>
2206template <
typename OpTy>
2213template <
typename OpTy>
2219template <
typename OpTy>
2226template <
typename OpTy>
2232template <
typename OpTy>
2239template <
typename OpTy>
2245template <
typename OpTy>
2250template <
typename OpTy>
2255template <
typename OpTy>
2261template <
typename OpTy>
2268template <
typename OpTy>
2274template <
typename OpTy>
2281template <
typename OpTy>
2301 template <
typename OpTy>
bool match(OpTy *V)
const {
2306 if (V->getType()->isIntOrIntVectorTy(1) &&
2316template <
typename LHS,
typename RHS>
2330 template <
typename OpTy>
bool match(OpTy *V)
const {
2335 Type *Ty = V->getType();
2336 Value *CondV =
nullptr;
2341 TrueC.match(ConstantInt::get(Ty, 1)) &&
2342 FalseC.match(ConstantInt::get(Ty, 0)))
2349 FalseC.match(ConstantInt::get(Ty, 0)))
2364template <
typename CondTy,
typename LTy,
typename RTy>
2370template <
typename OpTy>
2375template <
typename OpTy>
2380template <
typename OpTy>
2387template <
typename OpTy>
2392template <
typename OpTy>
2397template <
typename OpTy>
2404template <
typename OpTy>
2409template <
typename OpTy>
2423 template <
typename OpTy>
bool match(OpTy *V)
const {
2425 Succ = BI->getSuccessor();
2434template <
typename Cond_t,
typename TrueBlock_t,
typename FalseBlock_t>
2440 brc_match(
const Cond_t &
C,
const TrueBlock_t &t,
const FalseBlock_t &f)
2443 template <
typename OpTy>
bool match(OpTy *V)
const {
2445 if (
Cond.match(BI->getCondition()))
2446 return T.match(BI->getSuccessor(0)) &&
F.match(BI->getSuccessor(1));
2451template <
typename Cond_t>
2458template <
typename Cond_t,
typename TrueBlock_t,
typename FalseBlock_t>
2460m_Br(
const Cond_t &
C,
const TrueBlock_t &
T,
const FalseBlock_t &
F) {
2468template <
typename LHS_t,
typename RHS_t,
typename Pred_t>
2478 template <
typename OpTy>
bool match(OpTy *V)
const {
2488 auto *TrueVal =
SI->getTrueValue();
2489 auto *FalseVal =
SI->getFalseValue();
2490 auto *LHS = Cmp->getOperand(0);
2491 auto *RHS = Cmp->getOperand(1);
2492 if ((TrueVal != LHS || FalseVal != RHS) &&
2493 (TrueVal != RHS || FalseVal != LHS))
2496 LHS == TrueVal ? Cmp->getPredicate() : Cmp->getInversePredicate();
2498 if (!Pred_t::match(Pred))
2501 return L.match(LHS) &&
R.match(RHS);
2542template <
typename LHS,
typename RHS>
2557template <
typename LHS,
typename RHS>
2572template <
typename LHS,
typename RHS>
2587template <
typename LHS,
typename RHS>
2598template <
typename LHS,
typename RHS>
2611template <
typename LHS,
typename RHS>
2622template <
typename ValTy>
2628template <
typename ValTy>
2640template <
typename LHS_t,
typename RHS_t,
typename Sum_t>
2649 template <
typename OpTy>
bool match(OpTy *V)
const {
2650 Value *ICmpLHS, *ICmpRHS;
2655 Value *AddLHS, *AddRHS;
2660 if (AddExpr.match(ICmpLHS) && (ICmpRHS == AddLHS || ICmpRHS == AddRHS))
2661 return L.match(AddLHS) &&
R.match(AddRHS) &&
S.match(ICmpLHS);
2665 if (AddExpr.match(ICmpRHS) && (ICmpLHS == AddLHS || ICmpLHS == AddRHS))
2666 return L.match(AddLHS) &&
R.match(AddRHS) &&
S.match(ICmpRHS);
2672 if (XorExpr.match(ICmpLHS))
2673 return L.match(Op1) &&
R.match(ICmpRHS) &&
S.match(ICmpLHS);
2677 if (XorExpr.match(ICmpRHS))
2678 return L.match(Op1) &&
R.match(ICmpLHS) &&
S.match(ICmpRHS);
2687 return L.match(AddLHS) &&
R.match(AddRHS) &&
S.match(ICmpLHS);
2692 return L.match(AddLHS) &&
R.match(AddRHS) &&
S.match(ICmpRHS);
2703template <
typename LHS_t,
typename RHS_t,
typename Sum_t>
2715 template <
typename OpTy>
bool match(OpTy *V)
const {
2718 return Val.match(CI->getArgOperand(
OpI));
2724template <
unsigned OpI,
typename Opnd_t>
2735 template <
typename OpTy>
bool match(OpTy *V)
const {
2738 return F->getIntrinsicID() ==
ID;
2745 template <
typename OpTy>
bool match(OpTy *V)
const {
2749 return ((
ID == IntrIDs) || ...);
2759template <
typename T0 = void,
typename T1 = void,
typename T2 = void,
2760 typename T3 = void,
typename T4 = void,
typename T5 = void,
2761 typename T6 = void,
typename T7 = void,
typename T8 = void,
2762 typename T9 = void,
typename T10 =
void>
2771template <
typename T0,
typename T1,
typename T2>
2776template <
typename T0,
typename T1,
typename T2,
typename T3>
2782template <
typename T0,
typename T1,
typename T2,
typename T3,
typename T4>
2788template <
typename T0,
typename T1,
typename T2,
typename T3,
typename T4,
2811template <
typename Opnd0,
typename Opnd1,
typename Opnd2>
2818template <
typename Opnd0,
typename Opnd1,
typename Opnd2>
2825template <
typename Opnd0,
typename Opnd1,
typename Opnd2>
2831template <Intrinsic::ID IntrID,
typename T0>
2836template <Intrinsic::ID IntrID,
typename T0,
typename T1>
2842template <Intrinsic::ID IntrID,
typename T0,
typename T1,
typename T2>
2848template <
Intrinsic::ID IntrID,
typename T0,
typename T1,
typename T2,
2851m_Intrinsic(
const T0 &Op0,
const T1 &Op1,
const T2 &Op2,
const T3 &Op3) {
2855template <
Intrinsic::ID IntrID,
typename T0,
typename T1,
typename T2,
2856 typename T3,
typename T4>
2858m_Intrinsic(
const T0 &Op0,
const T1 &Op1,
const T2 &Op2,
const T3 &Op3,
2864template <
Intrinsic::ID IntrID,
typename T0,
typename T1,
typename T2,
2865 typename T3,
typename T4,
typename T5>
2867m_Intrinsic(
const T0 &Op0,
const T1 &Op1,
const T2 &Op2,
const T3 &Op3,
2868 const T4 &Op4,
const T5 &Op5) {
2874template <
typename Opnd0>
2879template <
typename Opnd0>
2883template <
typename Opnd0>
2888template <
typename Opnd0>
2893template <
typename Opnd0>
2898template <
typename Opnd0,
typename Opnd1>
2904template <
typename Opnd0,
typename Opnd1>
2910template <
typename Opnd0,
typename Opnd1>
2911inline auto m_SMax(
const Opnd0 &Op0,
const Opnd1 &Op1) {
2915template <
typename Opnd0,
typename Opnd1>
2916inline auto m_SMin(
const Opnd0 &Op0,
const Opnd1 &Op1) {
2920template <
typename Opnd0,
typename Opnd1>
2921inline auto m_UMax(
const Opnd0 &Op0,
const Opnd1 &Op1) {
2925template <
typename Opnd0,
typename Opnd1>
2926inline auto m_UMin(
const Opnd0 &Op0,
const Opnd1 &Op1) {
2930template <
typename Opnd0,
typename Opnd1>
2936template <
typename Opnd0,
typename Opnd1>
2942template <
typename Opnd0,
typename Opnd1>
2948template <
typename Opnd0,
typename Opnd1>
2954template <
typename Opnd0,
typename Opnd1>
2960template <
typename Opnd0,
typename Opnd1>
2966template <
typename Opnd0,
typename Opnd1>
2972template <
typename Opnd0,
typename Opnd1>
2979template <
typename Opnd0,
typename Opnd1>
2986template <
typename Opnd0,
typename Opnd1,
typename Opnd2>
2988m_FShl(
const Opnd0 &Op0,
const Opnd1 &Op1,
const Opnd2 &Op2) {
2992template <
typename Opnd0,
typename Opnd1,
typename Opnd2>
2994m_FShr(
const Opnd0 &Op0,
const Opnd1 &Op1,
const Opnd2 &Op2) {
2998template <
typename Opnd0>
3003template <
typename Opnd0,
typename Opnd1>
3009template <
typename Opnd0>
3014template <
typename Opnd0,
typename Opnd1,
typename Opnd2>
3025template <
typename LHS,
typename RHS>
3032template <
typename LHS,
typename RHS>
3038template <
typename LHS,
typename RHS>
3045template <
typename LHS,
typename RHS>
3052template <
typename LHS,
typename RHS>
3059template <
typename LHS,
typename RHS>
3066template <
typename LHS,
typename RHS>
3073template <
typename LHS,
typename RHS>
3080template <
typename LHS,
typename RHS>
3087template <
typename ValTy>
3094template <
typename ValTy>
3102template <Intrinsic::ID IntrID,
typename LHS,
typename RHS>
3109 template <
typename OpTy>
bool match(OpTy *V)
const {
3111 if (!
II ||
II->getIntrinsicID() != IntrID)
3113 return (
L.match(
II->getArgOperand(0)) &&
R.match(
II->getArgOperand(1))) ||
3114 (
L.match(
II->getArgOperand(1)) &&
R.match(
II->getArgOperand(0)));
3118template <Intrinsic::ID IntrID,
typename T0,
typename T1>
3125template <
typename LHS,
typename RHS>
3130template <
typename LHS,
typename RHS>
3135template <
typename LHS,
typename RHS>
3140template <
typename LHS,
typename RHS>
3145template <
typename LHS,
typename RHS>
3152template <
typename LHS,
typename RHS>
3159template <
typename LHS,
typename RHS>
3169 template <
typename OpTy>
bool match(OpTy *V)
const {
3170 unsigned TypeSize = V->getType()->getScalarSizeInBits();
3174 unsigned ShiftWidth =
TypeSize - 1;
3189 auto Signum =
m_c_Or(LHS, RHS);
3191 return Signum.match(V) &&
Val.match(
Op);
3209 template <
typename OpTy>
bool match(OpTy *V)
const {
3213 !(
I->getNumIndices() == 1 &&
I->getIndices()[0] == (
unsigned)Ind))
3215 return Val.match(
I->getAggregateOperand());
3223template <
int Ind,
typename Val_t>
3230template <
typename Val_t>
3242 template <
typename OpTy>
bool match(OpTy *V)
const {
3244 return Op0.match(
I->getOperand(0)) &&
Op1.match(
I->getOperand(1)) &&
3245 I->getNumIndices() == 1 && Ind ==
I->getIndices()[0];
3252template <
int Ind,
typename Val_t,
typename Elt_t>
3261template <
typename Opnd0,
typename Opnd1>
3267template <
typename Opnd>
3272template <
typename LHS,
typename RHS,
unsigned Opcode,
bool Commutable = false>
3279 template <
typename T>
bool match(
T *V)
const {
3281 if (!
I || !
I->getType()->isIntOrIntVectorTy(1))
3284 if (
I->getOpcode() == Opcode) {
3285 auto *Op0 =
I->getOperand(0);
3286 auto *Op1 =
I->getOperand(1);
3287 return (
L.match(Op0) &&
R.match(Op1)) ||
3288 (Commutable &&
L.match(Op1) &&
R.match(Op0));
3293 auto *TVal =
Select->getTrueValue();
3294 auto *FVal =
Select->getFalseValue();
3301 if (Opcode == Instruction::And) {
3303 if (
C &&
C->isNullValue())
3304 return (
L.match(
Cond) &&
R.match(TVal)) ||
3305 (Commutable &&
L.match(TVal) &&
R.match(
Cond));
3307 assert(Opcode == Instruction::Or);
3309 if (
C &&
C->isOneValue())
3310 return (
L.match(
Cond) &&
R.match(FVal)) ||
3311 (Commutable &&
L.match(FVal) &&
R.match(
Cond));
3321template <
typename LHS,
typename RHS>
3331template <
typename LHS,
typename RHS>
3339template <
typename LHS,
typename RHS>
3349template <
typename LHS,
typename RHS>
3358template <
typename LHS,
typename RHS,
bool Commutable = false>
3369template <
typename LHS,
typename RHS>
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
AMDGPU Register Bank Select
This file declares a class to represent arbitrary precision floating point values and provide a varie...
This file implements a class to represent arbitrary precision integral constant values and operations...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static constexpr unsigned long long mask(BlockVerifier::State S)
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
std::pair< Instruction::BinaryOps, Value * > OffsetOp
Find all possible pairs (BinOp, RHS) that BinOp V, RHS can be simplified.
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
MachineInstr unsigned OpIdx
uint64_t IntrinsicInst * II
const SmallVectorImpl< MachineOperand > & Cond
Class for arbitrary precision integers.
std::optional< uint64_t > tryZExtValue() const
Get zero extended value if possible.
static bool isSameValue(const APInt &I1, const APInt &I2, bool SignedCompare=false)
Determine if two APInts have the same value, after zero-extending or sign-extending (if SignedCompare...
Represent a constant reference to an array (0 or more elements consecutively in memory),...
LLVM Basic Block Representation.
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
@ 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_UGT
unsigned greater than
@ FCMP_ULT
1 1 0 0 True if unordered or less than
@ 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_UGE
1 0 1 1 True if unordered, greater than, or equal
An abstraction over a floating-point predicate, and a pack of an integer predicate with samesign info...
static LLVM_ABI std::optional< CmpPredicate > getMatching(CmpPredicate A, CmpPredicate B)
Compares two CmpPredicates taking samesign into account and returns the canonicalized CmpPredicate if...
static LLVM_ABI CmpPredicate get(const CmpInst *Cmp)
Do a ICmpInst::getCmpPredicate() or CmpInst::getPredicate(), as appropriate.
static LLVM_ABI CmpPredicate getSwapped(CmpPredicate P)
Get the swapped predicate of a CmpPredicate.
Base class for aggregate constants (with operands).
A constant value that is initialized with an expression using other constant values.
ConstantFP - Floating Point Values [float, double].
This is the shared class of boolean and integer constants.
This is an important base class in LLVM.
static LLVM_ABI Constant * getAllOnesValue(Type *Ty)
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
A parsed version of the target data layout string in and methods for querying it.
Convenience struct for specifying and reasoning about fast-math flags.
static LLVM_ABI bool compare(const APInt &LHS, const APInt &RHS, ICmpInst::Predicate Pred)
Return result of LHS Pred RHS comparison.
bool isBitwiseLogicOp() const
Return true if this is and/or/xor.
A wrapper class for inspecting calls to intrinsic functions.
The instances of the Type class are immutable: once they are created, they are never changed.
bool isIntOrIntVectorTy() const
Return true if this is an integer type or a vector of integer types.
'undef' values are things that do not have specified contents.
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
Base class of all SIMD vector types.
Represents an op.with.overflow intrinsic.
An efficient, type-erasing, non-owning reference to a callable.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
@ C
The default llvm calling convention, compatible with C.
match_isa< To... > m_Isa()
match_combine_or< Ty... > m_CombineOr(const Ty &...Ps)
Combine pattern matchers matching any of Ps patterns.
match_combine_and< Ty... > m_CombineAnd(const Ty &...Ps)
Combine pattern matchers matching all of Ps patterns.
TwoOps_match< ValueOpTy, PointerOpTy, Instruction::Store > m_Store(const ValueOpTy &ValueOp, const PointerOpTy &PointerOp)
Matches StoreInst.
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.
ShiftLike_match< LHS, Instruction::LShr > m_LShrOrSelf(const LHS &L, uint64_t &R)
Matches lshr L, ConstShAmt or L itself (R will be set to zero in this case).
AllowFmf_match< T, FastMathFlags::NoSignedZeros > m_NoSignedZeros(const T &SubPattern)
auto m_Cmp()
Matches any compare instruction and ignore it.
BinaryOp_match< cst_pred_ty< is_all_ones, false >, ValTy, Instruction::Xor, true > m_NotForbidPoison(const ValTy &V)
PtrToIntSameSize_match< OpTy > m_PtrToIntSameSize(const DataLayout &DL, const OpTy &Op)
BinaryOp_match< LHS, RHS, Instruction::Add > m_Add(const LHS &L, const RHS &R)
m_Intrinsic_Ty< Opnd0 >::Ty m_FCanonicalize(const Opnd0 &Op0)
CmpClass_match< LHS, RHS, FCmpInst > m_FCmp(CmpPredicate &Pred, const LHS &L, const RHS &R)
auto m_c_UMax(const LHS &L, const RHS &R)
Matches a UMax with LHS and RHS in either order.
AllowFmf_match< T, FastMathFlags::NoInfs > m_NoInfs(const T &SubPattern)
BinaryOp_match< LHS, RHS, Instruction::FMul, true > m_c_FMul(const LHS &L, const RHS &R)
Matches FMul with LHS and RHS in either order.
cst_pred_ty< is_sign_mask > m_SignMask()
Match an integer or vector with only the sign bit(s) set.
OverflowingBinaryOp_match< LHS, RHS, Instruction::Add, OverflowingBinaryOperator::NoUnsignedWrap > m_NUWAdd(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::AShr > m_AShr(const LHS &L, const RHS &R)
auto m_PtrToIntOrAddr(const OpTy &Op)
Matches PtrToInt or PtrToAddr.
match_combine_or< typename m_Intrinsic_Ty< Opnd0, Opnd1 >::Ty, typename m_Intrinsic_Ty< Opnd0, Opnd1 >::Ty > m_FMinNum_or_FMinimumNum(const Opnd0 &Op0, const Opnd1 &Op1)
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.
m_Intrinsic_Ty< Opnd0, Opnd1, Opnd2 >::Ty m_MaskedStore(const Opnd0 &Op0, const Opnd1 &Op1, const Opnd2 &Op2)
Matches MaskedStore Intrinsic.
OverflowingBinaryOp_match< LHS, RHS, Instruction::Add, OverflowingBinaryOperator::NoSignedWrap, true > m_c_NSWAdd(const LHS &L, const RHS &R)
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)
match_combine_or< CastInst_match< OpTy, CastInst >, OpTy > m_CastOrSelf(const OpTy &Op)
Matches any cast or self. Used to ignore casts.
match_combine_or< CastInst_match< OpTy, TruncInst >, OpTy > m_TruncOrSelf(const OpTy &Op)
auto m_LogicalOp()
Matches either L && R or L || R where L and R are arbitrary values.
CommutativeBinaryIntrinsic_match< IntrID, T0, T1 > m_c_Intrinsic(const T0 &Op0, const T1 &Op1)
OneOps_match< OpTy, Instruction::Freeze > m_Freeze(const OpTy &Op)
Matches FreezeInst.
auto m_Poison()
Match an arbitrary poison constant.
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.
ap_match< APFloat > m_APFloatForbidPoison(const APFloat *&Res)
Match APFloat while forbidding poison in splat vector constants.
cst_pred_ty< is_power2_or_zero > m_Power2OrZero()
Match an integer or vector of 0 or power-of-2 values.
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)
br_match m_UnconditionalBr(BasicBlock *&Succ)
CastOperator_match< OpTy, Instruction::PtrToAddr > m_PtrToAddr(const OpTy &Op)
Matches PtrToAddr.
ap_match< APInt > m_APIntAllowPoison(const APInt *&Res)
Match APInt while allowing poison in splat vector constants.
auto m_ConstantExpr()
Match a constant expression or a constant that contains a constant expression.
OverflowingBinaryOp_match< LHS, RHS, Instruction::Sub, OverflowingBinaryOperator::NoSignedWrap > m_NSWSub(const LHS &L, const RHS &R)
specific_intval< false > m_SpecificInt(const APInt &V)
Match a specific integer value or vector with all elements equal to the value.
BinaryOp_match< LHS, RHS, Instruction::FMul > m_FMul(const LHS &L, const RHS &R)
match_combine_or< CastInst_match< OpTy, ZExtInst >, OpTy > m_ZExtOrSelf(const OpTy &Op)
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.
match_bind< Instruction > m_Instruction(Instruction *&I)
Match an instruction, capturing it if we match.
cst_pred_ty< is_shifted_mask > m_ShiftedMask()
auto m_UMin(const Opnd0 &Op0, const Opnd1 &Op1)
match_deferred< 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()...
cstval_pred_ty< Predicate, ConstantInt, AllowPoison > cst_pred_ty
specialization of cstval_pred_ty for ConstantInt
m_Intrinsic_Ty< Opnd0, Opnd1 >::Ty m_FMaxNum(const Opnd0 &Op0, const Opnd1 &Op1)
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.
DisjointOr_match< LHS, RHS > m_DisjointOr(const LHS &L, const RHS &R)
cstfp_pred_ty< is_signed_inf< true > > m_NegInf()
Match a negative infinity FP constant.
BinOpPred_match< LHS, RHS, is_right_shift_op > m_Shr(const LHS &L, const RHS &R)
Matches logical shift operations.
auto m_c_XorLike(const LHS &L, const RHS &R)
Match either (xor L, R), (xor R, L) or (sub nuw R, L) iff R.isMask() Only commutative matcher as the ...
specific_intval< true > m_SpecificIntAllowPoison(const APInt &V)
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.
auto 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::Add, OverflowingBinaryOperator::NoUnsignedWrap, true > m_c_NUWAdd(const LHS &L, const RHS &R)
OverflowingBinaryOp_match< cst_pred_ty< is_zero_int >, ValTy, Instruction::Sub, OverflowingBinaryOperator::NoSignedWrap > m_NSWNeg(const ValTy &V)
Matches a 'Neg' as 'sub nsw 0, V'.
m_Intrinsic_Ty< Opnd0, Opnd1, Opnd2 >::Ty m_MaskedLoad(const Opnd0 &Op0, const Opnd1 &Op1, const Opnd2 &Op2)
Matches MaskedLoad Intrinsic.
TwoOps_match< Val_t, Idx_t, Instruction::ExtractElement > m_ExtractElt(const Val_t &Val, const Idx_t &Idx)
Matches ExtractElementInst.
cstfp_pred_ty< is_finite > m_Finite()
Match a finite FP constant, i.e.
FMaxMin_match< LHS, RHS, ofmin_pred_ty > m_OrdFMin(const LHS &L, const RHS &R)
Match an 'ordered' floating point minimum function.
cst_pred_ty< is_nonnegative > m_NonNegative()
Match an integer or vector of non-negative values.
auto m_SMax(const Opnd0 &Op0, const Opnd1 &Op1)
auto m_LogicalOp(const LHS &L, const RHS &R)
Matches either L && R or L || R, either one being in the either binary or logical form.
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.
IntrinsicID_match m_VScale()
Matches a call to llvm.vscale().
cstfp_pred_ty< is_neg_zero_fp > m_NegZeroFP()
Match a floating-point negative zero.
auto m_BinOp()
Match an arbitrary binary operation and ignore it.
m_Intrinsic_Ty< Opnd0, Opnd1 >::Ty m_FMinimum(const Opnd0 &Op0, const Opnd1 &Op1)
auto m_UMax(const Opnd0 &Op0, const Opnd1 &Op1)
match_combine_or< CastInst_match< OpTy, SExtInst >, OpTy > m_SExtOrSelf(const OpTy &Op)
FMaxMin_match< LHS, RHS, ufmin_pred_ty > m_UnordFMin(const LHS &L, const RHS &R)
Match an 'unordered' floating point minimum function.
InsertValue_match< Ind, Val_t, Elt_t > m_InsertValue(const Val_t &Val, const Elt_t &Elt)
Matches a single index InsertValue instruction.
auto m_BasicBlock()
Match an arbitrary basic block value and ignore it.
specific_fpval m_SpecificFP(double V)
Match a specific floating point value or vector with all elements equal to the value.
m_Intrinsic_Ty< Opnd0, Opnd1 >::Ty m_Interleave2(const Opnd0 &Op0, const Opnd1 &Op1)
ExtractValue_match< Ind, Val_t > m_ExtractValue(const Val_t &V)
Match a single index ExtractValue instruction.
BinOpPred_match< LHS, RHS, is_logical_shift_op > m_LogicalShift(const LHS &L, const RHS &R)
Matches logical shift operations.
match_combine_or< CastInst_match< OpTy, UIToFPInst >, CastInst_match< OpTy, SIToFPInst > > m_IToFP(const OpTy &Op)
cst_pred_ty< is_any_apint > m_AnyIntegralConstant()
Match an integer or vector with any integral constant.
m_Intrinsic_Ty< Opnd0, Opnd1 >::Ty m_FMaximum(const Opnd0 &Op0, const Opnd1 &Op1)
ICmpLike_match< LHS, RHS > m_ICmpLike(CmpPredicate &Pred, const LHS &L, const RHS &R)
CastInst_match< OpTy, FPToUIInst > m_FPToUI(const OpTy &Op)
auto m_Value()
Match an arbitrary value and ignore it.
m_Intrinsic_Ty< Opnd0 >::Ty m_Sqrt(const Opnd0 &Op0)
ShiftLike_match< LHS, Instruction::Shl > m_ShlOrSelf(const LHS &L, uint64_t &R)
Matches shl L, ConstShAmt or L itself (R will be set to zero in this case).
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::FAdd > m_FAdd(const LHS &L, const RHS &R)
SpecificCmpClass_match< LHS, RHS, CmpInst > m_SpecificCmp(CmpPredicate MatchPred, const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::Mul > m_Mul(const LHS &L, const RHS &R)
auto m_UndefValue()
Match an arbitrary UndefValue constant.
cst_pred_ty< is_zero_int > m_ZeroInt()
Match an integer 0 or a vector with all elements equal to 0.
auto m_Constant()
Match an arbitrary Constant and ignore it.
ContainsMatchingVectorElement_match< SPTy > m_ContainsMatchingVectorElement(const SPTy &SubPattern)
Match a vector constant where at least one of its elements matches the subpattern.
NoWrapTrunc_match< OpTy, TruncInst::NoSignedWrap > m_NSWTrunc(const OpTy &Op)
Matches trunc nsw.
match_combine_or< match_combine_or< CastInst_match< OpTy, ZExtInst >, CastInst_match< OpTy, SExtInst > >, OpTy > m_ZExtOrSExtOrSelf(const OpTy &Op)
OneUse_match< T > m_OneUse(const T &SubPattern)
NNegZExt_match< OpTy > m_NNegZExt(const OpTy &Op)
auto m_LogicalOr()
Matches L || R where L and R are arbitrary values.
BinaryOp_match< cst_pred_ty< is_zero_int >, ValTy, Instruction::Sub > m_Neg(const ValTy &V)
Matches a 'Neg' as 'sub 0, V'.
Splat_match< T > m_ConstantSplat(const T &SubPattern)
Match a constant splat. TODO: Extend this to non-constant splats.
TwoOps_match< V1_t, V2_t, Instruction::ShuffleVector > m_Shuffle(const V1_t &v1, const V2_t &v2)
Matches ShuffleVectorInst independently of mask value.
specific_bbval m_SpecificBB(BasicBlock *BB)
Match a specific basic block value.
auto m_GEP(const OperandTypes &...Ops)
Matches GetElementPtrInst.
ap_match< APInt > m_APIntForbidPoison(const APInt *&Res)
Match APInt while forbidding poison in splat vector constants.
AllowFmf_match< T, FastMathFlags::NoNaNs > m_NoNaNs(const T &SubPattern)
cst_pred_ty< is_strictlypositive > m_StrictlyPositive()
Match an integer or vector of strictly positive values.
FMaxMin_match< LHS, RHS, ufmax_pred_ty > m_UnordFMax(const LHS &L, const RHS &R)
Match an 'unordered' floating point maximum function.
match_combine_or< CastInst_match< OpTy, FPToUIInst >, CastInst_match< OpTy, FPToSIInst > > m_FPToI(const OpTy &Op)
cst_pred_ty< is_non_zero_int > m_NonZeroInt()
Match a non-zero integer or a vector with all non-zero elements.
ThreeOps_match< decltype(m_Value()), LHS, RHS, Instruction::Select, true > m_c_Select(const LHS &L, const RHS &R)
Match Select(C, LHS, RHS) or Select(C, RHS, LHS)
CastInst_match< OpTy, FPExtInst > m_FPExt(const OpTy &Op)
OverflowingBinaryOp_match< LHS, RHS, Instruction::Shl, OverflowingBinaryOperator::NoSignedWrap > m_NSWShl(const LHS &L, const RHS &R)
match_bind< WithOverflowInst > m_WithOverflowInst(WithOverflowInst *&I)
Match a with overflow intrinsic, capturing it if we match.
cstfp_pred_ty< is_nonnan > m_NonNaN()
Match a non-NaN FP constant.
SpecificCmpClass_match< LHS, RHS, ICmpInst > m_SpecificICmp(CmpPredicate MatchPred, const LHS &L, const RHS &R)
AllowFmf_match< T, FastMathFlags::AllowReassoc > m_AllowReassoc(const T &SubPattern)
OneOps_match< OpTy, Instruction::Load > m_Load(const OpTy &Op)
Matches LoadInst.
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)
FMaxMin_match< LHS, RHS, ofmax_pred_ty > m_OrdFMax(const LHS &L, const RHS &R)
Match an 'ordered' floating point maximum function.
auto m_AnyIntrinsic()
Matches any intrinsic call and ignore it.
cstfp_pred_ty< is_non_zero_not_denormal_fp > m_NonZeroNotDenormalFP()
Match a floating-point non-zero that is not a denormal.
cst_pred_ty< is_all_ones, false > m_AllOnesForbidPoison()
match_combine_or< FMaxMin_match< LHS, RHS, ofmin_pred_ty >, FMaxMin_match< LHS, RHS, ufmin_pred_ty > > m_OrdOrUnordFMin(const LHS &L, const RHS &R)
Match an 'ordered' or 'unordered' floating point minimum function.
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)
BinOpPred_match< LHS, RHS, is_bitwiselogic_op, true > m_c_BitwiseLogic(const LHS &L, const RHS &R)
Matches bitwise logic operations in either order.
m_Intrinsic_Ty< Opnd0, Opnd1 >::Ty m_FMaximumNum(const Opnd0 &Op0, const Opnd1 &Op1)
AllowFmf_match< T, FastMathFlags::ApproxFunc > m_ApproxFunc(const T &SubPattern)
cstfp_pred_ty< is_signed_inf< false > > m_PosInf()
Match a positive infinity FP constant.
cst_pred_ty< is_negated_power2 > m_NegatedPower2()
Match a integer or vector negated power-of-2.
match_immconstant_ty m_ImmConstant()
Match an arbitrary immediate Constant and ignore it.
cst_pred_ty< is_negated_power2_or_zero > m_NegatedPower2OrZero()
Match a integer or vector negated power-of-2.
auto m_ZExtOrTruncOrSelf(const OpTy &Op)
auto m_c_LogicalOp(const LHS &L, const RHS &R)
Matches either L && R or L || R with LHS and RHS in either order.
NoWrapTrunc_match< OpTy, TruncInst::NoUnsignedWrap > m_NUWTrunc(const OpTy &Op)
Matches trunc nuw.
ShiftLike_match< LHS, Instruction::AShr > m_AShrOrSelf(const LHS &L, uint64_t &R)
Matches ashr L, ConstShAmt or L itself (R will be set to zero in this case).
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.
SelectLike_match< CondTy, LTy, RTy > m_SelectLike(const CondTy &C, const LTy &TrueC, const RTy &FalseC)
Matches a value that behaves like a boolean-controlled select, i.e.
cst_pred_ty< is_lowbit_mask_or_zero > m_LowBitMaskOrZero()
Match an integer or vector with only the low bit(s) set.
m_Intrinsic_Ty< Opnd0, Opnd1 >::Ty m_FMinimumNum(const Opnd0 &Op0, const Opnd1 &Op1)
specific_fpval m_FPOne()
Match a float 1.0 or vector with all elements equal to 1.0.
DisjointOr_match< LHS, RHS, true > m_c_DisjointOr(const LHS &L, const RHS &R)
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.
SpecificCmpClass_match< LHS, RHS, FCmpInst > m_SpecificFCmp(CmpPredicate MatchPred, const LHS &L, const RHS &R)
match_combine_or< BinaryOp_match< LHS, RHS, Instruction::Add >, DisjointOr_match< LHS, RHS > > m_AddLike(const LHS &L, const RHS &R)
Match either "add" or "or disjoint".
m_Intrinsic_Ty< Opnd0, Opnd1, Opnd2 >::Ty m_MaskedGather(const Opnd0 &Op0, const Opnd1 &Op1, const Opnd2 &Op2)
Matches MaskedGather Intrinsic.
CastInst_match< OpTy, UIToFPInst > m_UIToFP(const OpTy &Op)
CastOperator_match< OpTy, Instruction::BitCast > m_BitCast(const OpTy &Op)
Matches BitCast.
m_Intrinsic_Ty< Opnd0, Opnd1, Opnd2 >::Ty m_FShl(const Opnd0 &Op0, const Opnd1 &Op1, const Opnd2 &Op2)
cstval_pred_ty< Predicate, ConstantFP, true > cstfp_pred_ty
specialization of cstval_pred_ty for ConstantFP
match_combine_or< CastInst_match< OpTy, SExtInst >, NNegZExt_match< OpTy > > m_SExtLike(const OpTy &Op)
Match either "sext" or "zext nneg".
cstfp_pred_ty< is_finitenonzero > m_FiniteNonZero()
Match a finite non-zero FP constant.
CastInst_match< OpTy, FPToSIInst > m_FPToSI(const OpTy &Op)
BinaryOp_match< LHS, RHS, Instruction::SDiv > m_SDiv(const LHS &L, const RHS &R)
auto m_c_MaxOrMin(const LHS &L, const RHS &R)
cstfp_pred_ty< custom_checkfn< APFloat > > m_CheckedFp(function_ref< bool(const APFloat &)> CheckFn)
Match a float or vector where CheckFn(ele) for each element is true.
OverflowingBinaryOp_match< LHS, RHS, Instruction::Sub, OverflowingBinaryOperator::NoUnsignedWrap > m_NUWSub(const LHS &L, const RHS &R)
auto m_SMin(const Opnd0 &Op0, const Opnd1 &Op1)
cst_pred_ty< is_maxsignedvalue > m_MaxSignedValue()
Match an integer or vector with values having all bits except for the high bit set (0x7f....
match_combine_or< OverflowingBinaryOp_match< LHS, RHS, Instruction::Add, OverflowingBinaryOperator::NoSignedWrap >, DisjointOr_match< LHS, RHS > > m_NSWAddLike(const LHS &L, const RHS &R)
Match either "add nsw" or "or disjoint".
m_Intrinsic_Ty< Opnd0 >::Ty m_Ctpop(const Opnd0 &Op0)
AnyBinaryOp_match< LHS, RHS, true > m_c_BinOp(const LHS &L, const RHS &R)
Matches a BinaryOperator with LHS and RHS in either order.
Signum_match< Val_t > m_Signum(const Val_t &V)
Matches a signum pattern.
match_combine_or< FMaxMin_match< LHS, RHS, ofmax_pred_ty >, FMaxMin_match< LHS, RHS, ufmax_pred_ty > > m_OrdOrUnordFMax(const LHS &L, const RHS &R)
Match an 'ordered' or 'unordered' floating point maximum function.
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)
Argument_match< Opnd_t > m_Argument(const Opnd_t &Op)
Match an argument.
match_combine_or< CastInst_match< OpTy, ZExtInst >, CastInst_match< OpTy, SExtInst > > m_ZExtOrSExt(const OpTy &Op)
Exact_match< T > m_Exact(const T &SubPattern)
FNeg_match< OpTy > m_FNeg(const OpTy &X)
Match 'fneg X' as 'fsub -0.0, X'.
BinOpPred_match< LHS, RHS, is_shift_op > m_Shift(const LHS &L, const RHS &R)
Matches shift operations.
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.
auto m_UnOp()
Match an arbitrary unary operation and ignore it.
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)
cstfp_pred_ty< is_non_zero_fp > m_NonZeroFP()
Match a floating-point non-zero.
UAddWithOverflow_match< LHS_t, RHS_t, Sum_t > m_UAddWithOverflow(const LHS_t &L, const RHS_t &R, const Sum_t &S)
Match an icmp instruction checking for unsigned overflow on addition.
BinaryOp_match< LHS, RHS, Instruction::FDiv > m_FDiv(const LHS &L, const RHS &R)
m_Intrinsic_Ty< Opnd0 >::Ty m_VecReverse(const Opnd0 &Op0)
BinOpPred_match< LHS, RHS, is_irem_op > m_IRem(const LHS &L, const RHS &R)
Matches integer remainder operations.
m_Intrinsic_Ty< Opnd0, Opnd1 >::Ty m_Cttz(const Opnd0 &Op0, const Opnd1 &Op1)
auto m_MaxOrMin(const Opnd0 &Op0, const Opnd1 &Op1)
auto m_LogicalAnd()
Matches L && R where L and R are arbitrary values.
m_Intrinsic_Ty< Opnd0, Opnd1, Opnd2 >::Ty m_FShr(const Opnd0 &Op0, const Opnd1 &Op1, const Opnd2 &Op2)
brc_match< Cond_t, match_bind< BasicBlock >, match_bind< BasicBlock > > m_Br(const Cond_t &C, BasicBlock *&T, BasicBlock *&F)
auto m_c_UMin(const LHS &L, const RHS &R)
Matches a UMin with LHS and RHS in either order.
ThreeOps_match< Cond, constantint_match< L >, constantint_match< R >, Instruction::Select > m_SelectCst(const Cond &C)
This matches a select of two constants, e.g.: m_SelectCst<-1, 0>(m_Value(V))
auto m_c_SMax(const LHS &L, const RHS &R)
Matches an SMax with LHS and RHS in either order.
BinaryOp_match< LHS, RHS, Instruction::FRem > m_FRem(const LHS &L, const RHS &R)
AllowFmf_match< T, FastMathFlags::AllowContract > m_AllowContract(const T &SubPattern)
CastInst_match< OpTy, FPTruncInst > m_FPTrunc(const OpTy &Op)
m_Intrinsic_Ty< Opnd0, Opnd1 >::Ty m_Ctlz(const Opnd0 &Op0, const Opnd1 &Op1)
BinaryOp_match< LHS, RHS, Instruction::SRem > m_SRem(const LHS &L, const RHS &R)
auto m_Undef()
Match an arbitrary undef constant.
m_Intrinsic_Ty< Opnd0, Opnd1 >::Ty m_FMinNum(const Opnd0 &Op0, const Opnd1 &Op1)
cst_pred_ty< is_nonpositive > m_NonPositive()
Match an integer or vector of non-positive values.
cstfp_pred_ty< is_nan > m_NaN()
Match an arbitrary NaN constant.
auto m_ConstantFP()
Match an arbitrary ConstantFP and ignore it.
BinaryOp_match< cst_pred_ty< is_all_ones >, ValTy, Instruction::Xor, true > m_Not(const ValTy &V)
Matches a 'Not' as 'xor V, -1' or 'xor -1, V'.
match_combine_or< typename m_Intrinsic_Ty< Opnd0, Opnd1 >::Ty, typename m_Intrinsic_Ty< Opnd0, Opnd1 >::Ty > m_FMaxNum_or_FMaximumNum(const Opnd0 &Op0, const Opnd1 &Op1)
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.
match_combine_or< OverflowingBinaryOp_match< LHS, RHS, Instruction::Add, OverflowingBinaryOperator::NoUnsignedWrap >, DisjointOr_match< LHS, RHS > > m_NUWAddLike(const LHS &L, const RHS &R)
Match either "add nuw" or "or disjoint".
CastOperator_match< OpTy, Instruction::IntToPtr > m_IntToPtr(const OpTy &Op)
Matches IntToPtr.
auto m_c_SMin(const LHS &L, const RHS &R)
Matches an SMin with LHS and RHS in either order.
BinOpPred_match< LHS, RHS, is_bitwiselogic_op > m_BitwiseLogic(const LHS &L, const RHS &R)
Matches bitwise logic operations.
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.
SpecificCmpClass_match< LHS, RHS, ICmpInst, true > m_c_SpecificICmp(CmpPredicate MatchPred, const LHS &L, const RHS &R)
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.
m_Intrinsic_Ty< Opnd0, Opnd1 >::Ty m_CopySign(const Opnd0 &Op0, const Opnd1 &Op1)
CastOperator_match< OpTy, Instruction::PtrToInt > m_PtrToInt(const OpTy &Op)
Matches PtrToInt.
m_Intrinsic_Ty< Opnd0, Opnd1, Opnd2 >::Ty m_VectorInsert(const Opnd0 &Op0, const Opnd1 &Op1, const Opnd2 &Op2)
AllowFmf_match< T, FastMathFlags::AllowReciprocal > m_AllowReciprocal(const T &SubPattern)
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)
cstfp_pred_ty< is_noninf > m_NonInf()
Match a non-infinity FP constant, i.e.
m_Intrinsic_Ty< Opnd >::Ty m_Deinterleave2(const Opnd &Op)
match_unless< Ty > m_Unless(const Ty &M)
Match if the inner matcher does NOT match.
cst_pred_ty< icmp_pred_with_threshold > m_SpecificInt_ICMP(ICmpInst::Predicate Predicate, const APInt &Threshold)
Match an integer or vector with every element comparing 'pred' (eg/ne/...) to Threshold.
auto m_ConstantInt()
Match an arbitrary ConstantInt and ignore it.
This is an optimization pass for GlobalISel generic memory operations.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
constexpr auto bind_back(FnT &&Fn, BindArgsT &&...BindArgs)
C++23 bind_back.
auto dyn_cast_or_null(const Y &Val)
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...
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
DWARFExpression::Operation Op
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
auto find_if(R &&Range, UnaryPredicate P)
Provide wrappers to std::find_if which take ranges instead of having to pass begin/end explicitly.
bool all_equal(std::initializer_list< T > Values)
Returns true if all Values in the initializer lists are equal or the list.
Matcher to bind the captured value.
Matching and combinator leaf case.
Matching or combinator leaf case.
Matcher for a specific value, but stores a reference to the value, not the value itself.
AllowFmf_match(const SubPattern_t &SP)
bool match(OpTy *V) const
AnyBinaryOp_match(const LHS_t &LHS, const RHS_t &RHS)
bool match(OpTy *V) const
Matches instructions with Opcode and any number of operands.
bool match(OpTy *V) const
std::enable_if_t< Idx==Last, bool > match_operands(const Instruction *I) const
std::enable_if_t< Idx !=Last, bool > match_operands(const Instruction *I) const
std::tuple< OperandTypes... > Operands
AnyOps_match(const OperandTypes &...Ops)
AnyUnaryOp_match(const OP_t &X)
bool match(OpTy *V) const
Argument_match(unsigned OpIdx, const Opnd_t &V)
bool match(OpTy *V) const
BinOpPred_match(const LHS_t &LHS, const RHS_t &RHS)
bool match(OpTy *V) const
BinaryOp_match(const LHS_t &LHS, const RHS_t &RHS)
bool match(OpTy *V) const
bool match(unsigned Opc, OpTy *V) const
CastInst_match(const Op_t &OpMatch)
bool match(OpTy *V) const
CastOperator_match(const Op_t &OpMatch)
bool match(OpTy *V) const
bool match(OpTy *V) const
CmpClass_match(CmpPredicate &Pred, const LHS_t &LHS, const RHS_t &RHS)
CmpClass_match(const LHS_t &LHS, const RHS_t &RHS)
bool match(OpTy *V) const
CommutativeBinaryIntrinsic_match(const LHS &L, const RHS &R)
ContainsMatchingVectorElement_match(const SPTy &SP)
DisjointOr_match(const LHS &L, const RHS &R)
bool match(OpTy *V) const
bool match(OpTy *V) const
ElementWiseBitCast_match(const Op_t &OpMatch)
Exact_match(const SubPattern_t &SP)
bool match(OpTy *V) const
bool match(OpTy *V) const
FMaxMin_match(const LHS_t &LHS, const RHS_t &RHS)
FNeg_match(const Op_t &Op)
bool match(OpTy *V) const
ICmpLike_match(CmpPredicate &P, const LHS_t &Left, const RHS_t &Right)
bool match(OpTy *V) const
Matcher for a single index InsertValue instruction.
InsertValue_match(const T0 &Op0, const T1 &Op1)
bool match(OpTy *V) const
IntrinsicID_match(Intrinsic::ID IntrID)
bool match(OpTy *V) const
Match intrinsic calls with any of the given IDs.
bool match(OpTy *V) const
LogicalOp_match(const LHS &L, const RHS &R)
NNegZExt_match(const Op_t &OpMatch)
bool match(OpTy *V) const
NoWrapTrunc_match(const Op_t &OpMatch)
bool match(OpTy *V) const
Matches instructions with Opcode and three operands.
bool match(OpTy *V) const
OneOps_match(const T0 &Op1)
bool match(OpTy *V) const
OneUse_match(const SubPattern_t &SP)
bool match(OpTy *V) const
OverflowingBinaryOp_match(const LHS_t &LHS, const RHS_t &RHS)
bool match(OpTy *V) const
PtrAdd_match(const PointerOpTy &PointerOp, const OffsetOpTy &OffsetOp)
PtrToIntSameSize_match(const DataLayout &DL, const Op_t &OpMatch)
bool match(OpTy *V) const
SelectLike_match(const CondTy &C, const LTy &TC, const RTy &FC)
bool match(OpTy *V) const
ShiftLike_match(const LHS_t &LHS, uint64_t &RHS)
bool match(OpTy *V) const
Shuffle_match(const T0 &Op1, const T1 &Op2, const T2 &Mask)
bool match(OpTy *V) const
bool match(OpTy *V) const
Signum_match(const Opnd_t &V)
bool match(OpTy *V) const
SpecificBinaryOp_match(unsigned Opcode, const LHS_t &LHS, const RHS_t &RHS)
bool match(OpTy *V) const
SpecificCmpClass_match(CmpPredicate Pred, const LHS_t &LHS, const RHS_t &RHS)
const CmpPredicate Predicate
bool match(OpTy *V) const
Splat_match(const SubPattern_t &SP)
Matches instructions with Opcode and three operands.
ThreeOps_match(const T0 &Op1, const T1 &Op2, const T2 &Op3)
bool match(OpTy *V) const
Matches instructions with Opcode and three operands.
TwoOps_match(const T0 &Op1, const T1 &Op2)
bool match(OpTy *V) const
bool match(OpTy *V) const
UAddWithOverflow_match(const LHS_t &L, const RHS_t &R, const Sum_t &S)
XorLike_match(const LHS &L, const RHS &R)
bool match(OpTy *V) const
ap_match(const APTy *&Res, bool AllowPoison)
std::conditional_t< std::is_same_v< APTy, APInt >, ConstantInt, ConstantFP > ConstantTy
This helper class is used to match scalar and vector constants that satisfy a specified predicate,...
apf_pred_ty(const APFloat *&R)
This helper class is used to match scalar and vector constants that satisfy a specified predicate,...
api_pred_ty(const APInt *&R)
bind_const_intval_ty(uint64_t &V)
bind_immconstant_ty(Constant *&V)
bool match(OpTy *V) const
br_match(BasicBlock *&Succ)
brc_match(const Cond_t &C, const TrueBlock_t &t, const FalseBlock_t &f)
bool match(OpTy *V) const
This helper class is used to match constant scalars, vector splats, and fixed width vectors that sati...
bool match_impl(ITy *V) const
bool isValue(const APTy &C) const
function_ref< bool(const APTy &)> CheckFn
bool isValue(const APInt &C) const
static bool isImmConstant(ITy *V)
bool isValue(const APInt &C) const
bool isValue(const APInt &C) const
bool isValue(const APFloat &C) const
bool isOpType(unsigned Opcode) const
bool isValue(const APFloat &C) const
bool isValue(const APFloat &C) const
bool isOpType(unsigned Opcode) const
bool isValue(const APFloat &C) const
bool isOpType(unsigned Opcode) const
bool isOpType(unsigned Opcode) const
bool isValue(const APInt &C) const
bool isValue(const APInt &C) const
bool isValue(const APInt &C) const
bool isValue(const APFloat &C) const
bool isValue(const APFloat &C) const
bool isValue(const APInt &C) const
bool isValue(const APInt &C) const
bool isValue(const APInt &C) const
bool isValue(const APFloat &C) const
bool isValue(const APInt &C) const
bool isValue(const APFloat &C) const
bool isValue(const APFloat &C) const
bool isValue(const APFloat &C) const
bool isValue(const APInt &C) const
bool isValue(const APInt &C) const
bool isValue(const APInt &C) const
bool isValue(const APFloat &C) const
bool isValue(const APInt &C) const
bool isValue(const APInt &C) const
bool isOpType(unsigned Opcode) const
bool isOpType(unsigned Opcode) const
bool isValue(const APInt &C) const
bool isValue(const APInt &C) const
bool isValue(const APFloat &C) const
bool isValue(const APInt &C) const
bool isValue(const APInt &C) const
match_combine_and< typename m_Intrinsic_Ty< T0, T1, T2, T3, T4 >::Ty, Argument_match< T5 > > Ty
match_combine_and< typename m_Intrinsic_Ty< T0, T1, T2, T3 >::Ty, Argument_match< T4 > > Ty
match_combine_and< typename m_Intrinsic_Ty< T0, T1, T2 >::Ty, Argument_match< T3 > > Ty
match_combine_and< typename m_Intrinsic_Ty< T0, T1 >::Ty, Argument_match< T2 > > Ty
match_combine_and< typename m_Intrinsic_Ty< T0 >::Ty, Argument_match< T1 > > Ty
match_combine_and< IntrinsicID_match, Argument_match< T0 > > Ty
Intrinsic matches are combinations of ID matchers, and argument matchers.
ArrayRef< int > & MaskRef
m_Mask(ArrayRef< int > &MaskRef)
bool match(ArrayRef< int > Mask) const
bool match(ArrayRef< int > Mask) const
m_SpecificMask(ArrayRef< int > Val)
bool match(ArrayRef< int > Mask) const
bool match(ArrayRef< int > Mask) const
m_SplatOrPoisonMask(int &SplatIndex)
bool match(ArrayRef< int > Mask) const
match_unless(const Ty &Matcher)
Helper class for identifying ordered max predicates.
static bool match(FCmpInst::Predicate Pred)
Helper class for identifying ordered min predicates.
static bool match(FCmpInst::Predicate Pred)
Match a specified basic block value.
specific_bbval(BasicBlock *Val)
Match a specified floating point value or vector of all elements of that value.
specific_intval64(uint64_t V)
Match a specified integer value or vector of all elements of that value.
specific_intval(const APInt &V)
Matcher for specified Value*.
specificval_ty(const Value *V)
Helper class for identifying unordered max predicates.
static bool match(FCmpInst::Predicate Pred)
Helper class for identifying unordered min predicates.
static bool match(FCmpInst::Predicate Pred)
static bool check(const Value *V)