Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-05-10 08:44:10

0001 //===- PatternMatch.h - Match on the LLVM IR --------------------*- C++ -*-===//
0002 //
0003 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
0004 // See https://llvm.org/LICENSE.txt for license information.
0005 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
0006 //
0007 //===----------------------------------------------------------------------===//
0008 //
0009 // This file provides a simple and efficient mechanism for performing general
0010 // tree-based pattern matches on the LLVM IR. The power of these routines is
0011 // that it allows you to write concise patterns that are expressive and easy to
0012 // understand. The other major advantage of this is that it allows you to
0013 // trivially capture/bind elements in the pattern to variables. For example,
0014 // you can do something like this:
0015 //
0016 //  Value *Exp = ...
0017 //  Value *X, *Y;  ConstantInt *C1, *C2;      // (X & C1) | (Y & C2)
0018 //  if (match(Exp, m_Or(m_And(m_Value(X), m_ConstantInt(C1)),
0019 //                      m_And(m_Value(Y), m_ConstantInt(C2))))) {
0020 //    ... Pattern is matched and variables are bound ...
0021 //  }
0022 //
0023 // This is primarily useful to things like the instruction combiner, but can
0024 // also be useful for static analysis tools or code generators.
0025 //
0026 //===----------------------------------------------------------------------===//
0027 
0028 #ifndef LLVM_IR_PATTERNMATCH_H
0029 #define LLVM_IR_PATTERNMATCH_H
0030 
0031 #include "llvm/ADT/APFloat.h"
0032 #include "llvm/ADT/APInt.h"
0033 #include "llvm/IR/Constant.h"
0034 #include "llvm/IR/Constants.h"
0035 #include "llvm/IR/DataLayout.h"
0036 #include "llvm/IR/InstrTypes.h"
0037 #include "llvm/IR/Instruction.h"
0038 #include "llvm/IR/Instructions.h"
0039 #include "llvm/IR/IntrinsicInst.h"
0040 #include "llvm/IR/Intrinsics.h"
0041 #include "llvm/IR/Operator.h"
0042 #include "llvm/IR/Value.h"
0043 #include "llvm/Support/Casting.h"
0044 #include <cstdint>
0045 
0046 namespace llvm {
0047 namespace PatternMatch {
0048 
0049 template <typename Val, typename Pattern> bool match(Val *V, const Pattern &P) {
0050   return const_cast<Pattern &>(P).match(V);
0051 }
0052 
0053 template <typename Pattern> bool match(ArrayRef<int> Mask, const Pattern &P) {
0054   return const_cast<Pattern &>(P).match(Mask);
0055 }
0056 
0057 template <typename SubPattern_t> struct OneUse_match {
0058   SubPattern_t SubPattern;
0059 
0060   OneUse_match(const SubPattern_t &SP) : SubPattern(SP) {}
0061 
0062   template <typename OpTy> bool match(OpTy *V) {
0063     return V->hasOneUse() && SubPattern.match(V);
0064   }
0065 };
0066 
0067 template <typename T> inline OneUse_match<T> m_OneUse(const T &SubPattern) {
0068   return SubPattern;
0069 }
0070 
0071 template <typename SubPattern_t> struct AllowReassoc_match {
0072   SubPattern_t SubPattern;
0073 
0074   AllowReassoc_match(const SubPattern_t &SP) : SubPattern(SP) {}
0075 
0076   template <typename OpTy> bool match(OpTy *V) {
0077     auto *I = dyn_cast<FPMathOperator>(V);
0078     return I && I->hasAllowReassoc() && SubPattern.match(I);
0079   }
0080 };
0081 
0082 template <typename T>
0083 inline AllowReassoc_match<T> m_AllowReassoc(const T &SubPattern) {
0084   return SubPattern;
0085 }
0086 
0087 template <typename Class> struct class_match {
0088   template <typename ITy> bool match(ITy *V) { return isa<Class>(V); }
0089 };
0090 
0091 /// Match an arbitrary value and ignore it.
0092 inline class_match<Value> m_Value() { return class_match<Value>(); }
0093 
0094 /// Match an arbitrary unary operation and ignore it.
0095 inline class_match<UnaryOperator> m_UnOp() {
0096   return class_match<UnaryOperator>();
0097 }
0098 
0099 /// Match an arbitrary binary operation and ignore it.
0100 inline class_match<BinaryOperator> m_BinOp() {
0101   return class_match<BinaryOperator>();
0102 }
0103 
0104 /// Matches any compare instruction and ignore it.
0105 inline class_match<CmpInst> m_Cmp() { return class_match<CmpInst>(); }
0106 
0107 struct undef_match {
0108   static bool check(const Value *V) {
0109     if (isa<UndefValue>(V))
0110       return true;
0111 
0112     const auto *CA = dyn_cast<ConstantAggregate>(V);
0113     if (!CA)
0114       return false;
0115 
0116     SmallPtrSet<const ConstantAggregate *, 8> Seen;
0117     SmallVector<const ConstantAggregate *, 8> Worklist;
0118 
0119     // Either UndefValue, PoisonValue, or an aggregate that only contains
0120     // these is accepted by matcher.
0121     // CheckValue returns false if CA cannot satisfy this constraint.
0122     auto CheckValue = [&](const ConstantAggregate *CA) {
0123       for (const Value *Op : CA->operand_values()) {
0124         if (isa<UndefValue>(Op))
0125           continue;
0126 
0127         const auto *CA = dyn_cast<ConstantAggregate>(Op);
0128         if (!CA)
0129           return false;
0130         if (Seen.insert(CA).second)
0131           Worklist.emplace_back(CA);
0132       }
0133 
0134       return true;
0135     };
0136 
0137     if (!CheckValue(CA))
0138       return false;
0139 
0140     while (!Worklist.empty()) {
0141       if (!CheckValue(Worklist.pop_back_val()))
0142         return false;
0143     }
0144     return true;
0145   }
0146   template <typename ITy> bool match(ITy *V) { return check(V); }
0147 };
0148 
0149 /// Match an arbitrary undef constant. This matches poison as well.
0150 /// If this is an aggregate and contains a non-aggregate element that is
0151 /// neither undef nor poison, the aggregate is not matched.
0152 inline auto m_Undef() { return undef_match(); }
0153 
0154 /// Match an arbitrary UndefValue constant.
0155 inline class_match<UndefValue> m_UndefValue() {
0156   return class_match<UndefValue>();
0157 }
0158 
0159 /// Match an arbitrary poison constant.
0160 inline class_match<PoisonValue> m_Poison() {
0161   return class_match<PoisonValue>();
0162 }
0163 
0164 /// Match an arbitrary Constant and ignore it.
0165 inline class_match<Constant> m_Constant() { return class_match<Constant>(); }
0166 
0167 /// Match an arbitrary ConstantInt and ignore it.
0168 inline class_match<ConstantInt> m_ConstantInt() {
0169   return class_match<ConstantInt>();
0170 }
0171 
0172 /// Match an arbitrary ConstantFP and ignore it.
0173 inline class_match<ConstantFP> m_ConstantFP() {
0174   return class_match<ConstantFP>();
0175 }
0176 
0177 struct constantexpr_match {
0178   template <typename ITy> bool match(ITy *V) {
0179     auto *C = dyn_cast<Constant>(V);
0180     return C && (isa<ConstantExpr>(C) || C->containsConstantExpression());
0181   }
0182 };
0183 
0184 /// Match a constant expression or a constant that contains a constant
0185 /// expression.
0186 inline constantexpr_match m_ConstantExpr() { return constantexpr_match(); }
0187 
0188 /// Match an arbitrary basic block value and ignore it.
0189 inline class_match<BasicBlock> m_BasicBlock() {
0190   return class_match<BasicBlock>();
0191 }
0192 
0193 /// Inverting matcher
0194 template <typename Ty> struct match_unless {
0195   Ty M;
0196 
0197   match_unless(const Ty &Matcher) : M(Matcher) {}
0198 
0199   template <typename ITy> bool match(ITy *V) { return !M.match(V); }
0200 };
0201 
0202 /// Match if the inner matcher does *NOT* match.
0203 template <typename Ty> inline match_unless<Ty> m_Unless(const Ty &M) {
0204   return match_unless<Ty>(M);
0205 }
0206 
0207 /// Matching combinators
0208 template <typename LTy, typename RTy> struct match_combine_or {
0209   LTy L;
0210   RTy R;
0211 
0212   match_combine_or(const LTy &Left, const RTy &Right) : L(Left), R(Right) {}
0213 
0214   template <typename ITy> bool match(ITy *V) {
0215     if (L.match(V))
0216       return true;
0217     if (R.match(V))
0218       return true;
0219     return false;
0220   }
0221 };
0222 
0223 template <typename LTy, typename RTy> struct match_combine_and {
0224   LTy L;
0225   RTy R;
0226 
0227   match_combine_and(const LTy &Left, const RTy &Right) : L(Left), R(Right) {}
0228 
0229   template <typename ITy> bool match(ITy *V) {
0230     if (L.match(V))
0231       if (R.match(V))
0232         return true;
0233     return false;
0234   }
0235 };
0236 
0237 /// Combine two pattern matchers matching L || R
0238 template <typename LTy, typename RTy>
0239 inline match_combine_or<LTy, RTy> m_CombineOr(const LTy &L, const RTy &R) {
0240   return match_combine_or<LTy, RTy>(L, R);
0241 }
0242 
0243 /// Combine two pattern matchers matching L && R
0244 template <typename LTy, typename RTy>
0245 inline match_combine_and<LTy, RTy> m_CombineAnd(const LTy &L, const RTy &R) {
0246   return match_combine_and<LTy, RTy>(L, R);
0247 }
0248 
0249 struct apint_match {
0250   const APInt *&Res;
0251   bool AllowPoison;
0252 
0253   apint_match(const APInt *&Res, bool AllowPoison)
0254       : Res(Res), AllowPoison(AllowPoison) {}
0255 
0256   template <typename ITy> bool match(ITy *V) {
0257     if (auto *CI = dyn_cast<ConstantInt>(V)) {
0258       Res = &CI->getValue();
0259       return true;
0260     }
0261     if (V->getType()->isVectorTy())
0262       if (const auto *C = dyn_cast<Constant>(V))
0263         if (auto *CI =
0264                 dyn_cast_or_null<ConstantInt>(C->getSplatValue(AllowPoison))) {
0265           Res = &CI->getValue();
0266           return true;
0267         }
0268     return false;
0269   }
0270 };
0271 // Either constexpr if or renaming ConstantFP::getValueAPF to
0272 // ConstantFP::getValue is needed to do it via single template
0273 // function for both apint/apfloat.
0274 struct apfloat_match {
0275   const APFloat *&Res;
0276   bool AllowPoison;
0277 
0278   apfloat_match(const APFloat *&Res, bool AllowPoison)
0279       : Res(Res), AllowPoison(AllowPoison) {}
0280 
0281   template <typename ITy> bool match(ITy *V) {
0282     if (auto *CI = dyn_cast<ConstantFP>(V)) {
0283       Res = &CI->getValueAPF();
0284       return true;
0285     }
0286     if (V->getType()->isVectorTy())
0287       if (const auto *C = dyn_cast<Constant>(V))
0288         if (auto *CI =
0289                 dyn_cast_or_null<ConstantFP>(C->getSplatValue(AllowPoison))) {
0290           Res = &CI->getValueAPF();
0291           return true;
0292         }
0293     return false;
0294   }
0295 };
0296 
0297 /// Match a ConstantInt or splatted ConstantVector, binding the
0298 /// specified pointer to the contained APInt.
0299 inline apint_match m_APInt(const APInt *&Res) {
0300   // Forbid poison by default to maintain previous behavior.
0301   return apint_match(Res, /* AllowPoison */ false);
0302 }
0303 
0304 /// Match APInt while allowing poison in splat vector constants.
0305 inline apint_match m_APIntAllowPoison(const APInt *&Res) {
0306   return apint_match(Res, /* AllowPoison */ true);
0307 }
0308 
0309 /// Match APInt while forbidding poison in splat vector constants.
0310 inline apint_match m_APIntForbidPoison(const APInt *&Res) {
0311   return apint_match(Res, /* AllowPoison */ false);
0312 }
0313 
0314 /// Match a ConstantFP or splatted ConstantVector, binding the
0315 /// specified pointer to the contained APFloat.
0316 inline apfloat_match m_APFloat(const APFloat *&Res) {
0317   // Forbid undefs by default to maintain previous behavior.
0318   return apfloat_match(Res, /* AllowPoison */ false);
0319 }
0320 
0321 /// Match APFloat while allowing poison in splat vector constants.
0322 inline apfloat_match m_APFloatAllowPoison(const APFloat *&Res) {
0323   return apfloat_match(Res, /* AllowPoison */ true);
0324 }
0325 
0326 /// Match APFloat while forbidding poison in splat vector constants.
0327 inline apfloat_match m_APFloatForbidPoison(const APFloat *&Res) {
0328   return apfloat_match(Res, /* AllowPoison */ false);
0329 }
0330 
0331 template <int64_t Val> struct constantint_match {
0332   template <typename ITy> bool match(ITy *V) {
0333     if (const auto *CI = dyn_cast<ConstantInt>(V)) {
0334       const APInt &CIV = CI->getValue();
0335       if (Val >= 0)
0336         return CIV == static_cast<uint64_t>(Val);
0337       // If Val is negative, and CI is shorter than it, truncate to the right
0338       // number of bits.  If it is larger, then we have to sign extend.  Just
0339       // compare their negated values.
0340       return -CIV == -Val;
0341     }
0342     return false;
0343   }
0344 };
0345 
0346 /// Match a ConstantInt with a specific value.
0347 template <int64_t Val> inline constantint_match<Val> m_ConstantInt() {
0348   return constantint_match<Val>();
0349 }
0350 
0351 /// This helper class is used to match constant scalars, vector splats,
0352 /// and fixed width vectors that satisfy a specified predicate.
0353 /// For fixed width vector constants, poison elements are ignored if AllowPoison
0354 /// is true.
0355 template <typename Predicate, typename ConstantVal, bool AllowPoison>
0356 struct cstval_pred_ty : public Predicate {
0357   const Constant **Res = nullptr;
0358   template <typename ITy> bool match_impl(ITy *V) {
0359     if (const auto *CV = dyn_cast<ConstantVal>(V))
0360       return this->isValue(CV->getValue());
0361     if (const auto *VTy = dyn_cast<VectorType>(V->getType())) {
0362       if (const auto *C = dyn_cast<Constant>(V)) {
0363         if (const auto *CV = dyn_cast_or_null<ConstantVal>(C->getSplatValue()))
0364           return this->isValue(CV->getValue());
0365 
0366         // Number of elements of a scalable vector unknown at compile time
0367         auto *FVTy = dyn_cast<FixedVectorType>(VTy);
0368         if (!FVTy)
0369           return false;
0370 
0371         // Non-splat vector constant: check each element for a match.
0372         unsigned NumElts = FVTy->getNumElements();
0373         assert(NumElts != 0 && "Constant vector with no elements?");
0374         bool HasNonPoisonElements = false;
0375         for (unsigned i = 0; i != NumElts; ++i) {
0376           Constant *Elt = C->getAggregateElement(i);
0377           if (!Elt)
0378             return false;
0379           if (AllowPoison && isa<PoisonValue>(Elt))
0380             continue;
0381           auto *CV = dyn_cast<ConstantVal>(Elt);
0382           if (!CV || !this->isValue(CV->getValue()))
0383             return false;
0384           HasNonPoisonElements = true;
0385         }
0386         return HasNonPoisonElements;
0387       }
0388     }
0389     return false;
0390   }
0391 
0392   template <typename ITy> bool match(ITy *V) {
0393     if (this->match_impl(V)) {
0394       if (Res)
0395         *Res = cast<Constant>(V);
0396       return true;
0397     }
0398     return false;
0399   }
0400 };
0401 
0402 /// specialization of cstval_pred_ty for ConstantInt
0403 template <typename Predicate, bool AllowPoison = true>
0404 using cst_pred_ty = cstval_pred_ty<Predicate, ConstantInt, AllowPoison>;
0405 
0406 /// specialization of cstval_pred_ty for ConstantFP
0407 template <typename Predicate>
0408 using cstfp_pred_ty = cstval_pred_ty<Predicate, ConstantFP,
0409                                      /*AllowPoison=*/true>;
0410 
0411 /// This helper class is used to match scalar and vector constants that
0412 /// satisfy a specified predicate, and bind them to an APInt.
0413 template <typename Predicate> struct api_pred_ty : public Predicate {
0414   const APInt *&Res;
0415 
0416   api_pred_ty(const APInt *&R) : Res(R) {}
0417 
0418   template <typename ITy> bool match(ITy *V) {
0419     if (const auto *CI = dyn_cast<ConstantInt>(V))
0420       if (this->isValue(CI->getValue())) {
0421         Res = &CI->getValue();
0422         return true;
0423       }
0424     if (V->getType()->isVectorTy())
0425       if (const auto *C = dyn_cast<Constant>(V))
0426         if (auto *CI = dyn_cast_or_null<ConstantInt>(
0427                 C->getSplatValue(/*AllowPoison=*/true)))
0428           if (this->isValue(CI->getValue())) {
0429             Res = &CI->getValue();
0430             return true;
0431           }
0432 
0433     return false;
0434   }
0435 };
0436 
0437 /// This helper class is used to match scalar and vector constants that
0438 /// satisfy a specified predicate, and bind them to an APFloat.
0439 /// Poison is allowed in splat vector constants.
0440 template <typename Predicate> struct apf_pred_ty : public Predicate {
0441   const APFloat *&Res;
0442 
0443   apf_pred_ty(const APFloat *&R) : Res(R) {}
0444 
0445   template <typename ITy> bool match(ITy *V) {
0446     if (const auto *CI = dyn_cast<ConstantFP>(V))
0447       if (this->isValue(CI->getValue())) {
0448         Res = &CI->getValue();
0449         return true;
0450       }
0451     if (V->getType()->isVectorTy())
0452       if (const auto *C = dyn_cast<Constant>(V))
0453         if (auto *CI = dyn_cast_or_null<ConstantFP>(
0454                 C->getSplatValue(/* AllowPoison */ true)))
0455           if (this->isValue(CI->getValue())) {
0456             Res = &CI->getValue();
0457             return true;
0458           }
0459 
0460     return false;
0461   }
0462 };
0463 
0464 ///////////////////////////////////////////////////////////////////////////////
0465 //
0466 // Encapsulate constant value queries for use in templated predicate matchers.
0467 // This allows checking if constants match using compound predicates and works
0468 // with vector constants, possibly with relaxed constraints. For example, ignore
0469 // undef values.
0470 //
0471 ///////////////////////////////////////////////////////////////////////////////
0472 
0473 template <typename APTy> struct custom_checkfn {
0474   function_ref<bool(const APTy &)> CheckFn;
0475   bool isValue(const APTy &C) { return CheckFn(C); }
0476 };
0477 
0478 /// Match an integer or vector where CheckFn(ele) for each element is true.
0479 /// For vectors, poison elements are assumed to match.
0480 inline cst_pred_ty<custom_checkfn<APInt>>
0481 m_CheckedInt(function_ref<bool(const APInt &)> CheckFn) {
0482   return cst_pred_ty<custom_checkfn<APInt>>{{CheckFn}};
0483 }
0484 
0485 inline cst_pred_ty<custom_checkfn<APInt>>
0486 m_CheckedInt(const Constant *&V, function_ref<bool(const APInt &)> CheckFn) {
0487   return cst_pred_ty<custom_checkfn<APInt>>{{CheckFn}, &V};
0488 }
0489 
0490 /// Match a float or vector where CheckFn(ele) for each element is true.
0491 /// For vectors, poison elements are assumed to match.
0492 inline cstfp_pred_ty<custom_checkfn<APFloat>>
0493 m_CheckedFp(function_ref<bool(const APFloat &)> CheckFn) {
0494   return cstfp_pred_ty<custom_checkfn<APFloat>>{{CheckFn}};
0495 }
0496 
0497 inline cstfp_pred_ty<custom_checkfn<APFloat>>
0498 m_CheckedFp(const Constant *&V, function_ref<bool(const APFloat &)> CheckFn) {
0499   return cstfp_pred_ty<custom_checkfn<APFloat>>{{CheckFn}, &V};
0500 }
0501 
0502 struct is_any_apint {
0503   bool isValue(const APInt &C) { return true; }
0504 };
0505 /// Match an integer or vector with any integral constant.
0506 /// For vectors, this includes constants with undefined elements.
0507 inline cst_pred_ty<is_any_apint> m_AnyIntegralConstant() {
0508   return cst_pred_ty<is_any_apint>();
0509 }
0510 
0511 struct is_shifted_mask {
0512   bool isValue(const APInt &C) { return C.isShiftedMask(); }
0513 };
0514 
0515 inline cst_pred_ty<is_shifted_mask> m_ShiftedMask() {
0516   return cst_pred_ty<is_shifted_mask>();
0517 }
0518 
0519 struct is_all_ones {
0520   bool isValue(const APInt &C) { return C.isAllOnes(); }
0521 };
0522 /// Match an integer or vector with all bits set.
0523 /// For vectors, this includes constants with undefined elements.
0524 inline cst_pred_ty<is_all_ones> m_AllOnes() {
0525   return cst_pred_ty<is_all_ones>();
0526 }
0527 
0528 inline cst_pred_ty<is_all_ones, false> m_AllOnesForbidPoison() {
0529   return cst_pred_ty<is_all_ones, false>();
0530 }
0531 
0532 struct is_maxsignedvalue {
0533   bool isValue(const APInt &C) { return C.isMaxSignedValue(); }
0534 };
0535 /// Match an integer or vector with values having all bits except for the high
0536 /// bit set (0x7f...).
0537 /// For vectors, this includes constants with undefined elements.
0538 inline cst_pred_ty<is_maxsignedvalue> m_MaxSignedValue() {
0539   return cst_pred_ty<is_maxsignedvalue>();
0540 }
0541 inline api_pred_ty<is_maxsignedvalue> m_MaxSignedValue(const APInt *&V) {
0542   return V;
0543 }
0544 
0545 struct is_negative {
0546   bool isValue(const APInt &C) { return C.isNegative(); }
0547 };
0548 /// Match an integer or vector of negative values.
0549 /// For vectors, this includes constants with undefined elements.
0550 inline cst_pred_ty<is_negative> m_Negative() {
0551   return cst_pred_ty<is_negative>();
0552 }
0553 inline api_pred_ty<is_negative> m_Negative(const APInt *&V) { return V; }
0554 
0555 struct is_nonnegative {
0556   bool isValue(const APInt &C) { return C.isNonNegative(); }
0557 };
0558 /// Match an integer or vector of non-negative values.
0559 /// For vectors, this includes constants with undefined elements.
0560 inline cst_pred_ty<is_nonnegative> m_NonNegative() {
0561   return cst_pred_ty<is_nonnegative>();
0562 }
0563 inline api_pred_ty<is_nonnegative> m_NonNegative(const APInt *&V) { return V; }
0564 
0565 struct is_strictlypositive {
0566   bool isValue(const APInt &C) { return C.isStrictlyPositive(); }
0567 };
0568 /// Match an integer or vector of strictly positive values.
0569 /// For vectors, this includes constants with undefined elements.
0570 inline cst_pred_ty<is_strictlypositive> m_StrictlyPositive() {
0571   return cst_pred_ty<is_strictlypositive>();
0572 }
0573 inline api_pred_ty<is_strictlypositive> m_StrictlyPositive(const APInt *&V) {
0574   return V;
0575 }
0576 
0577 struct is_nonpositive {
0578   bool isValue(const APInt &C) { return C.isNonPositive(); }
0579 };
0580 /// Match an integer or vector of non-positive values.
0581 /// For vectors, this includes constants with undefined elements.
0582 inline cst_pred_ty<is_nonpositive> m_NonPositive() {
0583   return cst_pred_ty<is_nonpositive>();
0584 }
0585 inline api_pred_ty<is_nonpositive> m_NonPositive(const APInt *&V) { return V; }
0586 
0587 struct is_one {
0588   bool isValue(const APInt &C) { return C.isOne(); }
0589 };
0590 /// Match an integer 1 or a vector with all elements equal to 1.
0591 /// For vectors, this includes constants with undefined elements.
0592 inline cst_pred_ty<is_one> m_One() { return cst_pred_ty<is_one>(); }
0593 
0594 struct is_zero_int {
0595   bool isValue(const APInt &C) { return C.isZero(); }
0596 };
0597 /// Match an integer 0 or a vector with all elements equal to 0.
0598 /// For vectors, this includes constants with undefined elements.
0599 inline cst_pred_ty<is_zero_int> m_ZeroInt() {
0600   return cst_pred_ty<is_zero_int>();
0601 }
0602 
0603 struct is_zero {
0604   template <typename ITy> bool match(ITy *V) {
0605     auto *C = dyn_cast<Constant>(V);
0606     // FIXME: this should be able to do something for scalable vectors
0607     return C && (C->isNullValue() || cst_pred_ty<is_zero_int>().match(C));
0608   }
0609 };
0610 /// Match any null constant or a vector with all elements equal to 0.
0611 /// For vectors, this includes constants with undefined elements.
0612 inline is_zero m_Zero() { return is_zero(); }
0613 
0614 struct is_power2 {
0615   bool isValue(const APInt &C) { return C.isPowerOf2(); }
0616 };
0617 /// Match an integer or vector power-of-2.
0618 /// For vectors, this includes constants with undefined elements.
0619 inline cst_pred_ty<is_power2> m_Power2() { return cst_pred_ty<is_power2>(); }
0620 inline api_pred_ty<is_power2> m_Power2(const APInt *&V) { return V; }
0621 
0622 struct is_negated_power2 {
0623   bool isValue(const APInt &C) { return C.isNegatedPowerOf2(); }
0624 };
0625 /// Match a integer or vector negated power-of-2.
0626 /// For vectors, this includes constants with undefined elements.
0627 inline cst_pred_ty<is_negated_power2> m_NegatedPower2() {
0628   return cst_pred_ty<is_negated_power2>();
0629 }
0630 inline api_pred_ty<is_negated_power2> m_NegatedPower2(const APInt *&V) {
0631   return V;
0632 }
0633 
0634 struct is_negated_power2_or_zero {
0635   bool isValue(const APInt &C) { return !C || C.isNegatedPowerOf2(); }
0636 };
0637 /// Match a integer or vector negated power-of-2.
0638 /// For vectors, this includes constants with undefined elements.
0639 inline cst_pred_ty<is_negated_power2_or_zero> m_NegatedPower2OrZero() {
0640   return cst_pred_ty<is_negated_power2_or_zero>();
0641 }
0642 inline api_pred_ty<is_negated_power2_or_zero>
0643 m_NegatedPower2OrZero(const APInt *&V) {
0644   return V;
0645 }
0646 
0647 struct is_power2_or_zero {
0648   bool isValue(const APInt &C) { return !C || C.isPowerOf2(); }
0649 };
0650 /// Match an integer or vector of 0 or power-of-2 values.
0651 /// For vectors, this includes constants with undefined elements.
0652 inline cst_pred_ty<is_power2_or_zero> m_Power2OrZero() {
0653   return cst_pred_ty<is_power2_or_zero>();
0654 }
0655 inline api_pred_ty<is_power2_or_zero> m_Power2OrZero(const APInt *&V) {
0656   return V;
0657 }
0658 
0659 struct is_sign_mask {
0660   bool isValue(const APInt &C) { return C.isSignMask(); }
0661 };
0662 /// Match an integer or vector with only the sign bit(s) set.
0663 /// For vectors, this includes constants with undefined elements.
0664 inline cst_pred_ty<is_sign_mask> m_SignMask() {
0665   return cst_pred_ty<is_sign_mask>();
0666 }
0667 
0668 struct is_lowbit_mask {
0669   bool isValue(const APInt &C) { return C.isMask(); }
0670 };
0671 /// Match an integer or vector with only the low bit(s) set.
0672 /// For vectors, this includes constants with undefined elements.
0673 inline cst_pred_ty<is_lowbit_mask> m_LowBitMask() {
0674   return cst_pred_ty<is_lowbit_mask>();
0675 }
0676 inline api_pred_ty<is_lowbit_mask> m_LowBitMask(const APInt *&V) { return V; }
0677 
0678 struct is_lowbit_mask_or_zero {
0679   bool isValue(const APInt &C) { return !C || C.isMask(); }
0680 };
0681 /// Match an integer or vector with only the low bit(s) set.
0682 /// For vectors, this includes constants with undefined elements.
0683 inline cst_pred_ty<is_lowbit_mask_or_zero> m_LowBitMaskOrZero() {
0684   return cst_pred_ty<is_lowbit_mask_or_zero>();
0685 }
0686 inline api_pred_ty<is_lowbit_mask_or_zero> m_LowBitMaskOrZero(const APInt *&V) {
0687   return V;
0688 }
0689 
0690 struct icmp_pred_with_threshold {
0691   CmpPredicate Pred;
0692   const APInt *Thr;
0693   bool isValue(const APInt &C) { return ICmpInst::compare(C, *Thr, Pred); }
0694 };
0695 /// Match an integer or vector with every element comparing 'pred' (eg/ne/...)
0696 /// to Threshold. For vectors, this includes constants with undefined elements.
0697 inline cst_pred_ty<icmp_pred_with_threshold>
0698 m_SpecificInt_ICMP(ICmpInst::Predicate Predicate, const APInt &Threshold) {
0699   cst_pred_ty<icmp_pred_with_threshold> P;
0700   P.Pred = Predicate;
0701   P.Thr = &Threshold;
0702   return P;
0703 }
0704 
0705 struct is_nan {
0706   bool isValue(const APFloat &C) { return C.isNaN(); }
0707 };
0708 /// Match an arbitrary NaN constant. This includes quiet and signalling nans.
0709 /// For vectors, this includes constants with undefined elements.
0710 inline cstfp_pred_ty<is_nan> m_NaN() { return cstfp_pred_ty<is_nan>(); }
0711 
0712 struct is_nonnan {
0713   bool isValue(const APFloat &C) { return !C.isNaN(); }
0714 };
0715 /// Match a non-NaN FP constant.
0716 /// For vectors, this includes constants with undefined elements.
0717 inline cstfp_pred_ty<is_nonnan> m_NonNaN() {
0718   return cstfp_pred_ty<is_nonnan>();
0719 }
0720 
0721 struct is_inf {
0722   bool isValue(const APFloat &C) { return C.isInfinity(); }
0723 };
0724 /// Match a positive or negative infinity FP constant.
0725 /// For vectors, this includes constants with undefined elements.
0726 inline cstfp_pred_ty<is_inf> m_Inf() { return cstfp_pred_ty<is_inf>(); }
0727 
0728 struct is_noninf {
0729   bool isValue(const APFloat &C) { return !C.isInfinity(); }
0730 };
0731 /// Match a non-infinity FP constant, i.e. finite or NaN.
0732 /// For vectors, this includes constants with undefined elements.
0733 inline cstfp_pred_ty<is_noninf> m_NonInf() {
0734   return cstfp_pred_ty<is_noninf>();
0735 }
0736 
0737 struct is_finite {
0738   bool isValue(const APFloat &C) { return C.isFinite(); }
0739 };
0740 /// Match a finite FP constant, i.e. not infinity or NaN.
0741 /// For vectors, this includes constants with undefined elements.
0742 inline cstfp_pred_ty<is_finite> m_Finite() {
0743   return cstfp_pred_ty<is_finite>();
0744 }
0745 inline apf_pred_ty<is_finite> m_Finite(const APFloat *&V) { return V; }
0746 
0747 struct is_finitenonzero {
0748   bool isValue(const APFloat &C) { return C.isFiniteNonZero(); }
0749 };
0750 /// Match a finite non-zero FP constant.
0751 /// For vectors, this includes constants with undefined elements.
0752 inline cstfp_pred_ty<is_finitenonzero> m_FiniteNonZero() {
0753   return cstfp_pred_ty<is_finitenonzero>();
0754 }
0755 inline apf_pred_ty<is_finitenonzero> m_FiniteNonZero(const APFloat *&V) {
0756   return V;
0757 }
0758 
0759 struct is_any_zero_fp {
0760   bool isValue(const APFloat &C) { return C.isZero(); }
0761 };
0762 /// Match a floating-point negative zero or positive zero.
0763 /// For vectors, this includes constants with undefined elements.
0764 inline cstfp_pred_ty<is_any_zero_fp> m_AnyZeroFP() {
0765   return cstfp_pred_ty<is_any_zero_fp>();
0766 }
0767 
0768 struct is_pos_zero_fp {
0769   bool isValue(const APFloat &C) { return C.isPosZero(); }
0770 };
0771 /// Match a floating-point positive zero.
0772 /// For vectors, this includes constants with undefined elements.
0773 inline cstfp_pred_ty<is_pos_zero_fp> m_PosZeroFP() {
0774   return cstfp_pred_ty<is_pos_zero_fp>();
0775 }
0776 
0777 struct is_neg_zero_fp {
0778   bool isValue(const APFloat &C) { return C.isNegZero(); }
0779 };
0780 /// Match a floating-point negative zero.
0781 /// For vectors, this includes constants with undefined elements.
0782 inline cstfp_pred_ty<is_neg_zero_fp> m_NegZeroFP() {
0783   return cstfp_pred_ty<is_neg_zero_fp>();
0784 }
0785 
0786 struct is_non_zero_fp {
0787   bool isValue(const APFloat &C) { return C.isNonZero(); }
0788 };
0789 /// Match a floating-point non-zero.
0790 /// For vectors, this includes constants with undefined elements.
0791 inline cstfp_pred_ty<is_non_zero_fp> m_NonZeroFP() {
0792   return cstfp_pred_ty<is_non_zero_fp>();
0793 }
0794 
0795 struct is_non_zero_not_denormal_fp {
0796   bool isValue(const APFloat &C) { return !C.isDenormal() && C.isNonZero(); }
0797 };
0798 
0799 /// Match a floating-point non-zero that is not a denormal.
0800 /// For vectors, this includes constants with undefined elements.
0801 inline cstfp_pred_ty<is_non_zero_not_denormal_fp> m_NonZeroNotDenormalFP() {
0802   return cstfp_pred_ty<is_non_zero_not_denormal_fp>();
0803 }
0804 
0805 ///////////////////////////////////////////////////////////////////////////////
0806 
0807 template <typename Class> struct bind_ty {
0808   Class *&VR;
0809 
0810   bind_ty(Class *&V) : VR(V) {}
0811 
0812   template <typename ITy> bool match(ITy *V) {
0813     if (auto *CV = dyn_cast<Class>(V)) {
0814       VR = CV;
0815       return true;
0816     }
0817     return false;
0818   }
0819 };
0820 
0821 /// Match a value, capturing it if we match.
0822 inline bind_ty<Value> m_Value(Value *&V) { return V; }
0823 inline bind_ty<const Value> m_Value(const Value *&V) { return V; }
0824 
0825 /// Match an instruction, capturing it if we match.
0826 inline bind_ty<Instruction> m_Instruction(Instruction *&I) { return I; }
0827 /// Match a unary operator, capturing it if we match.
0828 inline bind_ty<UnaryOperator> m_UnOp(UnaryOperator *&I) { return I; }
0829 /// Match a binary operator, capturing it if we match.
0830 inline bind_ty<BinaryOperator> m_BinOp(BinaryOperator *&I) { return I; }
0831 /// Match a with overflow intrinsic, capturing it if we match.
0832 inline bind_ty<WithOverflowInst> m_WithOverflowInst(WithOverflowInst *&I) {
0833   return I;
0834 }
0835 inline bind_ty<const WithOverflowInst>
0836 m_WithOverflowInst(const WithOverflowInst *&I) {
0837   return I;
0838 }
0839 
0840 /// Match an UndefValue, capturing the value if we match.
0841 inline bind_ty<UndefValue> m_UndefValue(UndefValue *&U) { return U; }
0842 
0843 /// Match a Constant, capturing the value if we match.
0844 inline bind_ty<Constant> m_Constant(Constant *&C) { return C; }
0845 
0846 /// Match a ConstantInt, capturing the value if we match.
0847 inline bind_ty<ConstantInt> m_ConstantInt(ConstantInt *&CI) { return CI; }
0848 
0849 /// Match a ConstantFP, capturing the value if we match.
0850 inline bind_ty<ConstantFP> m_ConstantFP(ConstantFP *&C) { return C; }
0851 
0852 /// Match a ConstantExpr, capturing the value if we match.
0853 inline bind_ty<ConstantExpr> m_ConstantExpr(ConstantExpr *&C) { return C; }
0854 
0855 /// Match a basic block value, capturing it if we match.
0856 inline bind_ty<BasicBlock> m_BasicBlock(BasicBlock *&V) { return V; }
0857 inline bind_ty<const BasicBlock> m_BasicBlock(const BasicBlock *&V) {
0858   return V;
0859 }
0860 
0861 /// Match an arbitrary immediate Constant and ignore it.
0862 inline match_combine_and<class_match<Constant>,
0863                          match_unless<constantexpr_match>>
0864 m_ImmConstant() {
0865   return m_CombineAnd(m_Constant(), m_Unless(m_ConstantExpr()));
0866 }
0867 
0868 /// Match an immediate Constant, capturing the value if we match.
0869 inline match_combine_and<bind_ty<Constant>,
0870                          match_unless<constantexpr_match>>
0871 m_ImmConstant(Constant *&C) {
0872   return m_CombineAnd(m_Constant(C), m_Unless(m_ConstantExpr()));
0873 }
0874 
0875 /// Match a specified Value*.
0876 struct specificval_ty {
0877   const Value *Val;
0878 
0879   specificval_ty(const Value *V) : Val(V) {}
0880 
0881   template <typename ITy> bool match(ITy *V) { return V == Val; }
0882 };
0883 
0884 /// Match if we have a specific specified value.
0885 inline specificval_ty m_Specific(const Value *V) { return V; }
0886 
0887 /// Stores a reference to the Value *, not the Value * itself,
0888 /// thus can be used in commutative matchers.
0889 template <typename Class> struct deferredval_ty {
0890   Class *const &Val;
0891 
0892   deferredval_ty(Class *const &V) : Val(V) {}
0893 
0894   template <typename ITy> bool match(ITy *const V) { return V == Val; }
0895 };
0896 
0897 /// Like m_Specific(), but works if the specific value to match is determined
0898 /// as part of the same match() expression. For example:
0899 /// m_Add(m_Value(X), m_Specific(X)) is incorrect, because m_Specific() will
0900 /// bind X before the pattern match starts.
0901 /// m_Add(m_Value(X), m_Deferred(X)) is correct, and will check against
0902 /// whichever value m_Value(X) populated.
0903 inline deferredval_ty<Value> m_Deferred(Value *const &V) { return V; }
0904 inline deferredval_ty<const Value> m_Deferred(const Value *const &V) {
0905   return V;
0906 }
0907 
0908 /// Match a specified floating point value or vector of all elements of
0909 /// that value.
0910 struct specific_fpval {
0911   double Val;
0912 
0913   specific_fpval(double V) : Val(V) {}
0914 
0915   template <typename ITy> bool match(ITy *V) {
0916     if (const auto *CFP = dyn_cast<ConstantFP>(V))
0917       return CFP->isExactlyValue(Val);
0918     if (V->getType()->isVectorTy())
0919       if (const auto *C = dyn_cast<Constant>(V))
0920         if (auto *CFP = dyn_cast_or_null<ConstantFP>(C->getSplatValue()))
0921           return CFP->isExactlyValue(Val);
0922     return false;
0923   }
0924 };
0925 
0926 /// Match a specific floating point value or vector with all elements
0927 /// equal to the value.
0928 inline specific_fpval m_SpecificFP(double V) { return specific_fpval(V); }
0929 
0930 /// Match a float 1.0 or vector with all elements equal to 1.0.
0931 inline specific_fpval m_FPOne() { return m_SpecificFP(1.0); }
0932 
0933 struct bind_const_intval_ty {
0934   uint64_t &VR;
0935 
0936   bind_const_intval_ty(uint64_t &V) : VR(V) {}
0937 
0938   template <typename ITy> bool match(ITy *V) {
0939     if (const auto *CV = dyn_cast<ConstantInt>(V))
0940       if (CV->getValue().ule(UINT64_MAX)) {
0941         VR = CV->getZExtValue();
0942         return true;
0943       }
0944     return false;
0945   }
0946 };
0947 
0948 /// Match a specified integer value or vector of all elements of that
0949 /// value.
0950 template <bool AllowPoison> struct specific_intval {
0951   const APInt &Val;
0952 
0953   specific_intval(const APInt &V) : Val(V) {}
0954 
0955   template <typename ITy> bool match(ITy *V) {
0956     const auto *CI = dyn_cast<ConstantInt>(V);
0957     if (!CI && V->getType()->isVectorTy())
0958       if (const auto *C = dyn_cast<Constant>(V))
0959         CI = dyn_cast_or_null<ConstantInt>(C->getSplatValue(AllowPoison));
0960 
0961     return CI && APInt::isSameValue(CI->getValue(), Val);
0962   }
0963 };
0964 
0965 template <bool AllowPoison> struct specific_intval64 {
0966   uint64_t Val;
0967 
0968   specific_intval64(uint64_t V) : Val(V) {}
0969 
0970   template <typename ITy> bool match(ITy *V) {
0971     const auto *CI = dyn_cast<ConstantInt>(V);
0972     if (!CI && V->getType()->isVectorTy())
0973       if (const auto *C = dyn_cast<Constant>(V))
0974         CI = dyn_cast_or_null<ConstantInt>(C->getSplatValue(AllowPoison));
0975 
0976     return CI && CI->getValue() == Val;
0977   }
0978 };
0979 
0980 /// Match a specific integer value or vector with all elements equal to
0981 /// the value.
0982 inline specific_intval<false> m_SpecificInt(const APInt &V) {
0983   return specific_intval<false>(V);
0984 }
0985 
0986 inline specific_intval64<false> m_SpecificInt(uint64_t V) {
0987   return specific_intval64<false>(V);
0988 }
0989 
0990 inline specific_intval<true> m_SpecificIntAllowPoison(const APInt &V) {
0991   return specific_intval<true>(V);
0992 }
0993 
0994 inline specific_intval64<true> m_SpecificIntAllowPoison(uint64_t V) {
0995   return specific_intval64<true>(V);
0996 }
0997 
0998 /// Match a ConstantInt and bind to its value.  This does not match
0999 /// ConstantInts wider than 64-bits.
1000 inline bind_const_intval_ty m_ConstantInt(uint64_t &V) { return V; }
1001 
1002 /// Match a specified basic block value.
1003 struct specific_bbval {
1004   BasicBlock *Val;
1005 
1006   specific_bbval(BasicBlock *Val) : Val(Val) {}
1007 
1008   template <typename ITy> bool match(ITy *V) {
1009     const auto *BB = dyn_cast<BasicBlock>(V);
1010     return BB && BB == Val;
1011   }
1012 };
1013 
1014 /// Match a specific basic block value.
1015 inline specific_bbval m_SpecificBB(BasicBlock *BB) {
1016   return specific_bbval(BB);
1017 }
1018 
1019 /// A commutative-friendly version of m_Specific().
1020 inline deferredval_ty<BasicBlock> m_Deferred(BasicBlock *const &BB) {
1021   return BB;
1022 }
1023 inline deferredval_ty<const BasicBlock>
1024 m_Deferred(const BasicBlock *const &BB) {
1025   return BB;
1026 }
1027 
1028 //===----------------------------------------------------------------------===//
1029 // Matcher for any binary operator.
1030 //
1031 template <typename LHS_t, typename RHS_t, bool Commutable = false>
1032 struct AnyBinaryOp_match {
1033   LHS_t L;
1034   RHS_t R;
1035 
1036   // The evaluation order is always stable, regardless of Commutability.
1037   // The LHS is always matched first.
1038   AnyBinaryOp_match(const LHS_t &LHS, const RHS_t &RHS) : L(LHS), R(RHS) {}
1039 
1040   template <typename OpTy> bool match(OpTy *V) {
1041     if (auto *I = dyn_cast<BinaryOperator>(V))
1042       return (L.match(I->getOperand(0)) && R.match(I->getOperand(1))) ||
1043              (Commutable && L.match(I->getOperand(1)) &&
1044               R.match(I->getOperand(0)));
1045     return false;
1046   }
1047 };
1048 
1049 template <typename LHS, typename RHS>
1050 inline AnyBinaryOp_match<LHS, RHS> m_BinOp(const LHS &L, const RHS &R) {
1051   return AnyBinaryOp_match<LHS, RHS>(L, R);
1052 }
1053 
1054 //===----------------------------------------------------------------------===//
1055 // Matcher for any unary operator.
1056 // TODO fuse unary, binary matcher into n-ary matcher
1057 //
1058 template <typename OP_t> struct AnyUnaryOp_match {
1059   OP_t X;
1060 
1061   AnyUnaryOp_match(const OP_t &X) : X(X) {}
1062 
1063   template <typename OpTy> bool match(OpTy *V) {
1064     if (auto *I = dyn_cast<UnaryOperator>(V))
1065       return X.match(I->getOperand(0));
1066     return false;
1067   }
1068 };
1069 
1070 template <typename OP_t> inline AnyUnaryOp_match<OP_t> m_UnOp(const OP_t &X) {
1071   return AnyUnaryOp_match<OP_t>(X);
1072 }
1073 
1074 //===----------------------------------------------------------------------===//
1075 // Matchers for specific binary operators.
1076 //
1077 
1078 template <typename LHS_t, typename RHS_t, unsigned Opcode,
1079           bool Commutable = false>
1080 struct BinaryOp_match {
1081   LHS_t L;
1082   RHS_t R;
1083 
1084   // The evaluation order is always stable, regardless of Commutability.
1085   // The LHS is always matched first.
1086   BinaryOp_match(const LHS_t &LHS, const RHS_t &RHS) : L(LHS), R(RHS) {}
1087 
1088   template <typename OpTy> inline bool match(unsigned Opc, OpTy *V) {
1089     if (V->getValueID() == Value::InstructionVal + Opc) {
1090       auto *I = cast<BinaryOperator>(V);
1091       return (L.match(I->getOperand(0)) && R.match(I->getOperand(1))) ||
1092              (Commutable && L.match(I->getOperand(1)) &&
1093               R.match(I->getOperand(0)));
1094     }
1095     return false;
1096   }
1097 
1098   template <typename OpTy> bool match(OpTy *V) { return match(Opcode, V); }
1099 };
1100 
1101 template <typename LHS, typename RHS>
1102 inline BinaryOp_match<LHS, RHS, Instruction::Add> m_Add(const LHS &L,
1103                                                         const RHS &R) {
1104   return BinaryOp_match<LHS, RHS, Instruction::Add>(L, R);
1105 }
1106 
1107 template <typename LHS, typename RHS>
1108 inline BinaryOp_match<LHS, RHS, Instruction::FAdd> m_FAdd(const LHS &L,
1109                                                           const RHS &R) {
1110   return BinaryOp_match<LHS, RHS, Instruction::FAdd>(L, R);
1111 }
1112 
1113 template <typename LHS, typename RHS>
1114 inline BinaryOp_match<LHS, RHS, Instruction::Sub> m_Sub(const LHS &L,
1115                                                         const RHS &R) {
1116   return BinaryOp_match<LHS, RHS, Instruction::Sub>(L, R);
1117 }
1118 
1119 template <typename LHS, typename RHS>
1120 inline BinaryOp_match<LHS, RHS, Instruction::FSub> m_FSub(const LHS &L,
1121                                                           const RHS &R) {
1122   return BinaryOp_match<LHS, RHS, Instruction::FSub>(L, R);
1123 }
1124 
1125 template <typename Op_t> struct FNeg_match {
1126   Op_t X;
1127 
1128   FNeg_match(const Op_t &Op) : X(Op) {}
1129   template <typename OpTy> bool match(OpTy *V) {
1130     auto *FPMO = dyn_cast<FPMathOperator>(V);
1131     if (!FPMO)
1132       return false;
1133 
1134     if (FPMO->getOpcode() == Instruction::FNeg)
1135       return X.match(FPMO->getOperand(0));
1136 
1137     if (FPMO->getOpcode() == Instruction::FSub) {
1138       if (FPMO->hasNoSignedZeros()) {
1139         // With 'nsz', any zero goes.
1140         if (!cstfp_pred_ty<is_any_zero_fp>().match(FPMO->getOperand(0)))
1141           return false;
1142       } else {
1143         // Without 'nsz', we need fsub -0.0, X exactly.
1144         if (!cstfp_pred_ty<is_neg_zero_fp>().match(FPMO->getOperand(0)))
1145           return false;
1146       }
1147 
1148       return X.match(FPMO->getOperand(1));
1149     }
1150 
1151     return false;
1152   }
1153 };
1154 
1155 /// Match 'fneg X' as 'fsub -0.0, X'.
1156 template <typename OpTy> inline FNeg_match<OpTy> m_FNeg(const OpTy &X) {
1157   return FNeg_match<OpTy>(X);
1158 }
1159 
1160 /// Match 'fneg X' as 'fsub +-0.0, X'.
1161 template <typename RHS>
1162 inline BinaryOp_match<cstfp_pred_ty<is_any_zero_fp>, RHS, Instruction::FSub>
1163 m_FNegNSZ(const RHS &X) {
1164   return m_FSub(m_AnyZeroFP(), X);
1165 }
1166 
1167 template <typename LHS, typename RHS>
1168 inline BinaryOp_match<LHS, RHS, Instruction::Mul> m_Mul(const LHS &L,
1169                                                         const RHS &R) {
1170   return BinaryOp_match<LHS, RHS, Instruction::Mul>(L, R);
1171 }
1172 
1173 template <typename LHS, typename RHS>
1174 inline BinaryOp_match<LHS, RHS, Instruction::FMul> m_FMul(const LHS &L,
1175                                                           const RHS &R) {
1176   return BinaryOp_match<LHS, RHS, Instruction::FMul>(L, R);
1177 }
1178 
1179 template <typename LHS, typename RHS>
1180 inline BinaryOp_match<LHS, RHS, Instruction::UDiv> m_UDiv(const LHS &L,
1181                                                           const RHS &R) {
1182   return BinaryOp_match<LHS, RHS, Instruction::UDiv>(L, R);
1183 }
1184 
1185 template <typename LHS, typename RHS>
1186 inline BinaryOp_match<LHS, RHS, Instruction::SDiv> m_SDiv(const LHS &L,
1187                                                           const RHS &R) {
1188   return BinaryOp_match<LHS, RHS, Instruction::SDiv>(L, R);
1189 }
1190 
1191 template <typename LHS, typename RHS>
1192 inline BinaryOp_match<LHS, RHS, Instruction::FDiv> m_FDiv(const LHS &L,
1193                                                           const RHS &R) {
1194   return BinaryOp_match<LHS, RHS, Instruction::FDiv>(L, R);
1195 }
1196 
1197 template <typename LHS, typename RHS>
1198 inline BinaryOp_match<LHS, RHS, Instruction::URem> m_URem(const LHS &L,
1199                                                           const RHS &R) {
1200   return BinaryOp_match<LHS, RHS, Instruction::URem>(L, R);
1201 }
1202 
1203 template <typename LHS, typename RHS>
1204 inline BinaryOp_match<LHS, RHS, Instruction::SRem> m_SRem(const LHS &L,
1205                                                           const RHS &R) {
1206   return BinaryOp_match<LHS, RHS, Instruction::SRem>(L, R);
1207 }
1208 
1209 template <typename LHS, typename RHS>
1210 inline BinaryOp_match<LHS, RHS, Instruction::FRem> m_FRem(const LHS &L,
1211                                                           const RHS &R) {
1212   return BinaryOp_match<LHS, RHS, Instruction::FRem>(L, R);
1213 }
1214 
1215 template <typename LHS, typename RHS>
1216 inline BinaryOp_match<LHS, RHS, Instruction::And> m_And(const LHS &L,
1217                                                         const RHS &R) {
1218   return BinaryOp_match<LHS, RHS, Instruction::And>(L, R);
1219 }
1220 
1221 template <typename LHS, typename RHS>
1222 inline BinaryOp_match<LHS, RHS, Instruction::Or> m_Or(const LHS &L,
1223                                                       const RHS &R) {
1224   return BinaryOp_match<LHS, RHS, Instruction::Or>(L, R);
1225 }
1226 
1227 template <typename LHS, typename RHS>
1228 inline BinaryOp_match<LHS, RHS, Instruction::Xor> m_Xor(const LHS &L,
1229                                                         const RHS &R) {
1230   return BinaryOp_match<LHS, RHS, Instruction::Xor>(L, R);
1231 }
1232 
1233 template <typename LHS, typename RHS>
1234 inline BinaryOp_match<LHS, RHS, Instruction::Shl> m_Shl(const LHS &L,
1235                                                         const RHS &R) {
1236   return BinaryOp_match<LHS, RHS, Instruction::Shl>(L, R);
1237 }
1238 
1239 template <typename LHS, typename RHS>
1240 inline BinaryOp_match<LHS, RHS, Instruction::LShr> m_LShr(const LHS &L,
1241                                                           const RHS &R) {
1242   return BinaryOp_match<LHS, RHS, Instruction::LShr>(L, R);
1243 }
1244 
1245 template <typename LHS, typename RHS>
1246 inline BinaryOp_match<LHS, RHS, Instruction::AShr> m_AShr(const LHS &L,
1247                                                           const RHS &R) {
1248   return BinaryOp_match<LHS, RHS, Instruction::AShr>(L, R);
1249 }
1250 
1251 template <typename LHS_t, typename RHS_t, unsigned Opcode,
1252           unsigned WrapFlags = 0, bool Commutable = false>
1253 struct OverflowingBinaryOp_match {
1254   LHS_t L;
1255   RHS_t R;
1256 
1257   OverflowingBinaryOp_match(const LHS_t &LHS, const RHS_t &RHS)
1258       : L(LHS), R(RHS) {}
1259 
1260   template <typename OpTy> bool match(OpTy *V) {
1261     if (auto *Op = dyn_cast<OverflowingBinaryOperator>(V)) {
1262       if (Op->getOpcode() != Opcode)
1263         return false;
1264       if ((WrapFlags & OverflowingBinaryOperator::NoUnsignedWrap) &&
1265           !Op->hasNoUnsignedWrap())
1266         return false;
1267       if ((WrapFlags & OverflowingBinaryOperator::NoSignedWrap) &&
1268           !Op->hasNoSignedWrap())
1269         return false;
1270       return (L.match(Op->getOperand(0)) && R.match(Op->getOperand(1))) ||
1271              (Commutable && L.match(Op->getOperand(1)) &&
1272               R.match(Op->getOperand(0)));
1273     }
1274     return false;
1275   }
1276 };
1277 
1278 template <typename LHS, typename RHS>
1279 inline OverflowingBinaryOp_match<LHS, RHS, Instruction::Add,
1280                                  OverflowingBinaryOperator::NoSignedWrap>
1281 m_NSWAdd(const LHS &L, const RHS &R) {
1282   return OverflowingBinaryOp_match<LHS, RHS, Instruction::Add,
1283                                    OverflowingBinaryOperator::NoSignedWrap>(L,
1284                                                                             R);
1285 }
1286 template <typename LHS, typename RHS>
1287 inline OverflowingBinaryOp_match<LHS, RHS, Instruction::Sub,
1288                                  OverflowingBinaryOperator::NoSignedWrap>
1289 m_NSWSub(const LHS &L, const RHS &R) {
1290   return OverflowingBinaryOp_match<LHS, RHS, Instruction::Sub,
1291                                    OverflowingBinaryOperator::NoSignedWrap>(L,
1292                                                                             R);
1293 }
1294 template <typename LHS, typename RHS>
1295 inline OverflowingBinaryOp_match<LHS, RHS, Instruction::Mul,
1296                                  OverflowingBinaryOperator::NoSignedWrap>
1297 m_NSWMul(const LHS &L, const RHS &R) {
1298   return OverflowingBinaryOp_match<LHS, RHS, Instruction::Mul,
1299                                    OverflowingBinaryOperator::NoSignedWrap>(L,
1300                                                                             R);
1301 }
1302 template <typename LHS, typename RHS>
1303 inline OverflowingBinaryOp_match<LHS, RHS, Instruction::Shl,
1304                                  OverflowingBinaryOperator::NoSignedWrap>
1305 m_NSWShl(const LHS &L, const RHS &R) {
1306   return OverflowingBinaryOp_match<LHS, RHS, Instruction::Shl,
1307                                    OverflowingBinaryOperator::NoSignedWrap>(L,
1308                                                                             R);
1309 }
1310 
1311 template <typename LHS, typename RHS>
1312 inline OverflowingBinaryOp_match<LHS, RHS, Instruction::Add,
1313                                  OverflowingBinaryOperator::NoUnsignedWrap>
1314 m_NUWAdd(const LHS &L, const RHS &R) {
1315   return OverflowingBinaryOp_match<LHS, RHS, Instruction::Add,
1316                                    OverflowingBinaryOperator::NoUnsignedWrap>(
1317       L, R);
1318 }
1319 
1320 template <typename LHS, typename RHS>
1321 inline OverflowingBinaryOp_match<
1322     LHS, RHS, Instruction::Add, OverflowingBinaryOperator::NoUnsignedWrap, true>
1323 m_c_NUWAdd(const LHS &L, const RHS &R) {
1324   return OverflowingBinaryOp_match<LHS, RHS, Instruction::Add,
1325                                    OverflowingBinaryOperator::NoUnsignedWrap,
1326                                    true>(L, R);
1327 }
1328 
1329 template <typename LHS, typename RHS>
1330 inline OverflowingBinaryOp_match<LHS, RHS, Instruction::Sub,
1331                                  OverflowingBinaryOperator::NoUnsignedWrap>
1332 m_NUWSub(const LHS &L, const RHS &R) {
1333   return OverflowingBinaryOp_match<LHS, RHS, Instruction::Sub,
1334                                    OverflowingBinaryOperator::NoUnsignedWrap>(
1335       L, R);
1336 }
1337 template <typename LHS, typename RHS>
1338 inline OverflowingBinaryOp_match<LHS, RHS, Instruction::Mul,
1339                                  OverflowingBinaryOperator::NoUnsignedWrap>
1340 m_NUWMul(const LHS &L, const RHS &R) {
1341   return OverflowingBinaryOp_match<LHS, RHS, Instruction::Mul,
1342                                    OverflowingBinaryOperator::NoUnsignedWrap>(
1343       L, R);
1344 }
1345 template <typename LHS, typename RHS>
1346 inline OverflowingBinaryOp_match<LHS, RHS, Instruction::Shl,
1347                                  OverflowingBinaryOperator::NoUnsignedWrap>
1348 m_NUWShl(const LHS &L, const RHS &R) {
1349   return OverflowingBinaryOp_match<LHS, RHS, Instruction::Shl,
1350                                    OverflowingBinaryOperator::NoUnsignedWrap>(
1351       L, R);
1352 }
1353 
1354 template <typename LHS_t, typename RHS_t, bool Commutable = false>
1355 struct SpecificBinaryOp_match
1356     : public BinaryOp_match<LHS_t, RHS_t, 0, Commutable> {
1357   unsigned Opcode;
1358 
1359   SpecificBinaryOp_match(unsigned Opcode, const LHS_t &LHS, const RHS_t &RHS)
1360       : BinaryOp_match<LHS_t, RHS_t, 0, Commutable>(LHS, RHS), Opcode(Opcode) {}
1361 
1362   template <typename OpTy> bool match(OpTy *V) {
1363     return BinaryOp_match<LHS_t, RHS_t, 0, Commutable>::match(Opcode, V);
1364   }
1365 };
1366 
1367 /// Matches a specific opcode.
1368 template <typename LHS, typename RHS>
1369 inline SpecificBinaryOp_match<LHS, RHS> m_BinOp(unsigned Opcode, const LHS &L,
1370                                                 const RHS &R) {
1371   return SpecificBinaryOp_match<LHS, RHS>(Opcode, L, R);
1372 }
1373 
1374 template <typename LHS, typename RHS, bool Commutable = false>
1375 struct DisjointOr_match {
1376   LHS L;
1377   RHS R;
1378 
1379   DisjointOr_match(const LHS &L, const RHS &R) : L(L), R(R) {}
1380 
1381   template <typename OpTy> bool match(OpTy *V) {
1382     if (auto *PDI = dyn_cast<PossiblyDisjointInst>(V)) {
1383       assert(PDI->getOpcode() == Instruction::Or && "Only or can be disjoint");
1384       if (!PDI->isDisjoint())
1385         return false;
1386       return (L.match(PDI->getOperand(0)) && R.match(PDI->getOperand(1))) ||
1387              (Commutable && L.match(PDI->getOperand(1)) &&
1388               R.match(PDI->getOperand(0)));
1389     }
1390     return false;
1391   }
1392 };
1393 
1394 template <typename LHS, typename RHS>
1395 inline DisjointOr_match<LHS, RHS> m_DisjointOr(const LHS &L, const RHS &R) {
1396   return DisjointOr_match<LHS, RHS>(L, R);
1397 }
1398 
1399 template <typename LHS, typename RHS>
1400 inline DisjointOr_match<LHS, RHS, true> m_c_DisjointOr(const LHS &L,
1401                                                        const RHS &R) {
1402   return DisjointOr_match<LHS, RHS, true>(L, R);
1403 }
1404 
1405 /// Match either "add" or "or disjoint".
1406 template <typename LHS, typename RHS>
1407 inline match_combine_or<BinaryOp_match<LHS, RHS, Instruction::Add>,
1408                         DisjointOr_match<LHS, RHS>>
1409 m_AddLike(const LHS &L, const RHS &R) {
1410   return m_CombineOr(m_Add(L, R), m_DisjointOr(L, R));
1411 }
1412 
1413 /// Match either "add nsw" or "or disjoint"
1414 template <typename LHS, typename RHS>
1415 inline match_combine_or<
1416     OverflowingBinaryOp_match<LHS, RHS, Instruction::Add,
1417                               OverflowingBinaryOperator::NoSignedWrap>,
1418     DisjointOr_match<LHS, RHS>>
1419 m_NSWAddLike(const LHS &L, const RHS &R) {
1420   return m_CombineOr(m_NSWAdd(L, R), m_DisjointOr(L, R));
1421 }
1422 
1423 /// Match either "add nuw" or "or disjoint"
1424 template <typename LHS, typename RHS>
1425 inline match_combine_or<
1426     OverflowingBinaryOp_match<LHS, RHS, Instruction::Add,
1427                               OverflowingBinaryOperator::NoUnsignedWrap>,
1428     DisjointOr_match<LHS, RHS>>
1429 m_NUWAddLike(const LHS &L, const RHS &R) {
1430   return m_CombineOr(m_NUWAdd(L, R), m_DisjointOr(L, R));
1431 }
1432 
1433 template <typename LHS, typename RHS>
1434 struct XorLike_match {
1435   LHS L;
1436   RHS R;
1437 
1438   XorLike_match(const LHS &L, const RHS &R) : L(L), R(R) {}
1439 
1440   template <typename OpTy> bool match(OpTy *V) {
1441     if (auto *Op = dyn_cast<BinaryOperator>(V)) {
1442       if (Op->getOpcode() == Instruction::Sub && Op->hasNoUnsignedWrap() &&
1443           PatternMatch::match(Op->getOperand(0), m_LowBitMask()))
1444           ; // Pass
1445       else if (Op->getOpcode() != Instruction::Xor)
1446         return false;
1447       return (L.match(Op->getOperand(0)) && R.match(Op->getOperand(1))) ||
1448              (L.match(Op->getOperand(1)) && R.match(Op->getOperand(0)));
1449     }
1450     return false;
1451   }
1452 };
1453 
1454 /// Match either `(xor L, R)`, `(xor R, L)` or `(sub nuw R, L)` iff `R.isMask()`
1455 /// Only commutative matcher as the `sub` will need to swap the L and R.
1456 template <typename LHS, typename RHS>
1457 inline auto m_c_XorLike(const LHS &L, const RHS &R) {
1458   return XorLike_match<LHS, RHS>(L, R);
1459 }
1460 
1461 //===----------------------------------------------------------------------===//
1462 // Class that matches a group of binary opcodes.
1463 //
1464 template <typename LHS_t, typename RHS_t, typename Predicate,
1465           bool Commutable = false>
1466 struct BinOpPred_match : Predicate {
1467   LHS_t L;
1468   RHS_t R;
1469 
1470   BinOpPred_match(const LHS_t &LHS, const RHS_t &RHS) : L(LHS), R(RHS) {}
1471 
1472   template <typename OpTy> bool match(OpTy *V) {
1473     if (auto *I = dyn_cast<Instruction>(V))
1474       return this->isOpType(I->getOpcode()) &&
1475              ((L.match(I->getOperand(0)) && R.match(I->getOperand(1))) ||
1476               (Commutable && L.match(I->getOperand(1)) &&
1477                R.match(I->getOperand(0))));
1478     return false;
1479   }
1480 };
1481 
1482 struct is_shift_op {
1483   bool isOpType(unsigned Opcode) { return Instruction::isShift(Opcode); }
1484 };
1485 
1486 struct is_right_shift_op {
1487   bool isOpType(unsigned Opcode) {
1488     return Opcode == Instruction::LShr || Opcode == Instruction::AShr;
1489   }
1490 };
1491 
1492 struct is_logical_shift_op {
1493   bool isOpType(unsigned Opcode) {
1494     return Opcode == Instruction::LShr || Opcode == Instruction::Shl;
1495   }
1496 };
1497 
1498 struct is_bitwiselogic_op {
1499   bool isOpType(unsigned Opcode) {
1500     return Instruction::isBitwiseLogicOp(Opcode);
1501   }
1502 };
1503 
1504 struct is_idiv_op {
1505   bool isOpType(unsigned Opcode) {
1506     return Opcode == Instruction::SDiv || Opcode == Instruction::UDiv;
1507   }
1508 };
1509 
1510 struct is_irem_op {
1511   bool isOpType(unsigned Opcode) {
1512     return Opcode == Instruction::SRem || Opcode == Instruction::URem;
1513   }
1514 };
1515 
1516 /// Matches shift operations.
1517 template <typename LHS, typename RHS>
1518 inline BinOpPred_match<LHS, RHS, is_shift_op> m_Shift(const LHS &L,
1519                                                       const RHS &R) {
1520   return BinOpPred_match<LHS, RHS, is_shift_op>(L, R);
1521 }
1522 
1523 /// Matches logical shift operations.
1524 template <typename LHS, typename RHS>
1525 inline BinOpPred_match<LHS, RHS, is_right_shift_op> m_Shr(const LHS &L,
1526                                                           const RHS &R) {
1527   return BinOpPred_match<LHS, RHS, is_right_shift_op>(L, R);
1528 }
1529 
1530 /// Matches logical shift operations.
1531 template <typename LHS, typename RHS>
1532 inline BinOpPred_match<LHS, RHS, is_logical_shift_op>
1533 m_LogicalShift(const LHS &L, const RHS &R) {
1534   return BinOpPred_match<LHS, RHS, is_logical_shift_op>(L, R);
1535 }
1536 
1537 /// Matches bitwise logic operations.
1538 template <typename LHS, typename RHS>
1539 inline BinOpPred_match<LHS, RHS, is_bitwiselogic_op>
1540 m_BitwiseLogic(const LHS &L, const RHS &R) {
1541   return BinOpPred_match<LHS, RHS, is_bitwiselogic_op>(L, R);
1542 }
1543 
1544 /// Matches bitwise logic operations in either order.
1545 template <typename LHS, typename RHS>
1546 inline BinOpPred_match<LHS, RHS, is_bitwiselogic_op, true>
1547 m_c_BitwiseLogic(const LHS &L, const RHS &R) {
1548   return BinOpPred_match<LHS, RHS, is_bitwiselogic_op, true>(L, R);
1549 }
1550 
1551 /// Matches integer division operations.
1552 template <typename LHS, typename RHS>
1553 inline BinOpPred_match<LHS, RHS, is_idiv_op> m_IDiv(const LHS &L,
1554                                                     const RHS &R) {
1555   return BinOpPred_match<LHS, RHS, is_idiv_op>(L, R);
1556 }
1557 
1558 /// Matches integer remainder operations.
1559 template <typename LHS, typename RHS>
1560 inline BinOpPred_match<LHS, RHS, is_irem_op> m_IRem(const LHS &L,
1561                                                     const RHS &R) {
1562   return BinOpPred_match<LHS, RHS, is_irem_op>(L, R);
1563 }
1564 
1565 //===----------------------------------------------------------------------===//
1566 // Class that matches exact binary ops.
1567 //
1568 template <typename SubPattern_t> struct Exact_match {
1569   SubPattern_t SubPattern;
1570 
1571   Exact_match(const SubPattern_t &SP) : SubPattern(SP) {}
1572 
1573   template <typename OpTy> bool match(OpTy *V) {
1574     if (auto *PEO = dyn_cast<PossiblyExactOperator>(V))
1575       return PEO->isExact() && SubPattern.match(V);
1576     return false;
1577   }
1578 };
1579 
1580 template <typename T> inline Exact_match<T> m_Exact(const T &SubPattern) {
1581   return SubPattern;
1582 }
1583 
1584 //===----------------------------------------------------------------------===//
1585 // Matchers for CmpInst classes
1586 //
1587 
1588 template <typename LHS_t, typename RHS_t, typename Class,
1589           bool Commutable = false>
1590 struct CmpClass_match {
1591   CmpPredicate *Predicate;
1592   LHS_t L;
1593   RHS_t R;
1594 
1595   // The evaluation order is always stable, regardless of Commutability.
1596   // The LHS is always matched first.
1597   CmpClass_match(CmpPredicate &Pred, const LHS_t &LHS, const RHS_t &RHS)
1598       : Predicate(&Pred), L(LHS), R(RHS) {}
1599   CmpClass_match(const LHS_t &LHS, const RHS_t &RHS)
1600       : Predicate(nullptr), L(LHS), R(RHS) {}
1601 
1602   template <typename OpTy> bool match(OpTy *V) {
1603     if (auto *I = dyn_cast<Class>(V)) {
1604       if (L.match(I->getOperand(0)) && R.match(I->getOperand(1))) {
1605         if (Predicate)
1606           *Predicate = CmpPredicate::get(I);
1607         return true;
1608       }
1609       if (Commutable && L.match(I->getOperand(1)) &&
1610           R.match(I->getOperand(0))) {
1611         if (Predicate)
1612           *Predicate = CmpPredicate::getSwapped(I);
1613         return true;
1614       }
1615     }
1616     return false;
1617   }
1618 };
1619 
1620 template <typename LHS, typename RHS>
1621 inline CmpClass_match<LHS, RHS, CmpInst> m_Cmp(CmpPredicate &Pred, const LHS &L,
1622                                                const RHS &R) {
1623   return CmpClass_match<LHS, RHS, CmpInst>(Pred, L, R);
1624 }
1625 
1626 template <typename LHS, typename RHS>
1627 inline CmpClass_match<LHS, RHS, ICmpInst> m_ICmp(CmpPredicate &Pred,
1628                                                  const LHS &L, const RHS &R) {
1629   return CmpClass_match<LHS, RHS, ICmpInst>(Pred, L, R);
1630 }
1631 
1632 template <typename LHS, typename RHS>
1633 inline CmpClass_match<LHS, RHS, FCmpInst> m_FCmp(CmpPredicate &Pred,
1634                                                  const LHS &L, const RHS &R) {
1635   return CmpClass_match<LHS, RHS, FCmpInst>(Pred, L, R);
1636 }
1637 
1638 template <typename LHS, typename RHS>
1639 inline CmpClass_match<LHS, RHS, CmpInst> m_Cmp(const LHS &L, const RHS &R) {
1640   return CmpClass_match<LHS, RHS, CmpInst>(L, R);
1641 }
1642 
1643 template <typename LHS, typename RHS>
1644 inline CmpClass_match<LHS, RHS, ICmpInst> m_ICmp(const LHS &L, const RHS &R) {
1645   return CmpClass_match<LHS, RHS, ICmpInst>(L, R);
1646 }
1647 
1648 template <typename LHS, typename RHS>
1649 inline CmpClass_match<LHS, RHS, FCmpInst> m_FCmp(const LHS &L, const RHS &R) {
1650   return CmpClass_match<LHS, RHS, FCmpInst>(L, R);
1651 }
1652 
1653 // Same as CmpClass, but instead of saving Pred as out output variable, match a
1654 // specific input pred for equality.
1655 template <typename LHS_t, typename RHS_t, typename Class,
1656           bool Commutable = false>
1657 struct SpecificCmpClass_match {
1658   const CmpPredicate Predicate;
1659   LHS_t L;
1660   RHS_t R;
1661 
1662   SpecificCmpClass_match(CmpPredicate Pred, const LHS_t &LHS, const RHS_t &RHS)
1663       : Predicate(Pred), L(LHS), R(RHS) {}
1664 
1665   template <typename OpTy> bool match(OpTy *V) {
1666     if (auto *I = dyn_cast<Class>(V)) {
1667       if (CmpPredicate::getMatching(CmpPredicate::get(I), Predicate) &&
1668           L.match(I->getOperand(0)) && R.match(I->getOperand(1)))
1669         return true;
1670       if constexpr (Commutable) {
1671         if (CmpPredicate::getMatching(CmpPredicate::get(I),
1672                                       CmpPredicate::getSwapped(Predicate)) &&
1673             L.match(I->getOperand(1)) && R.match(I->getOperand(0)))
1674           return true;
1675       }
1676     }
1677 
1678     return false;
1679   }
1680 };
1681 
1682 template <typename LHS, typename RHS>
1683 inline SpecificCmpClass_match<LHS, RHS, CmpInst>
1684 m_SpecificCmp(CmpPredicate MatchPred, const LHS &L, const RHS &R) {
1685   return SpecificCmpClass_match<LHS, RHS, CmpInst>(MatchPred, L, R);
1686 }
1687 
1688 template <typename LHS, typename RHS>
1689 inline SpecificCmpClass_match<LHS, RHS, ICmpInst>
1690 m_SpecificICmp(CmpPredicate MatchPred, const LHS &L, const RHS &R) {
1691   return SpecificCmpClass_match<LHS, RHS, ICmpInst>(MatchPred, L, R);
1692 }
1693 
1694 template <typename LHS, typename RHS>
1695 inline SpecificCmpClass_match<LHS, RHS, ICmpInst, true>
1696 m_c_SpecificICmp(CmpPredicate MatchPred, const LHS &L, const RHS &R) {
1697   return SpecificCmpClass_match<LHS, RHS, ICmpInst, true>(MatchPred, L, R);
1698 }
1699 
1700 template <typename LHS, typename RHS>
1701 inline SpecificCmpClass_match<LHS, RHS, FCmpInst>
1702 m_SpecificFCmp(CmpPredicate MatchPred, const LHS &L, const RHS &R) {
1703   return SpecificCmpClass_match<LHS, RHS, FCmpInst>(MatchPred, L, R);
1704 }
1705 
1706 //===----------------------------------------------------------------------===//
1707 // Matchers for instructions with a given opcode and number of operands.
1708 //
1709 
1710 /// Matches instructions with Opcode and three operands.
1711 template <typename T0, unsigned Opcode> struct OneOps_match {
1712   T0 Op1;
1713 
1714   OneOps_match(const T0 &Op1) : Op1(Op1) {}
1715 
1716   template <typename OpTy> bool match(OpTy *V) {
1717     if (V->getValueID() == Value::InstructionVal + Opcode) {
1718       auto *I = cast<Instruction>(V);
1719       return Op1.match(I->getOperand(0));
1720     }
1721     return false;
1722   }
1723 };
1724 
1725 /// Matches instructions with Opcode and three operands.
1726 template <typename T0, typename T1, unsigned Opcode> struct TwoOps_match {
1727   T0 Op1;
1728   T1 Op2;
1729 
1730   TwoOps_match(const T0 &Op1, const T1 &Op2) : Op1(Op1), Op2(Op2) {}
1731 
1732   template <typename OpTy> bool match(OpTy *V) {
1733     if (V->getValueID() == Value::InstructionVal + Opcode) {
1734       auto *I = cast<Instruction>(V);
1735       return Op1.match(I->getOperand(0)) && Op2.match(I->getOperand(1));
1736     }
1737     return false;
1738   }
1739 };
1740 
1741 /// Matches instructions with Opcode and three operands.
1742 template <typename T0, typename T1, typename T2, unsigned Opcode,
1743           bool CommutableOp2Op3 = false>
1744 struct ThreeOps_match {
1745   T0 Op1;
1746   T1 Op2;
1747   T2 Op3;
1748 
1749   ThreeOps_match(const T0 &Op1, const T1 &Op2, const T2 &Op3)
1750       : Op1(Op1), Op2(Op2), Op3(Op3) {}
1751 
1752   template <typename OpTy> bool match(OpTy *V) {
1753     if (V->getValueID() == Value::InstructionVal + Opcode) {
1754       auto *I = cast<Instruction>(V);
1755       if (!Op1.match(I->getOperand(0)))
1756         return false;
1757       if (Op2.match(I->getOperand(1)) && Op3.match(I->getOperand(2)))
1758         return true;
1759       return CommutableOp2Op3 && Op2.match(I->getOperand(2)) &&
1760              Op3.match(I->getOperand(1));
1761     }
1762     return false;
1763   }
1764 };
1765 
1766 /// Matches instructions with Opcode and any number of operands
1767 template <unsigned Opcode, typename... OperandTypes> struct AnyOps_match {
1768   std::tuple<OperandTypes...> Operands;
1769 
1770   AnyOps_match(const OperandTypes &...Ops) : Operands(Ops...) {}
1771 
1772   // Operand matching works by recursively calling match_operands, matching the
1773   // operands left to right. The first version is called for each operand but
1774   // the last, for which the second version is called. The second version of
1775   // match_operands is also used to match each individual operand.
1776   template <int Idx, int Last>
1777   std::enable_if_t<Idx != Last, bool> match_operands(const Instruction *I) {
1778     return match_operands<Idx, Idx>(I) && match_operands<Idx + 1, Last>(I);
1779   }
1780 
1781   template <int Idx, int Last>
1782   std::enable_if_t<Idx == Last, bool> match_operands(const Instruction *I) {
1783     return std::get<Idx>(Operands).match(I->getOperand(Idx));
1784   }
1785 
1786   template <typename OpTy> bool match(OpTy *V) {
1787     if (V->getValueID() == Value::InstructionVal + Opcode) {
1788       auto *I = cast<Instruction>(V);
1789       return I->getNumOperands() == sizeof...(OperandTypes) &&
1790              match_operands<0, sizeof...(OperandTypes) - 1>(I);
1791     }
1792     return false;
1793   }
1794 };
1795 
1796 /// Matches SelectInst.
1797 template <typename Cond, typename LHS, typename RHS>
1798 inline ThreeOps_match<Cond, LHS, RHS, Instruction::Select>
1799 m_Select(const Cond &C, const LHS &L, const RHS &R) {
1800   return ThreeOps_match<Cond, LHS, RHS, Instruction::Select>(C, L, R);
1801 }
1802 
1803 /// This matches a select of two constants, e.g.:
1804 /// m_SelectCst<-1, 0>(m_Value(V))
1805 template <int64_t L, int64_t R, typename Cond>
1806 inline ThreeOps_match<Cond, constantint_match<L>, constantint_match<R>,
1807                       Instruction::Select>
1808 m_SelectCst(const Cond &C) {
1809   return m_Select(C, m_ConstantInt<L>(), m_ConstantInt<R>());
1810 }
1811 
1812 /// Match Select(C, LHS, RHS) or Select(C, RHS, LHS)
1813 template <typename LHS, typename RHS>
1814 inline ThreeOps_match<decltype(m_Value()), LHS, RHS, Instruction::Select, true>
1815 m_c_Select(const LHS &L, const RHS &R) {
1816   return ThreeOps_match<decltype(m_Value()), LHS, RHS, Instruction::Select,
1817                         true>(m_Value(), L, R);
1818 }
1819 
1820 /// Matches FreezeInst.
1821 template <typename OpTy>
1822 inline OneOps_match<OpTy, Instruction::Freeze> m_Freeze(const OpTy &Op) {
1823   return OneOps_match<OpTy, Instruction::Freeze>(Op);
1824 }
1825 
1826 /// Matches InsertElementInst.
1827 template <typename Val_t, typename Elt_t, typename Idx_t>
1828 inline ThreeOps_match<Val_t, Elt_t, Idx_t, Instruction::InsertElement>
1829 m_InsertElt(const Val_t &Val, const Elt_t &Elt, const Idx_t &Idx) {
1830   return ThreeOps_match<Val_t, Elt_t, Idx_t, Instruction::InsertElement>(
1831       Val, Elt, Idx);
1832 }
1833 
1834 /// Matches ExtractElementInst.
1835 template <typename Val_t, typename Idx_t>
1836 inline TwoOps_match<Val_t, Idx_t, Instruction::ExtractElement>
1837 m_ExtractElt(const Val_t &Val, const Idx_t &Idx) {
1838   return TwoOps_match<Val_t, Idx_t, Instruction::ExtractElement>(Val, Idx);
1839 }
1840 
1841 /// Matches shuffle.
1842 template <typename T0, typename T1, typename T2> struct Shuffle_match {
1843   T0 Op1;
1844   T1 Op2;
1845   T2 Mask;
1846 
1847   Shuffle_match(const T0 &Op1, const T1 &Op2, const T2 &Mask)
1848       : Op1(Op1), Op2(Op2), Mask(Mask) {}
1849 
1850   template <typename OpTy> bool match(OpTy *V) {
1851     if (auto *I = dyn_cast<ShuffleVectorInst>(V)) {
1852       return Op1.match(I->getOperand(0)) && Op2.match(I->getOperand(1)) &&
1853              Mask.match(I->getShuffleMask());
1854     }
1855     return false;
1856   }
1857 };
1858 
1859 struct m_Mask {
1860   ArrayRef<int> &MaskRef;
1861   m_Mask(ArrayRef<int> &MaskRef) : MaskRef(MaskRef) {}
1862   bool match(ArrayRef<int> Mask) {
1863     MaskRef = Mask;
1864     return true;
1865   }
1866 };
1867 
1868 struct m_ZeroMask {
1869   bool match(ArrayRef<int> Mask) {
1870     return all_of(Mask, [](int Elem) { return Elem == 0 || Elem == -1; });
1871   }
1872 };
1873 
1874 struct m_SpecificMask {
1875   ArrayRef<int> Val;
1876   m_SpecificMask(ArrayRef<int> Val) : Val(Val) {}
1877   bool match(ArrayRef<int> Mask) { return Val == Mask; }
1878 };
1879 
1880 struct m_SplatOrPoisonMask {
1881   int &SplatIndex;
1882   m_SplatOrPoisonMask(int &SplatIndex) : SplatIndex(SplatIndex) {}
1883   bool match(ArrayRef<int> Mask) {
1884     const auto *First = find_if(Mask, [](int Elem) { return Elem != -1; });
1885     if (First == Mask.end())
1886       return false;
1887     SplatIndex = *First;
1888     return all_of(Mask,
1889                   [First](int Elem) { return Elem == *First || Elem == -1; });
1890   }
1891 };
1892 
1893 template <typename PointerOpTy, typename OffsetOpTy> struct PtrAdd_match {
1894   PointerOpTy PointerOp;
1895   OffsetOpTy OffsetOp;
1896 
1897   PtrAdd_match(const PointerOpTy &PointerOp, const OffsetOpTy &OffsetOp)
1898       : PointerOp(PointerOp), OffsetOp(OffsetOp) {}
1899 
1900   template <typename OpTy> bool match(OpTy *V) {
1901     auto *GEP = dyn_cast<GEPOperator>(V);
1902     return GEP && GEP->getSourceElementType()->isIntegerTy(8) &&
1903            PointerOp.match(GEP->getPointerOperand()) &&
1904            OffsetOp.match(GEP->idx_begin()->get());
1905   }
1906 };
1907 
1908 /// Matches ShuffleVectorInst independently of mask value.
1909 template <typename V1_t, typename V2_t>
1910 inline TwoOps_match<V1_t, V2_t, Instruction::ShuffleVector>
1911 m_Shuffle(const V1_t &v1, const V2_t &v2) {
1912   return TwoOps_match<V1_t, V2_t, Instruction::ShuffleVector>(v1, v2);
1913 }
1914 
1915 template <typename V1_t, typename V2_t, typename Mask_t>
1916 inline Shuffle_match<V1_t, V2_t, Mask_t>
1917 m_Shuffle(const V1_t &v1, const V2_t &v2, const Mask_t &mask) {
1918   return Shuffle_match<V1_t, V2_t, Mask_t>(v1, v2, mask);
1919 }
1920 
1921 /// Matches LoadInst.
1922 template <typename OpTy>
1923 inline OneOps_match<OpTy, Instruction::Load> m_Load(const OpTy &Op) {
1924   return OneOps_match<OpTy, Instruction::Load>(Op);
1925 }
1926 
1927 /// Matches StoreInst.
1928 template <typename ValueOpTy, typename PointerOpTy>
1929 inline TwoOps_match<ValueOpTy, PointerOpTy, Instruction::Store>
1930 m_Store(const ValueOpTy &ValueOp, const PointerOpTy &PointerOp) {
1931   return TwoOps_match<ValueOpTy, PointerOpTy, Instruction::Store>(ValueOp,
1932                                                                   PointerOp);
1933 }
1934 
1935 /// Matches GetElementPtrInst.
1936 template <typename... OperandTypes>
1937 inline auto m_GEP(const OperandTypes &...Ops) {
1938   return AnyOps_match<Instruction::GetElementPtr, OperandTypes...>(Ops...);
1939 }
1940 
1941 /// Matches GEP with i8 source element type
1942 template <typename PointerOpTy, typename OffsetOpTy>
1943 inline PtrAdd_match<PointerOpTy, OffsetOpTy>
1944 m_PtrAdd(const PointerOpTy &PointerOp, const OffsetOpTy &OffsetOp) {
1945   return PtrAdd_match<PointerOpTy, OffsetOpTy>(PointerOp, OffsetOp);
1946 }
1947 
1948 //===----------------------------------------------------------------------===//
1949 // Matchers for CastInst classes
1950 //
1951 
1952 template <typename Op_t, unsigned Opcode> struct CastOperator_match {
1953   Op_t Op;
1954 
1955   CastOperator_match(const Op_t &OpMatch) : Op(OpMatch) {}
1956 
1957   template <typename OpTy> bool match(OpTy *V) {
1958     if (auto *O = dyn_cast<Operator>(V))
1959       return O->getOpcode() == Opcode && Op.match(O->getOperand(0));
1960     return false;
1961   }
1962 };
1963 
1964 template <typename Op_t, typename Class> struct CastInst_match {
1965   Op_t Op;
1966 
1967   CastInst_match(const Op_t &OpMatch) : Op(OpMatch) {}
1968 
1969   template <typename OpTy> bool match(OpTy *V) {
1970     if (auto *I = dyn_cast<Class>(V))
1971       return Op.match(I->getOperand(0));
1972     return false;
1973   }
1974 };
1975 
1976 template <typename Op_t> struct PtrToIntSameSize_match {
1977   const DataLayout &DL;
1978   Op_t Op;
1979 
1980   PtrToIntSameSize_match(const DataLayout &DL, const Op_t &OpMatch)
1981       : DL(DL), Op(OpMatch) {}
1982 
1983   template <typename OpTy> bool match(OpTy *V) {
1984     if (auto *O = dyn_cast<Operator>(V))
1985       return O->getOpcode() == Instruction::PtrToInt &&
1986              DL.getTypeSizeInBits(O->getType()) ==
1987                  DL.getTypeSizeInBits(O->getOperand(0)->getType()) &&
1988              Op.match(O->getOperand(0));
1989     return false;
1990   }
1991 };
1992 
1993 template <typename Op_t> struct NNegZExt_match {
1994   Op_t Op;
1995 
1996   NNegZExt_match(const Op_t &OpMatch) : Op(OpMatch) {}
1997 
1998   template <typename OpTy> bool match(OpTy *V) {
1999     if (auto *I = dyn_cast<ZExtInst>(V))
2000       return I->hasNonNeg() && Op.match(I->getOperand(0));
2001     return false;
2002   }
2003 };
2004 
2005 template <typename Op_t, unsigned WrapFlags = 0> struct NoWrapTrunc_match {
2006   Op_t Op;
2007 
2008   NoWrapTrunc_match(const Op_t &OpMatch) : Op(OpMatch) {}
2009 
2010   template <typename OpTy> bool match(OpTy *V) {
2011     if (auto *I = dyn_cast<TruncInst>(V))
2012       return (I->getNoWrapKind() & WrapFlags) == WrapFlags &&
2013              Op.match(I->getOperand(0));
2014     return false;
2015   }
2016 };
2017 
2018 /// Matches BitCast.
2019 template <typename OpTy>
2020 inline CastOperator_match<OpTy, Instruction::BitCast>
2021 m_BitCast(const OpTy &Op) {
2022   return CastOperator_match<OpTy, Instruction::BitCast>(Op);
2023 }
2024 
2025 template <typename Op_t> struct ElementWiseBitCast_match {
2026   Op_t Op;
2027 
2028   ElementWiseBitCast_match(const Op_t &OpMatch) : Op(OpMatch) {}
2029 
2030   template <typename OpTy> bool match(OpTy *V) {
2031     auto *I = dyn_cast<BitCastInst>(V);
2032     if (!I)
2033       return false;
2034     Type *SrcType = I->getSrcTy();
2035     Type *DstType = I->getType();
2036     // Make sure the bitcast doesn't change between scalar and vector and
2037     // doesn't change the number of vector elements.
2038     if (SrcType->isVectorTy() != DstType->isVectorTy())
2039       return false;
2040     if (VectorType *SrcVecTy = dyn_cast<VectorType>(SrcType);
2041         SrcVecTy && SrcVecTy->getElementCount() !=
2042                         cast<VectorType>(DstType)->getElementCount())
2043       return false;
2044     return Op.match(I->getOperand(0));
2045   }
2046 };
2047 
2048 template <typename OpTy>
2049 inline ElementWiseBitCast_match<OpTy> m_ElementWiseBitCast(const OpTy &Op) {
2050   return ElementWiseBitCast_match<OpTy>(Op);
2051 }
2052 
2053 /// Matches PtrToInt.
2054 template <typename OpTy>
2055 inline CastOperator_match<OpTy, Instruction::PtrToInt>
2056 m_PtrToInt(const OpTy &Op) {
2057   return CastOperator_match<OpTy, Instruction::PtrToInt>(Op);
2058 }
2059 
2060 template <typename OpTy>
2061 inline PtrToIntSameSize_match<OpTy> m_PtrToIntSameSize(const DataLayout &DL,
2062                                                        const OpTy &Op) {
2063   return PtrToIntSameSize_match<OpTy>(DL, Op);
2064 }
2065 
2066 /// Matches IntToPtr.
2067 template <typename OpTy>
2068 inline CastOperator_match<OpTy, Instruction::IntToPtr>
2069 m_IntToPtr(const OpTy &Op) {
2070   return CastOperator_match<OpTy, Instruction::IntToPtr>(Op);
2071 }
2072 
2073 /// Matches Trunc.
2074 template <typename OpTy>
2075 inline CastInst_match<OpTy, TruncInst> m_Trunc(const OpTy &Op) {
2076   return CastInst_match<OpTy, TruncInst>(Op);
2077 }
2078 
2079 /// Matches trunc nuw.
2080 template <typename OpTy>
2081 inline NoWrapTrunc_match<OpTy, TruncInst::NoUnsignedWrap>
2082 m_NUWTrunc(const OpTy &Op) {
2083   return NoWrapTrunc_match<OpTy, TruncInst::NoUnsignedWrap>(Op);
2084 }
2085 
2086 /// Matches trunc nsw.
2087 template <typename OpTy>
2088 inline NoWrapTrunc_match<OpTy, TruncInst::NoSignedWrap>
2089 m_NSWTrunc(const OpTy &Op) {
2090   return NoWrapTrunc_match<OpTy, TruncInst::NoSignedWrap>(Op);
2091 }
2092 
2093 template <typename OpTy>
2094 inline match_combine_or<CastInst_match<OpTy, TruncInst>, OpTy>
2095 m_TruncOrSelf(const OpTy &Op) {
2096   return m_CombineOr(m_Trunc(Op), Op);
2097 }
2098 
2099 /// Matches SExt.
2100 template <typename OpTy>
2101 inline CastInst_match<OpTy, SExtInst> m_SExt(const OpTy &Op) {
2102   return CastInst_match<OpTy, SExtInst>(Op);
2103 }
2104 
2105 /// Matches ZExt.
2106 template <typename OpTy>
2107 inline CastInst_match<OpTy, ZExtInst> m_ZExt(const OpTy &Op) {
2108   return CastInst_match<OpTy, ZExtInst>(Op);
2109 }
2110 
2111 template <typename OpTy>
2112 inline NNegZExt_match<OpTy> m_NNegZExt(const OpTy &Op) {
2113   return NNegZExt_match<OpTy>(Op);
2114 }
2115 
2116 template <typename OpTy>
2117 inline match_combine_or<CastInst_match<OpTy, ZExtInst>, OpTy>
2118 m_ZExtOrSelf(const OpTy &Op) {
2119   return m_CombineOr(m_ZExt(Op), Op);
2120 }
2121 
2122 template <typename OpTy>
2123 inline match_combine_or<CastInst_match<OpTy, SExtInst>, OpTy>
2124 m_SExtOrSelf(const OpTy &Op) {
2125   return m_CombineOr(m_SExt(Op), Op);
2126 }
2127 
2128 /// Match either "sext" or "zext nneg".
2129 template <typename OpTy>
2130 inline match_combine_or<CastInst_match<OpTy, SExtInst>, NNegZExt_match<OpTy>>
2131 m_SExtLike(const OpTy &Op) {
2132   return m_CombineOr(m_SExt(Op), m_NNegZExt(Op));
2133 }
2134 
2135 template <typename OpTy>
2136 inline match_combine_or<CastInst_match<OpTy, ZExtInst>,
2137                         CastInst_match<OpTy, SExtInst>>
2138 m_ZExtOrSExt(const OpTy &Op) {
2139   return m_CombineOr(m_ZExt(Op), m_SExt(Op));
2140 }
2141 
2142 template <typename OpTy>
2143 inline match_combine_or<match_combine_or<CastInst_match<OpTy, ZExtInst>,
2144                                          CastInst_match<OpTy, SExtInst>>,
2145                         OpTy>
2146 m_ZExtOrSExtOrSelf(const OpTy &Op) {
2147   return m_CombineOr(m_ZExtOrSExt(Op), Op);
2148 }
2149 
2150 template <typename OpTy>
2151 inline CastInst_match<OpTy, UIToFPInst> m_UIToFP(const OpTy &Op) {
2152   return CastInst_match<OpTy, UIToFPInst>(Op);
2153 }
2154 
2155 template <typename OpTy>
2156 inline CastInst_match<OpTy, SIToFPInst> m_SIToFP(const OpTy &Op) {
2157   return CastInst_match<OpTy, SIToFPInst>(Op);
2158 }
2159 
2160 template <typename OpTy>
2161 inline CastInst_match<OpTy, FPToUIInst> m_FPToUI(const OpTy &Op) {
2162   return CastInst_match<OpTy, FPToUIInst>(Op);
2163 }
2164 
2165 template <typename OpTy>
2166 inline CastInst_match<OpTy, FPToSIInst> m_FPToSI(const OpTy &Op) {
2167   return CastInst_match<OpTy, FPToSIInst>(Op);
2168 }
2169 
2170 template <typename OpTy>
2171 inline CastInst_match<OpTy, FPTruncInst> m_FPTrunc(const OpTy &Op) {
2172   return CastInst_match<OpTy, FPTruncInst>(Op);
2173 }
2174 
2175 template <typename OpTy>
2176 inline CastInst_match<OpTy, FPExtInst> m_FPExt(const OpTy &Op) {
2177   return CastInst_match<OpTy, FPExtInst>(Op);
2178 }
2179 
2180 //===----------------------------------------------------------------------===//
2181 // Matchers for control flow.
2182 //
2183 
2184 struct br_match {
2185   BasicBlock *&Succ;
2186 
2187   br_match(BasicBlock *&Succ) : Succ(Succ) {}
2188 
2189   template <typename OpTy> bool match(OpTy *V) {
2190     if (auto *BI = dyn_cast<BranchInst>(V))
2191       if (BI->isUnconditional()) {
2192         Succ = BI->getSuccessor(0);
2193         return true;
2194       }
2195     return false;
2196   }
2197 };
2198 
2199 inline br_match m_UnconditionalBr(BasicBlock *&Succ) { return br_match(Succ); }
2200 
2201 template <typename Cond_t, typename TrueBlock_t, typename FalseBlock_t>
2202 struct brc_match {
2203   Cond_t Cond;
2204   TrueBlock_t T;
2205   FalseBlock_t F;
2206 
2207   brc_match(const Cond_t &C, const TrueBlock_t &t, const FalseBlock_t &f)
2208       : Cond(C), T(t), F(f) {}
2209 
2210   template <typename OpTy> bool match(OpTy *V) {
2211     if (auto *BI = dyn_cast<BranchInst>(V))
2212       if (BI->isConditional() && Cond.match(BI->getCondition()))
2213         return T.match(BI->getSuccessor(0)) && F.match(BI->getSuccessor(1));
2214     return false;
2215   }
2216 };
2217 
2218 template <typename Cond_t>
2219 inline brc_match<Cond_t, bind_ty<BasicBlock>, bind_ty<BasicBlock>>
2220 m_Br(const Cond_t &C, BasicBlock *&T, BasicBlock *&F) {
2221   return brc_match<Cond_t, bind_ty<BasicBlock>, bind_ty<BasicBlock>>(
2222       C, m_BasicBlock(T), m_BasicBlock(F));
2223 }
2224 
2225 template <typename Cond_t, typename TrueBlock_t, typename FalseBlock_t>
2226 inline brc_match<Cond_t, TrueBlock_t, FalseBlock_t>
2227 m_Br(const Cond_t &C, const TrueBlock_t &T, const FalseBlock_t &F) {
2228   return brc_match<Cond_t, TrueBlock_t, FalseBlock_t>(C, T, F);
2229 }
2230 
2231 //===----------------------------------------------------------------------===//
2232 // Matchers for max/min idioms, eg: "select (sgt x, y), x, y" -> smax(x,y).
2233 //
2234 
2235 template <typename CmpInst_t, typename LHS_t, typename RHS_t, typename Pred_t,
2236           bool Commutable = false>
2237 struct MaxMin_match {
2238   using PredType = Pred_t;
2239   LHS_t L;
2240   RHS_t R;
2241 
2242   // The evaluation order is always stable, regardless of Commutability.
2243   // The LHS is always matched first.
2244   MaxMin_match(const LHS_t &LHS, const RHS_t &RHS) : L(LHS), R(RHS) {}
2245 
2246   template <typename OpTy> bool match(OpTy *V) {
2247     if (auto *II = dyn_cast<IntrinsicInst>(V)) {
2248       Intrinsic::ID IID = II->getIntrinsicID();
2249       if ((IID == Intrinsic::smax && Pred_t::match(ICmpInst::ICMP_SGT)) ||
2250           (IID == Intrinsic::smin && Pred_t::match(ICmpInst::ICMP_SLT)) ||
2251           (IID == Intrinsic::umax && Pred_t::match(ICmpInst::ICMP_UGT)) ||
2252           (IID == Intrinsic::umin && Pred_t::match(ICmpInst::ICMP_ULT))) {
2253         Value *LHS = II->getOperand(0), *RHS = II->getOperand(1);
2254         return (L.match(LHS) && R.match(RHS)) ||
2255                (Commutable && L.match(RHS) && R.match(LHS));
2256       }
2257     }
2258     // Look for "(x pred y) ? x : y" or "(x pred y) ? y : x".
2259     auto *SI = dyn_cast<SelectInst>(V);
2260     if (!SI)
2261       return false;
2262     auto *Cmp = dyn_cast<CmpInst_t>(SI->getCondition());
2263     if (!Cmp)
2264       return false;
2265     // At this point we have a select conditioned on a comparison.  Check that
2266     // it is the values returned by the select that are being compared.
2267     auto *TrueVal = SI->getTrueValue();
2268     auto *FalseVal = SI->getFalseValue();
2269     auto *LHS = Cmp->getOperand(0);
2270     auto *RHS = Cmp->getOperand(1);
2271     if ((TrueVal != LHS || FalseVal != RHS) &&
2272         (TrueVal != RHS || FalseVal != LHS))
2273       return false;
2274     typename CmpInst_t::Predicate Pred =
2275         LHS == TrueVal ? Cmp->getPredicate() : Cmp->getInversePredicate();
2276     // Does "(x pred y) ? x : y" represent the desired max/min operation?
2277     if (!Pred_t::match(Pred))
2278       return false;
2279     // It does!  Bind the operands.
2280     return (L.match(LHS) && R.match(RHS)) ||
2281            (Commutable && L.match(RHS) && R.match(LHS));
2282   }
2283 };
2284 
2285 /// Helper class for identifying signed max predicates.
2286 struct smax_pred_ty {
2287   static bool match(ICmpInst::Predicate Pred) {
2288     return Pred == CmpInst::ICMP_SGT || Pred == CmpInst::ICMP_SGE;
2289   }
2290 };
2291 
2292 /// Helper class for identifying signed min predicates.
2293 struct smin_pred_ty {
2294   static bool match(ICmpInst::Predicate Pred) {
2295     return Pred == CmpInst::ICMP_SLT || Pred == CmpInst::ICMP_SLE;
2296   }
2297 };
2298 
2299 /// Helper class for identifying unsigned max predicates.
2300 struct umax_pred_ty {
2301   static bool match(ICmpInst::Predicate Pred) {
2302     return Pred == CmpInst::ICMP_UGT || Pred == CmpInst::ICMP_UGE;
2303   }
2304 };
2305 
2306 /// Helper class for identifying unsigned min predicates.
2307 struct umin_pred_ty {
2308   static bool match(ICmpInst::Predicate Pred) {
2309     return Pred == CmpInst::ICMP_ULT || Pred == CmpInst::ICMP_ULE;
2310   }
2311 };
2312 
2313 /// Helper class for identifying ordered max predicates.
2314 struct ofmax_pred_ty {
2315   static bool match(FCmpInst::Predicate Pred) {
2316     return Pred == CmpInst::FCMP_OGT || Pred == CmpInst::FCMP_OGE;
2317   }
2318 };
2319 
2320 /// Helper class for identifying ordered min predicates.
2321 struct ofmin_pred_ty {
2322   static bool match(FCmpInst::Predicate Pred) {
2323     return Pred == CmpInst::FCMP_OLT || Pred == CmpInst::FCMP_OLE;
2324   }
2325 };
2326 
2327 /// Helper class for identifying unordered max predicates.
2328 struct ufmax_pred_ty {
2329   static bool match(FCmpInst::Predicate Pred) {
2330     return Pred == CmpInst::FCMP_UGT || Pred == CmpInst::FCMP_UGE;
2331   }
2332 };
2333 
2334 /// Helper class for identifying unordered min predicates.
2335 struct ufmin_pred_ty {
2336   static bool match(FCmpInst::Predicate Pred) {
2337     return Pred == CmpInst::FCMP_ULT || Pred == CmpInst::FCMP_ULE;
2338   }
2339 };
2340 
2341 template <typename LHS, typename RHS>
2342 inline MaxMin_match<ICmpInst, LHS, RHS, smax_pred_ty> m_SMax(const LHS &L,
2343                                                              const RHS &R) {
2344   return MaxMin_match<ICmpInst, LHS, RHS, smax_pred_ty>(L, R);
2345 }
2346 
2347 template <typename LHS, typename RHS>
2348 inline MaxMin_match<ICmpInst, LHS, RHS, smin_pred_ty> m_SMin(const LHS &L,
2349                                                              const RHS &R) {
2350   return MaxMin_match<ICmpInst, LHS, RHS, smin_pred_ty>(L, R);
2351 }
2352 
2353 template <typename LHS, typename RHS>
2354 inline MaxMin_match<ICmpInst, LHS, RHS, umax_pred_ty> m_UMax(const LHS &L,
2355                                                              const RHS &R) {
2356   return MaxMin_match<ICmpInst, LHS, RHS, umax_pred_ty>(L, R);
2357 }
2358 
2359 template <typename LHS, typename RHS>
2360 inline MaxMin_match<ICmpInst, LHS, RHS, umin_pred_ty> m_UMin(const LHS &L,
2361                                                              const RHS &R) {
2362   return MaxMin_match<ICmpInst, LHS, RHS, umin_pred_ty>(L, R);
2363 }
2364 
2365 template <typename LHS, typename RHS>
2366 inline match_combine_or<
2367     match_combine_or<MaxMin_match<ICmpInst, LHS, RHS, smax_pred_ty>,
2368                      MaxMin_match<ICmpInst, LHS, RHS, smin_pred_ty>>,
2369     match_combine_or<MaxMin_match<ICmpInst, LHS, RHS, umax_pred_ty>,
2370                      MaxMin_match<ICmpInst, LHS, RHS, umin_pred_ty>>>
2371 m_MaxOrMin(const LHS &L, const RHS &R) {
2372   return m_CombineOr(m_CombineOr(m_SMax(L, R), m_SMin(L, R)),
2373                      m_CombineOr(m_UMax(L, R), m_UMin(L, R)));
2374 }
2375 
2376 /// Match an 'ordered' floating point maximum function.
2377 /// Floating point has one special value 'NaN'. Therefore, there is no total
2378 /// order. However, if we can ignore the 'NaN' value (for example, because of a
2379 /// 'no-nans-float-math' flag) a combination of a fcmp and select has 'maximum'
2380 /// semantics. In the presence of 'NaN' we have to preserve the original
2381 /// select(fcmp(ogt/ge, L, R), L, R) semantics matched by this predicate.
2382 ///
2383 ///                         max(L, R)  iff L and R are not NaN
2384 ///  m_OrdFMax(L, R) =      R          iff L or R are NaN
2385 template <typename LHS, typename RHS>
2386 inline MaxMin_match<FCmpInst, LHS, RHS, ofmax_pred_ty> m_OrdFMax(const LHS &L,
2387                                                                  const RHS &R) {
2388   return MaxMin_match<FCmpInst, LHS, RHS, ofmax_pred_ty>(L, R);
2389 }
2390 
2391 /// Match an 'ordered' floating point minimum function.
2392 /// Floating point has one special value 'NaN'. Therefore, there is no total
2393 /// order. However, if we can ignore the 'NaN' value (for example, because of a
2394 /// 'no-nans-float-math' flag) a combination of a fcmp and select has 'minimum'
2395 /// semantics. In the presence of 'NaN' we have to preserve the original
2396 /// select(fcmp(olt/le, L, R), L, R) semantics matched by this predicate.
2397 ///
2398 ///                         min(L, R)  iff L and R are not NaN
2399 ///  m_OrdFMin(L, R) =      R          iff L or R are NaN
2400 template <typename LHS, typename RHS>
2401 inline MaxMin_match<FCmpInst, LHS, RHS, ofmin_pred_ty> m_OrdFMin(const LHS &L,
2402                                                                  const RHS &R) {
2403   return MaxMin_match<FCmpInst, LHS, RHS, ofmin_pred_ty>(L, R);
2404 }
2405 
2406 /// Match an 'unordered' floating point maximum function.
2407 /// Floating point has one special value 'NaN'. Therefore, there is no total
2408 /// order. However, if we can ignore the 'NaN' value (for example, because of a
2409 /// 'no-nans-float-math' flag) a combination of a fcmp and select has 'maximum'
2410 /// semantics. In the presence of 'NaN' we have to preserve the original
2411 /// select(fcmp(ugt/ge, L, R), L, R) semantics matched by this predicate.
2412 ///
2413 ///                         max(L, R)  iff L and R are not NaN
2414 ///  m_UnordFMax(L, R) =    L          iff L or R are NaN
2415 template <typename LHS, typename RHS>
2416 inline MaxMin_match<FCmpInst, LHS, RHS, ufmax_pred_ty>
2417 m_UnordFMax(const LHS &L, const RHS &R) {
2418   return MaxMin_match<FCmpInst, LHS, RHS, ufmax_pred_ty>(L, R);
2419 }
2420 
2421 /// Match an 'unordered' floating point minimum function.
2422 /// Floating point has one special value 'NaN'. Therefore, there is no total
2423 /// order. However, if we can ignore the 'NaN' value (for example, because of a
2424 /// 'no-nans-float-math' flag) a combination of a fcmp and select has 'minimum'
2425 /// semantics. In the presence of 'NaN' we have to preserve the original
2426 /// select(fcmp(ult/le, L, R), L, R) semantics matched by this predicate.
2427 ///
2428 ///                          min(L, R)  iff L and R are not NaN
2429 ///  m_UnordFMin(L, R) =     L          iff L or R are NaN
2430 template <typename LHS, typename RHS>
2431 inline MaxMin_match<FCmpInst, LHS, RHS, ufmin_pred_ty>
2432 m_UnordFMin(const LHS &L, const RHS &R) {
2433   return MaxMin_match<FCmpInst, LHS, RHS, ufmin_pred_ty>(L, R);
2434 }
2435 
2436 /// Match an 'ordered' or 'unordered' floating point maximum function.
2437 /// Floating point has one special value 'NaN'. Therefore, there is no total
2438 /// order. However, if we can ignore the 'NaN' value (for example, because of a
2439 /// 'no-nans-float-math' flag) a combination of a fcmp and select has 'maximum'
2440 /// semantics.
2441 template <typename LHS, typename RHS>
2442 inline match_combine_or<MaxMin_match<FCmpInst, LHS, RHS, ofmax_pred_ty>,
2443                         MaxMin_match<FCmpInst, LHS, RHS, ufmax_pred_ty>>
2444 m_OrdOrUnordFMax(const LHS &L, const RHS &R) {
2445   return m_CombineOr(MaxMin_match<FCmpInst, LHS, RHS, ofmax_pred_ty>(L, R),
2446                      MaxMin_match<FCmpInst, LHS, RHS, ufmax_pred_ty>(L, R));
2447 }
2448 
2449 /// Match an 'ordered' or 'unordered' floating point minimum function.
2450 /// Floating point has one special value 'NaN'. Therefore, there is no total
2451 /// order. However, if we can ignore the 'NaN' value (for example, because of a
2452 /// 'no-nans-float-math' flag) a combination of a fcmp and select has 'minimum'
2453 /// semantics.
2454 template <typename LHS, typename RHS>
2455 inline match_combine_or<MaxMin_match<FCmpInst, LHS, RHS, ofmin_pred_ty>,
2456                         MaxMin_match<FCmpInst, LHS, RHS, ufmin_pred_ty>>
2457 m_OrdOrUnordFMin(const LHS &L, const RHS &R) {
2458   return m_CombineOr(MaxMin_match<FCmpInst, LHS, RHS, ofmin_pred_ty>(L, R),
2459                      MaxMin_match<FCmpInst, LHS, RHS, ufmin_pred_ty>(L, R));
2460 }
2461 
2462 /// Matches a 'Not' as 'xor V, -1' or 'xor -1, V'.
2463 /// NOTE: we first match the 'Not' (by matching '-1'),
2464 /// and only then match the inner matcher!
2465 template <typename ValTy>
2466 inline BinaryOp_match<cst_pred_ty<is_all_ones>, ValTy, Instruction::Xor, true>
2467 m_Not(const ValTy &V) {
2468   return m_c_Xor(m_AllOnes(), V);
2469 }
2470 
2471 template <typename ValTy>
2472 inline BinaryOp_match<cst_pred_ty<is_all_ones, false>, ValTy, Instruction::Xor,
2473                       true>
2474 m_NotForbidPoison(const ValTy &V) {
2475   return m_c_Xor(m_AllOnesForbidPoison(), V);
2476 }
2477 
2478 //===----------------------------------------------------------------------===//
2479 // Matchers for overflow check patterns: e.g. (a + b) u< a, (a ^ -1) <u b
2480 // Note that S might be matched to other instructions than AddInst.
2481 //
2482 
2483 template <typename LHS_t, typename RHS_t, typename Sum_t>
2484 struct UAddWithOverflow_match {
2485   LHS_t L;
2486   RHS_t R;
2487   Sum_t S;
2488 
2489   UAddWithOverflow_match(const LHS_t &L, const RHS_t &R, const Sum_t &S)
2490       : L(L), R(R), S(S) {}
2491 
2492   template <typename OpTy> bool match(OpTy *V) {
2493     Value *ICmpLHS, *ICmpRHS;
2494     CmpPredicate Pred;
2495     if (!m_ICmp(Pred, m_Value(ICmpLHS), m_Value(ICmpRHS)).match(V))
2496       return false;
2497 
2498     Value *AddLHS, *AddRHS;
2499     auto AddExpr = m_Add(m_Value(AddLHS), m_Value(AddRHS));
2500 
2501     // (a + b) u< a, (a + b) u< b
2502     if (Pred == ICmpInst::ICMP_ULT)
2503       if (AddExpr.match(ICmpLHS) && (ICmpRHS == AddLHS || ICmpRHS == AddRHS))
2504         return L.match(AddLHS) && R.match(AddRHS) && S.match(ICmpLHS);
2505 
2506     // a >u (a + b), b >u (a + b)
2507     if (Pred == ICmpInst::ICMP_UGT)
2508       if (AddExpr.match(ICmpRHS) && (ICmpLHS == AddLHS || ICmpLHS == AddRHS))
2509         return L.match(AddLHS) && R.match(AddRHS) && S.match(ICmpRHS);
2510 
2511     Value *Op1;
2512     auto XorExpr = m_OneUse(m_Not(m_Value(Op1)));
2513     // (~a) <u b
2514     if (Pred == ICmpInst::ICMP_ULT) {
2515       if (XorExpr.match(ICmpLHS))
2516         return L.match(Op1) && R.match(ICmpRHS) && S.match(ICmpLHS);
2517     }
2518     //  b > u (~a)
2519     if (Pred == ICmpInst::ICMP_UGT) {
2520       if (XorExpr.match(ICmpRHS))
2521         return L.match(Op1) && R.match(ICmpLHS) && S.match(ICmpRHS);
2522     }
2523 
2524     // Match special-case for increment-by-1.
2525     if (Pred == ICmpInst::ICMP_EQ) {
2526       // (a + 1) == 0
2527       // (1 + a) == 0
2528       if (AddExpr.match(ICmpLHS) && m_ZeroInt().match(ICmpRHS) &&
2529           (m_One().match(AddLHS) || m_One().match(AddRHS)))
2530         return L.match(AddLHS) && R.match(AddRHS) && S.match(ICmpLHS);
2531       // 0 == (a + 1)
2532       // 0 == (1 + a)
2533       if (m_ZeroInt().match(ICmpLHS) && AddExpr.match(ICmpRHS) &&
2534           (m_One().match(AddLHS) || m_One().match(AddRHS)))
2535         return L.match(AddLHS) && R.match(AddRHS) && S.match(ICmpRHS);
2536     }
2537 
2538     return false;
2539   }
2540 };
2541 
2542 /// Match an icmp instruction checking for unsigned overflow on addition.
2543 ///
2544 /// S is matched to the addition whose result is being checked for overflow, and
2545 /// L and R are matched to the LHS and RHS of S.
2546 template <typename LHS_t, typename RHS_t, typename Sum_t>
2547 UAddWithOverflow_match<LHS_t, RHS_t, Sum_t>
2548 m_UAddWithOverflow(const LHS_t &L, const RHS_t &R, const Sum_t &S) {
2549   return UAddWithOverflow_match<LHS_t, RHS_t, Sum_t>(L, R, S);
2550 }
2551 
2552 template <typename Opnd_t> struct Argument_match {
2553   unsigned OpI;
2554   Opnd_t Val;
2555 
2556   Argument_match(unsigned OpIdx, const Opnd_t &V) : OpI(OpIdx), Val(V) {}
2557 
2558   template <typename OpTy> bool match(OpTy *V) {
2559     // FIXME: Should likely be switched to use `CallBase`.
2560     if (const auto *CI = dyn_cast<CallInst>(V))
2561       return Val.match(CI->getArgOperand(OpI));
2562     return false;
2563   }
2564 };
2565 
2566 /// Match an argument.
2567 template <unsigned OpI, typename Opnd_t>
2568 inline Argument_match<Opnd_t> m_Argument(const Opnd_t &Op) {
2569   return Argument_match<Opnd_t>(OpI, Op);
2570 }
2571 
2572 /// Intrinsic matchers.
2573 struct IntrinsicID_match {
2574   unsigned ID;
2575 
2576   IntrinsicID_match(Intrinsic::ID IntrID) : ID(IntrID) {}
2577 
2578   template <typename OpTy> bool match(OpTy *V) {
2579     if (const auto *CI = dyn_cast<CallInst>(V))
2580       if (const auto *F = CI->getCalledFunction())
2581         return F->getIntrinsicID() == ID;
2582     return false;
2583   }
2584 };
2585 
2586 /// Intrinsic matches are combinations of ID matchers, and argument
2587 /// matchers. Higher arity matcher are defined recursively in terms of and-ing
2588 /// them with lower arity matchers. Here's some convenient typedefs for up to
2589 /// several arguments, and more can be added as needed
2590 template <typename T0 = void, typename T1 = void, typename T2 = void,
2591           typename T3 = void, typename T4 = void, typename T5 = void,
2592           typename T6 = void, typename T7 = void, typename T8 = void,
2593           typename T9 = void, typename T10 = void>
2594 struct m_Intrinsic_Ty;
2595 template <typename T0> struct m_Intrinsic_Ty<T0> {
2596   using Ty = match_combine_and<IntrinsicID_match, Argument_match<T0>>;
2597 };
2598 template <typename T0, typename T1> struct m_Intrinsic_Ty<T0, T1> {
2599   using Ty =
2600       match_combine_and<typename m_Intrinsic_Ty<T0>::Ty, Argument_match<T1>>;
2601 };
2602 template <typename T0, typename T1, typename T2>
2603 struct m_Intrinsic_Ty<T0, T1, T2> {
2604   using Ty = match_combine_and<typename m_Intrinsic_Ty<T0, T1>::Ty,
2605                                Argument_match<T2>>;
2606 };
2607 template <typename T0, typename T1, typename T2, typename T3>
2608 struct m_Intrinsic_Ty<T0, T1, T2, T3> {
2609   using Ty = match_combine_and<typename m_Intrinsic_Ty<T0, T1, T2>::Ty,
2610                                Argument_match<T3>>;
2611 };
2612 
2613 template <typename T0, typename T1, typename T2, typename T3, typename T4>
2614 struct m_Intrinsic_Ty<T0, T1, T2, T3, T4> {
2615   using Ty = match_combine_and<typename m_Intrinsic_Ty<T0, T1, T2, T3>::Ty,
2616                                Argument_match<T4>>;
2617 };
2618 
2619 template <typename T0, typename T1, typename T2, typename T3, typename T4,
2620           typename T5>
2621 struct m_Intrinsic_Ty<T0, T1, T2, T3, T4, T5> {
2622   using Ty = match_combine_and<typename m_Intrinsic_Ty<T0, T1, T2, T3, T4>::Ty,
2623                                Argument_match<T5>>;
2624 };
2625 
2626 /// Match intrinsic calls like this:
2627 /// m_Intrinsic<Intrinsic::fabs>(m_Value(X))
2628 template <Intrinsic::ID IntrID> inline IntrinsicID_match m_Intrinsic() {
2629   return IntrinsicID_match(IntrID);
2630 }
2631 
2632 /// Matches MaskedLoad Intrinsic.
2633 template <typename Opnd0, typename Opnd1, typename Opnd2, typename Opnd3>
2634 inline typename m_Intrinsic_Ty<Opnd0, Opnd1, Opnd2, Opnd3>::Ty
2635 m_MaskedLoad(const Opnd0 &Op0, const Opnd1 &Op1, const Opnd2 &Op2,
2636              const Opnd3 &Op3) {
2637   return m_Intrinsic<Intrinsic::masked_load>(Op0, Op1, Op2, Op3);
2638 }
2639 
2640 /// Matches MaskedGather Intrinsic.
2641 template <typename Opnd0, typename Opnd1, typename Opnd2, typename Opnd3>
2642 inline typename m_Intrinsic_Ty<Opnd0, Opnd1, Opnd2, Opnd3>::Ty
2643 m_MaskedGather(const Opnd0 &Op0, const Opnd1 &Op1, const Opnd2 &Op2,
2644                const Opnd3 &Op3) {
2645   return m_Intrinsic<Intrinsic::masked_gather>(Op0, Op1, Op2, Op3);
2646 }
2647 
2648 template <Intrinsic::ID IntrID, typename T0>
2649 inline typename m_Intrinsic_Ty<T0>::Ty m_Intrinsic(const T0 &Op0) {
2650   return m_CombineAnd(m_Intrinsic<IntrID>(), m_Argument<0>(Op0));
2651 }
2652 
2653 template <Intrinsic::ID IntrID, typename T0, typename T1>
2654 inline typename m_Intrinsic_Ty<T0, T1>::Ty m_Intrinsic(const T0 &Op0,
2655                                                        const T1 &Op1) {
2656   return m_CombineAnd(m_Intrinsic<IntrID>(Op0), m_Argument<1>(Op1));
2657 }
2658 
2659 template <Intrinsic::ID IntrID, typename T0, typename T1, typename T2>
2660 inline typename m_Intrinsic_Ty<T0, T1, T2>::Ty
2661 m_Intrinsic(const T0 &Op0, const T1 &Op1, const T2 &Op2) {
2662   return m_CombineAnd(m_Intrinsic<IntrID>(Op0, Op1), m_Argument<2>(Op2));
2663 }
2664 
2665 template <Intrinsic::ID IntrID, typename T0, typename T1, typename T2,
2666           typename T3>
2667 inline typename m_Intrinsic_Ty<T0, T1, T2, T3>::Ty
2668 m_Intrinsic(const T0 &Op0, const T1 &Op1, const T2 &Op2, const T3 &Op3) {
2669   return m_CombineAnd(m_Intrinsic<IntrID>(Op0, Op1, Op2), m_Argument<3>(Op3));
2670 }
2671 
2672 template <Intrinsic::ID IntrID, typename T0, typename T1, typename T2,
2673           typename T3, typename T4>
2674 inline typename m_Intrinsic_Ty<T0, T1, T2, T3, T4>::Ty
2675 m_Intrinsic(const T0 &Op0, const T1 &Op1, const T2 &Op2, const T3 &Op3,
2676             const T4 &Op4) {
2677   return m_CombineAnd(m_Intrinsic<IntrID>(Op0, Op1, Op2, Op3),
2678                       m_Argument<4>(Op4));
2679 }
2680 
2681 template <Intrinsic::ID IntrID, typename T0, typename T1, typename T2,
2682           typename T3, typename T4, typename T5>
2683 inline typename m_Intrinsic_Ty<T0, T1, T2, T3, T4, T5>::Ty
2684 m_Intrinsic(const T0 &Op0, const T1 &Op1, const T2 &Op2, const T3 &Op3,
2685             const T4 &Op4, const T5 &Op5) {
2686   return m_CombineAnd(m_Intrinsic<IntrID>(Op0, Op1, Op2, Op3, Op4),
2687                       m_Argument<5>(Op5));
2688 }
2689 
2690 // Helper intrinsic matching specializations.
2691 template <typename Opnd0>
2692 inline typename m_Intrinsic_Ty<Opnd0>::Ty m_BitReverse(const Opnd0 &Op0) {
2693   return m_Intrinsic<Intrinsic::bitreverse>(Op0);
2694 }
2695 
2696 template <typename Opnd0>
2697 inline typename m_Intrinsic_Ty<Opnd0>::Ty m_BSwap(const Opnd0 &Op0) {
2698   return m_Intrinsic<Intrinsic::bswap>(Op0);
2699 }
2700 
2701 template <typename Opnd0>
2702 inline typename m_Intrinsic_Ty<Opnd0>::Ty m_FAbs(const Opnd0 &Op0) {
2703   return m_Intrinsic<Intrinsic::fabs>(Op0);
2704 }
2705 
2706 template <typename Opnd0>
2707 inline typename m_Intrinsic_Ty<Opnd0>::Ty m_FCanonicalize(const Opnd0 &Op0) {
2708   return m_Intrinsic<Intrinsic::canonicalize>(Op0);
2709 }
2710 
2711 template <typename Opnd0, typename Opnd1>
2712 inline typename m_Intrinsic_Ty<Opnd0, Opnd1>::Ty m_FMin(const Opnd0 &Op0,
2713                                                         const Opnd1 &Op1) {
2714   return m_Intrinsic<Intrinsic::minnum>(Op0, Op1);
2715 }
2716 
2717 template <typename Opnd0, typename Opnd1>
2718 inline typename m_Intrinsic_Ty<Opnd0, Opnd1>::Ty m_FMax(const Opnd0 &Op0,
2719                                                         const Opnd1 &Op1) {
2720   return m_Intrinsic<Intrinsic::maxnum>(Op0, Op1);
2721 }
2722 
2723 template <typename Opnd0, typename Opnd1, typename Opnd2>
2724 inline typename m_Intrinsic_Ty<Opnd0, Opnd1, Opnd2>::Ty
2725 m_FShl(const Opnd0 &Op0, const Opnd1 &Op1, const Opnd2 &Op2) {
2726   return m_Intrinsic<Intrinsic::fshl>(Op0, Op1, Op2);
2727 }
2728 
2729 template <typename Opnd0, typename Opnd1, typename Opnd2>
2730 inline typename m_Intrinsic_Ty<Opnd0, Opnd1, Opnd2>::Ty
2731 m_FShr(const Opnd0 &Op0, const Opnd1 &Op1, const Opnd2 &Op2) {
2732   return m_Intrinsic<Intrinsic::fshr>(Op0, Op1, Op2);
2733 }
2734 
2735 template <typename Opnd0>
2736 inline typename m_Intrinsic_Ty<Opnd0>::Ty m_Sqrt(const Opnd0 &Op0) {
2737   return m_Intrinsic<Intrinsic::sqrt>(Op0);
2738 }
2739 
2740 template <typename Opnd0, typename Opnd1>
2741 inline typename m_Intrinsic_Ty<Opnd0, Opnd1>::Ty m_CopySign(const Opnd0 &Op0,
2742                                                             const Opnd1 &Op1) {
2743   return m_Intrinsic<Intrinsic::copysign>(Op0, Op1);
2744 }
2745 
2746 template <typename Opnd0>
2747 inline typename m_Intrinsic_Ty<Opnd0>::Ty m_VecReverse(const Opnd0 &Op0) {
2748   return m_Intrinsic<Intrinsic::vector_reverse>(Op0);
2749 }
2750 
2751 //===----------------------------------------------------------------------===//
2752 // Matchers for two-operands operators with the operators in either order
2753 //
2754 
2755 /// Matches a BinaryOperator with LHS and RHS in either order.
2756 template <typename LHS, typename RHS>
2757 inline AnyBinaryOp_match<LHS, RHS, true> m_c_BinOp(const LHS &L, const RHS &R) {
2758   return AnyBinaryOp_match<LHS, RHS, true>(L, R);
2759 }
2760 
2761 /// Matches an ICmp with a predicate over LHS and RHS in either order.
2762 /// Swaps the predicate if operands are commuted.
2763 template <typename LHS, typename RHS>
2764 inline CmpClass_match<LHS, RHS, ICmpInst, true>
2765 m_c_ICmp(CmpPredicate &Pred, const LHS &L, const RHS &R) {
2766   return CmpClass_match<LHS, RHS, ICmpInst, true>(Pred, L, R);
2767 }
2768 
2769 template <typename LHS, typename RHS>
2770 inline CmpClass_match<LHS, RHS, ICmpInst, true> m_c_ICmp(const LHS &L,
2771                                                          const RHS &R) {
2772   return CmpClass_match<LHS, RHS, ICmpInst, true>(L, R);
2773 }
2774 
2775 /// Matches a specific opcode with LHS and RHS in either order.
2776 template <typename LHS, typename RHS>
2777 inline SpecificBinaryOp_match<LHS, RHS, true>
2778 m_c_BinOp(unsigned Opcode, const LHS &L, const RHS &R) {
2779   return SpecificBinaryOp_match<LHS, RHS, true>(Opcode, L, R);
2780 }
2781 
2782 /// Matches a Add with LHS and RHS in either order.
2783 template <typename LHS, typename RHS>
2784 inline BinaryOp_match<LHS, RHS, Instruction::Add, true> m_c_Add(const LHS &L,
2785                                                                 const RHS &R) {
2786   return BinaryOp_match<LHS, RHS, Instruction::Add, true>(L, R);
2787 }
2788 
2789 /// Matches a Mul with LHS and RHS in either order.
2790 template <typename LHS, typename RHS>
2791 inline BinaryOp_match<LHS, RHS, Instruction::Mul, true> m_c_Mul(const LHS &L,
2792                                                                 const RHS &R) {
2793   return BinaryOp_match<LHS, RHS, Instruction::Mul, true>(L, R);
2794 }
2795 
2796 /// Matches an And with LHS and RHS in either order.
2797 template <typename LHS, typename RHS>
2798 inline BinaryOp_match<LHS, RHS, Instruction::And, true> m_c_And(const LHS &L,
2799                                                                 const RHS &R) {
2800   return BinaryOp_match<LHS, RHS, Instruction::And, true>(L, R);
2801 }
2802 
2803 /// Matches an Or with LHS and RHS in either order.
2804 template <typename LHS, typename RHS>
2805 inline BinaryOp_match<LHS, RHS, Instruction::Or, true> m_c_Or(const LHS &L,
2806                                                               const RHS &R) {
2807   return BinaryOp_match<LHS, RHS, Instruction::Or, true>(L, R);
2808 }
2809 
2810 /// Matches an Xor with LHS and RHS in either order.
2811 template <typename LHS, typename RHS>
2812 inline BinaryOp_match<LHS, RHS, Instruction::Xor, true> m_c_Xor(const LHS &L,
2813                                                                 const RHS &R) {
2814   return BinaryOp_match<LHS, RHS, Instruction::Xor, true>(L, R);
2815 }
2816 
2817 /// Matches a 'Neg' as 'sub 0, V'.
2818 template <typename ValTy>
2819 inline BinaryOp_match<cst_pred_ty<is_zero_int>, ValTy, Instruction::Sub>
2820 m_Neg(const ValTy &V) {
2821   return m_Sub(m_ZeroInt(), V);
2822 }
2823 
2824 /// Matches a 'Neg' as 'sub nsw 0, V'.
2825 template <typename ValTy>
2826 inline OverflowingBinaryOp_match<cst_pred_ty<is_zero_int>, ValTy,
2827                                  Instruction::Sub,
2828                                  OverflowingBinaryOperator::NoSignedWrap>
2829 m_NSWNeg(const ValTy &V) {
2830   return m_NSWSub(m_ZeroInt(), V);
2831 }
2832 
2833 /// Matches an SMin with LHS and RHS in either order.
2834 template <typename LHS, typename RHS>
2835 inline MaxMin_match<ICmpInst, LHS, RHS, smin_pred_ty, true>
2836 m_c_SMin(const LHS &L, const RHS &R) {
2837   return MaxMin_match<ICmpInst, LHS, RHS, smin_pred_ty, true>(L, R);
2838 }
2839 /// Matches an SMax with LHS and RHS in either order.
2840 template <typename LHS, typename RHS>
2841 inline MaxMin_match<ICmpInst, LHS, RHS, smax_pred_ty, true>
2842 m_c_SMax(const LHS &L, const RHS &R) {
2843   return MaxMin_match<ICmpInst, LHS, RHS, smax_pred_ty, true>(L, R);
2844 }
2845 /// Matches a UMin with LHS and RHS in either order.
2846 template <typename LHS, typename RHS>
2847 inline MaxMin_match<ICmpInst, LHS, RHS, umin_pred_ty, true>
2848 m_c_UMin(const LHS &L, const RHS &R) {
2849   return MaxMin_match<ICmpInst, LHS, RHS, umin_pred_ty, true>(L, R);
2850 }
2851 /// Matches a UMax with LHS and RHS in either order.
2852 template <typename LHS, typename RHS>
2853 inline MaxMin_match<ICmpInst, LHS, RHS, umax_pred_ty, true>
2854 m_c_UMax(const LHS &L, const RHS &R) {
2855   return MaxMin_match<ICmpInst, LHS, RHS, umax_pred_ty, true>(L, R);
2856 }
2857 
2858 template <typename LHS, typename RHS>
2859 inline match_combine_or<
2860     match_combine_or<MaxMin_match<ICmpInst, LHS, RHS, smax_pred_ty, true>,
2861                      MaxMin_match<ICmpInst, LHS, RHS, smin_pred_ty, true>>,
2862     match_combine_or<MaxMin_match<ICmpInst, LHS, RHS, umax_pred_ty, true>,
2863                      MaxMin_match<ICmpInst, LHS, RHS, umin_pred_ty, true>>>
2864 m_c_MaxOrMin(const LHS &L, const RHS &R) {
2865   return m_CombineOr(m_CombineOr(m_c_SMax(L, R), m_c_SMin(L, R)),
2866                      m_CombineOr(m_c_UMax(L, R), m_c_UMin(L, R)));
2867 }
2868 
2869 template <Intrinsic::ID IntrID, typename T0, typename T1>
2870 inline match_combine_or<typename m_Intrinsic_Ty<T0, T1>::Ty,
2871                         typename m_Intrinsic_Ty<T1, T0>::Ty>
2872 m_c_Intrinsic(const T0 &Op0, const T1 &Op1) {
2873   return m_CombineOr(m_Intrinsic<IntrID>(Op0, Op1),
2874                      m_Intrinsic<IntrID>(Op1, Op0));
2875 }
2876 
2877 /// Matches FAdd with LHS and RHS in either order.
2878 template <typename LHS, typename RHS>
2879 inline BinaryOp_match<LHS, RHS, Instruction::FAdd, true>
2880 m_c_FAdd(const LHS &L, const RHS &R) {
2881   return BinaryOp_match<LHS, RHS, Instruction::FAdd, true>(L, R);
2882 }
2883 
2884 /// Matches FMul with LHS and RHS in either order.
2885 template <typename LHS, typename RHS>
2886 inline BinaryOp_match<LHS, RHS, Instruction::FMul, true>
2887 m_c_FMul(const LHS &L, const RHS &R) {
2888   return BinaryOp_match<LHS, RHS, Instruction::FMul, true>(L, R);
2889 }
2890 
2891 template <typename Opnd_t> struct Signum_match {
2892   Opnd_t Val;
2893   Signum_match(const Opnd_t &V) : Val(V) {}
2894 
2895   template <typename OpTy> bool match(OpTy *V) {
2896     unsigned TypeSize = V->getType()->getScalarSizeInBits();
2897     if (TypeSize == 0)
2898       return false;
2899 
2900     unsigned ShiftWidth = TypeSize - 1;
2901     Value *Op;
2902 
2903     // This is the representation of signum we match:
2904     //
2905     //  signum(x) == (x >> 63) | (-x >>u 63)
2906     //
2907     // An i1 value is its own signum, so it's correct to match
2908     //
2909     //  signum(x) == (x >> 0)  | (-x >>u 0)
2910     //
2911     // for i1 values.
2912 
2913     auto LHS = m_AShr(m_Value(Op), m_SpecificInt(ShiftWidth));
2914     auto RHS = m_LShr(m_Neg(m_Deferred(Op)), m_SpecificInt(ShiftWidth));
2915     auto Signum = m_c_Or(LHS, RHS);
2916 
2917     return Signum.match(V) && Val.match(Op);
2918   }
2919 };
2920 
2921 /// Matches a signum pattern.
2922 ///
2923 /// signum(x) =
2924 ///      x >  0  ->  1
2925 ///      x == 0  ->  0
2926 ///      x <  0  -> -1
2927 template <typename Val_t> inline Signum_match<Val_t> m_Signum(const Val_t &V) {
2928   return Signum_match<Val_t>(V);
2929 }
2930 
2931 template <int Ind, typename Opnd_t> struct ExtractValue_match {
2932   Opnd_t Val;
2933   ExtractValue_match(const Opnd_t &V) : Val(V) {}
2934 
2935   template <typename OpTy> bool match(OpTy *V) {
2936     if (auto *I = dyn_cast<ExtractValueInst>(V)) {
2937       // If Ind is -1, don't inspect indices
2938       if (Ind != -1 &&
2939           !(I->getNumIndices() == 1 && I->getIndices()[0] == (unsigned)Ind))
2940         return false;
2941       return Val.match(I->getAggregateOperand());
2942     }
2943     return false;
2944   }
2945 };
2946 
2947 /// Match a single index ExtractValue instruction.
2948 /// For example m_ExtractValue<1>(...)
2949 template <int Ind, typename Val_t>
2950 inline ExtractValue_match<Ind, Val_t> m_ExtractValue(const Val_t &V) {
2951   return ExtractValue_match<Ind, Val_t>(V);
2952 }
2953 
2954 /// Match an ExtractValue instruction with any index.
2955 /// For example m_ExtractValue(...)
2956 template <typename Val_t>
2957 inline ExtractValue_match<-1, Val_t> m_ExtractValue(const Val_t &V) {
2958   return ExtractValue_match<-1, Val_t>(V);
2959 }
2960 
2961 /// Matcher for a single index InsertValue instruction.
2962 template <int Ind, typename T0, typename T1> struct InsertValue_match {
2963   T0 Op0;
2964   T1 Op1;
2965 
2966   InsertValue_match(const T0 &Op0, const T1 &Op1) : Op0(Op0), Op1(Op1) {}
2967 
2968   template <typename OpTy> bool match(OpTy *V) {
2969     if (auto *I = dyn_cast<InsertValueInst>(V)) {
2970       return Op0.match(I->getOperand(0)) && Op1.match(I->getOperand(1)) &&
2971              I->getNumIndices() == 1 && Ind == I->getIndices()[0];
2972     }
2973     return false;
2974   }
2975 };
2976 
2977 /// Matches a single index InsertValue instruction.
2978 template <int Ind, typename Val_t, typename Elt_t>
2979 inline InsertValue_match<Ind, Val_t, Elt_t> m_InsertValue(const Val_t &Val,
2980                                                           const Elt_t &Elt) {
2981   return InsertValue_match<Ind, Val_t, Elt_t>(Val, Elt);
2982 }
2983 
2984 /// Matches patterns for `vscale`. This can either be a call to `llvm.vscale` or
2985 /// the constant expression
2986 ///  `ptrtoint(gep <vscale x 1 x i8>, <vscale x 1 x i8>* null, i32 1>`
2987 /// under the right conditions determined by DataLayout.
2988 struct VScaleVal_match {
2989   template <typename ITy> bool match(ITy *V) {
2990     if (m_Intrinsic<Intrinsic::vscale>().match(V))
2991       return true;
2992 
2993     Value *Ptr;
2994     if (m_PtrToInt(m_Value(Ptr)).match(V)) {
2995       if (auto *GEP = dyn_cast<GEPOperator>(Ptr)) {
2996         auto *DerefTy =
2997             dyn_cast<ScalableVectorType>(GEP->getSourceElementType());
2998         if (GEP->getNumIndices() == 1 && DerefTy &&
2999             DerefTy->getElementType()->isIntegerTy(8) &&
3000             m_Zero().match(GEP->getPointerOperand()) &&
3001             m_SpecificInt(1).match(GEP->idx_begin()->get()))
3002           return true;
3003       }
3004     }
3005 
3006     return false;
3007   }
3008 };
3009 
3010 inline VScaleVal_match m_VScale() {
3011   return VScaleVal_match();
3012 }
3013 
3014 template <typename Opnd0, typename Opnd1>
3015 inline typename m_Intrinsic_Ty<Opnd0, Opnd1>::Ty
3016 m_Interleave2(const Opnd0 &Op0, const Opnd1 &Op1) {
3017   return m_Intrinsic<Intrinsic::vector_interleave2>(Op0, Op1);
3018 }
3019 
3020 template <typename Opnd>
3021 inline typename m_Intrinsic_Ty<Opnd>::Ty m_Deinterleave2(const Opnd &Op) {
3022   return m_Intrinsic<Intrinsic::vector_deinterleave2>(Op);
3023 }
3024 
3025 template <typename LHS, typename RHS, unsigned Opcode, bool Commutable = false>
3026 struct LogicalOp_match {
3027   LHS L;
3028   RHS R;
3029 
3030   LogicalOp_match(const LHS &L, const RHS &R) : L(L), R(R) {}
3031 
3032   template <typename T> bool match(T *V) {
3033     auto *I = dyn_cast<Instruction>(V);
3034     if (!I || !I->getType()->isIntOrIntVectorTy(1))
3035       return false;
3036 
3037     if (I->getOpcode() == Opcode) {
3038       auto *Op0 = I->getOperand(0);
3039       auto *Op1 = I->getOperand(1);
3040       return (L.match(Op0) && R.match(Op1)) ||
3041              (Commutable && L.match(Op1) && R.match(Op0));
3042     }
3043 
3044     if (auto *Select = dyn_cast<SelectInst>(I)) {
3045       auto *Cond = Select->getCondition();
3046       auto *TVal = Select->getTrueValue();
3047       auto *FVal = Select->getFalseValue();
3048 
3049       // Don't match a scalar select of bool vectors.
3050       // Transforms expect a single type for operands if this matches.
3051       if (Cond->getType() != Select->getType())
3052         return false;
3053 
3054       if (Opcode == Instruction::And) {
3055         auto *C = dyn_cast<Constant>(FVal);
3056         if (C && C->isNullValue())
3057           return (L.match(Cond) && R.match(TVal)) ||
3058                  (Commutable && L.match(TVal) && R.match(Cond));
3059       } else {
3060         assert(Opcode == Instruction::Or);
3061         auto *C = dyn_cast<Constant>(TVal);
3062         if (C && C->isOneValue())
3063           return (L.match(Cond) && R.match(FVal)) ||
3064                  (Commutable && L.match(FVal) && R.match(Cond));
3065       }
3066     }
3067 
3068     return false;
3069   }
3070 };
3071 
3072 /// Matches L && R either in the form of L & R or L ? R : false.
3073 /// Note that the latter form is poison-blocking.
3074 template <typename LHS, typename RHS>
3075 inline LogicalOp_match<LHS, RHS, Instruction::And> m_LogicalAnd(const LHS &L,
3076                                                                 const RHS &R) {
3077   return LogicalOp_match<LHS, RHS, Instruction::And>(L, R);
3078 }
3079 
3080 /// Matches L && R where L and R are arbitrary values.
3081 inline auto m_LogicalAnd() { return m_LogicalAnd(m_Value(), m_Value()); }
3082 
3083 /// Matches L && R with LHS and RHS in either order.
3084 template <typename LHS, typename RHS>
3085 inline LogicalOp_match<LHS, RHS, Instruction::And, true>
3086 m_c_LogicalAnd(const LHS &L, const RHS &R) {
3087   return LogicalOp_match<LHS, RHS, Instruction::And, true>(L, R);
3088 }
3089 
3090 /// Matches L || R either in the form of L | R or L ? true : R.
3091 /// Note that the latter form is poison-blocking.
3092 template <typename LHS, typename RHS>
3093 inline LogicalOp_match<LHS, RHS, Instruction::Or> m_LogicalOr(const LHS &L,
3094                                                               const RHS &R) {
3095   return LogicalOp_match<LHS, RHS, Instruction::Or>(L, R);
3096 }
3097 
3098 /// Matches L || R where L and R are arbitrary values.
3099 inline auto m_LogicalOr() { return m_LogicalOr(m_Value(), m_Value()); }
3100 
3101 /// Matches L || R with LHS and RHS in either order.
3102 template <typename LHS, typename RHS>
3103 inline LogicalOp_match<LHS, RHS, Instruction::Or, true>
3104 m_c_LogicalOr(const LHS &L, const RHS &R) {
3105   return LogicalOp_match<LHS, RHS, Instruction::Or, true>(L, R);
3106 }
3107 
3108 /// Matches either L && R or L || R,
3109 /// either one being in the either binary or logical form.
3110 /// Note that the latter form is poison-blocking.
3111 template <typename LHS, typename RHS, bool Commutable = false>
3112 inline auto m_LogicalOp(const LHS &L, const RHS &R) {
3113   return m_CombineOr(
3114       LogicalOp_match<LHS, RHS, Instruction::And, Commutable>(L, R),
3115       LogicalOp_match<LHS, RHS, Instruction::Or, Commutable>(L, R));
3116 }
3117 
3118 /// Matches either L && R or L || R where L and R are arbitrary values.
3119 inline auto m_LogicalOp() { return m_LogicalOp(m_Value(), m_Value()); }
3120 
3121 /// Matches either L && R or L || R with LHS and RHS in either order.
3122 template <typename LHS, typename RHS>
3123 inline auto m_c_LogicalOp(const LHS &L, const RHS &R) {
3124   return m_LogicalOp<LHS, RHS, /*Commutable=*/true>(L, R);
3125 }
3126 
3127 } // end namespace PatternMatch
3128 } // end namespace llvm
3129 
3130 #endif // LLVM_IR_PATTERNMATCH_H