#ifndef LLVM_IR_PATTERNMATCH_H
#define LLVM_IR_PATTERNMATCH_H
#include "llvm/ADT/APFloat.h"
#include "llvm/ADT/APInt.h"
#include "llvm/IR/Constant.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/InstrTypes.h"
#include "llvm/IR/Instruction.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/IntrinsicInst.h"
#include "llvm/IR/Intrinsics.h"
#include "llvm/IR/Operator.h"
#include "llvm/IR/Value.h"
#include "llvm/Support/Casting.h"
#include <cstdint>
namespace llvm {
namespace PatternMatch {
template <typename Val, typename Pattern> bool match(Val *V, const Pattern &P) { … }
template <typename Pattern> bool match(ArrayRef<int> Mask, const Pattern &P) { … }
template <typename SubPattern_t> struct OneUse_match { … };
template <typename T> inline OneUse_match<T> m_OneUse(const T &SubPattern) { … }
template <typename SubPattern_t> struct AllowReassoc_match { … };
template <typename T>
inline AllowReassoc_match<T> m_AllowReassoc(const T &SubPattern) { … }
template <typename Class> struct class_match { … };
inline class_match<Value> m_Value() { … }
inline class_match<UnaryOperator> m_UnOp() { … }
inline class_match<BinaryOperator> m_BinOp() { … }
inline class_match<CmpInst> m_Cmp() { … }
struct undef_match { … };
inline auto m_Undef() { … }
inline class_match<UndefValue> m_UndefValue() { … }
inline class_match<PoisonValue> m_Poison() { … }
inline class_match<Constant> m_Constant() { … }
inline class_match<ConstantInt> m_ConstantInt() { … }
inline class_match<ConstantFP> m_ConstantFP() { … }
struct constantexpr_match { … };
inline constantexpr_match m_ConstantExpr() { … }
inline class_match<BasicBlock> m_BasicBlock() { … }
template <typename Ty> struct match_unless { … };
template <typename Ty> inline match_unless<Ty> m_Unless(const Ty &M) { … }
template <typename LTy, typename RTy> struct match_combine_or { … };
template <typename LTy, typename RTy> struct match_combine_and { … };
template <typename LTy, typename RTy>
inline match_combine_or<LTy, RTy> m_CombineOr(const LTy &L, const RTy &R) { … }
template <typename LTy, typename RTy>
inline match_combine_and<LTy, RTy> m_CombineAnd(const LTy &L, const RTy &R) { … }
struct apint_match { … };
struct apfloat_match { … };
inline apint_match m_APInt(const APInt *&Res) { … }
inline apint_match m_APIntAllowPoison(const APInt *&Res) { … }
inline apint_match m_APIntForbidPoison(const APInt *&Res) { … }
inline apfloat_match m_APFloat(const APFloat *&Res) { … }
inline apfloat_match m_APFloatAllowPoison(const APFloat *&Res) { … }
inline apfloat_match m_APFloatForbidPoison(const APFloat *&Res) { … }
template <int64_t Val> struct constantint_match { … };
template <int64_t Val> inline constantint_match<Val> m_ConstantInt() { … }
template <typename Predicate, typename ConstantVal, bool AllowPoison>
struct cstval_pred_ty : public Predicate { … };
cst_pred_ty;
cstfp_pred_ty;
template <typename Predicate> struct api_pred_ty : public Predicate { … };
template <typename Predicate> struct apf_pred_ty : public Predicate { … };
template <typename APTy> struct custom_checkfn { … };
inline cst_pred_ty<custom_checkfn<APInt>>
m_CheckedInt(function_ref<bool(const APInt &)> CheckFn) { … }
inline cst_pred_ty<custom_checkfn<APInt>>
m_CheckedInt(const Constant *&V, function_ref<bool(const APInt &)> CheckFn) { … }
inline cstfp_pred_ty<custom_checkfn<APFloat>>
m_CheckedFp(function_ref<bool(const APFloat &)> CheckFn) { … }
inline cstfp_pred_ty<custom_checkfn<APFloat>>
m_CheckedFp(const Constant *&V, function_ref<bool(const APFloat &)> CheckFn) { … }
struct is_any_apint { … };
inline cst_pred_ty<is_any_apint> m_AnyIntegralConstant() { … }
struct is_shifted_mask { … };
inline cst_pred_ty<is_shifted_mask> m_ShiftedMask() { … }
struct is_all_ones { … };
inline cst_pred_ty<is_all_ones> m_AllOnes() { … }
inline cst_pred_ty<is_all_ones, false> m_AllOnesForbidPoison() { … }
struct is_maxsignedvalue { … };
inline cst_pred_ty<is_maxsignedvalue> m_MaxSignedValue() { … }
inline api_pred_ty<is_maxsignedvalue> m_MaxSignedValue(const APInt *&V) { … }
struct is_negative { … };
inline cst_pred_ty<is_negative> m_Negative() { … }
inline api_pred_ty<is_negative> m_Negative(const APInt *&V) { … }
struct is_nonnegative { … };
inline cst_pred_ty<is_nonnegative> m_NonNegative() { … }
inline api_pred_ty<is_nonnegative> m_NonNegative(const APInt *&V) { … }
struct is_strictlypositive { … };
inline cst_pred_ty<is_strictlypositive> m_StrictlyPositive() { … }
inline api_pred_ty<is_strictlypositive> m_StrictlyPositive(const APInt *&V) { … }
struct is_nonpositive { … };
inline cst_pred_ty<is_nonpositive> m_NonPositive() { … }
inline api_pred_ty<is_nonpositive> m_NonPositive(const APInt *&V) { … }
struct is_one { … };
inline cst_pred_ty<is_one> m_One() { … }
struct is_zero_int { … };
inline cst_pred_ty<is_zero_int> m_ZeroInt() { … }
struct is_zero { … };
inline is_zero m_Zero() { … }
struct is_power2 { … };
inline cst_pred_ty<is_power2> m_Power2() { … }
inline api_pred_ty<is_power2> m_Power2(const APInt *&V) { … }
struct is_negated_power2 { … };
inline cst_pred_ty<is_negated_power2> m_NegatedPower2() { … }
inline api_pred_ty<is_negated_power2> m_NegatedPower2(const APInt *&V) { … }
struct is_negated_power2_or_zero { … };
inline cst_pred_ty<is_negated_power2_or_zero> m_NegatedPower2OrZero() { … }
inline api_pred_ty<is_negated_power2_or_zero>
m_NegatedPower2OrZero(const APInt *&V) { … }
struct is_power2_or_zero { … };
inline cst_pred_ty<is_power2_or_zero> m_Power2OrZero() { … }
inline api_pred_ty<is_power2_or_zero> m_Power2OrZero(const APInt *&V) { … }
struct is_sign_mask { … };
inline cst_pred_ty<is_sign_mask> m_SignMask() { … }
struct is_lowbit_mask { … };
inline cst_pred_ty<is_lowbit_mask> m_LowBitMask() { … }
inline api_pred_ty<is_lowbit_mask> m_LowBitMask(const APInt *&V) { … }
struct is_lowbit_mask_or_zero { … };
inline cst_pred_ty<is_lowbit_mask_or_zero> m_LowBitMaskOrZero() { … }
inline api_pred_ty<is_lowbit_mask_or_zero> m_LowBitMaskOrZero(const APInt *&V) { … }
struct icmp_pred_with_threshold { … };
inline cst_pred_ty<icmp_pred_with_threshold>
m_SpecificInt_ICMP(ICmpInst::Predicate Predicate, const APInt &Threshold) { … }
struct is_nan { … };
inline cstfp_pred_ty<is_nan> m_NaN() { … }
struct is_nonnan { … };
inline cstfp_pred_ty<is_nonnan> m_NonNaN() { … }
struct is_inf { … };
inline cstfp_pred_ty<is_inf> m_Inf() { … }
struct is_noninf { … };
inline cstfp_pred_ty<is_noninf> m_NonInf() { … }
struct is_finite { … };
inline cstfp_pred_ty<is_finite> m_Finite() { … }
inline apf_pred_ty<is_finite> m_Finite(const APFloat *&V) { … }
struct is_finitenonzero { … };
inline cstfp_pred_ty<is_finitenonzero> m_FiniteNonZero() { … }
inline apf_pred_ty<is_finitenonzero> m_FiniteNonZero(const APFloat *&V) { … }
struct is_any_zero_fp { … };
inline cstfp_pred_ty<is_any_zero_fp> m_AnyZeroFP() { … }
struct is_pos_zero_fp { … };
inline cstfp_pred_ty<is_pos_zero_fp> m_PosZeroFP() { … }
struct is_neg_zero_fp { … };
inline cstfp_pred_ty<is_neg_zero_fp> m_NegZeroFP() { … }
struct is_non_zero_fp { … };
inline cstfp_pred_ty<is_non_zero_fp> m_NonZeroFP() { … }
template <typename Class> struct bind_ty { … };
inline bind_ty<Value> m_Value(Value *&V) { … }
inline bind_ty<const Value> m_Value(const Value *&V) { … }
inline bind_ty<Instruction> m_Instruction(Instruction *&I) { … }
inline bind_ty<UnaryOperator> m_UnOp(UnaryOperator *&I) { … }
inline bind_ty<BinaryOperator> m_BinOp(BinaryOperator *&I) { … }
inline bind_ty<WithOverflowInst> m_WithOverflowInst(WithOverflowInst *&I) { … }
inline bind_ty<const WithOverflowInst>
m_WithOverflowInst(const WithOverflowInst *&I) { … }
inline bind_ty<UndefValue> m_UndefValue(UndefValue *&U) { … }
inline bind_ty<Constant> m_Constant(Constant *&C) { … }
inline bind_ty<ConstantInt> m_ConstantInt(ConstantInt *&CI) { … }
inline bind_ty<ConstantFP> m_ConstantFP(ConstantFP *&C) { … }
inline bind_ty<ConstantExpr> m_ConstantExpr(ConstantExpr *&C) { … }
inline bind_ty<BasicBlock> m_BasicBlock(BasicBlock *&V) { … }
inline bind_ty<const BasicBlock> m_BasicBlock(const BasicBlock *&V) { … }
inline match_combine_and<class_match<Constant>,
match_unless<constantexpr_match>>
m_ImmConstant() { … }
inline match_combine_and<bind_ty<Constant>,
match_unless<constantexpr_match>>
m_ImmConstant(Constant *&C) { … }
struct specificval_ty { … };
inline specificval_ty m_Specific(const Value *V) { … }
template <typename Class> struct deferredval_ty { … };
inline deferredval_ty<Value> m_Deferred(Value *const &V) { … }
inline deferredval_ty<const Value> m_Deferred(const Value *const &V) { … }
struct specific_fpval { … };
inline specific_fpval m_SpecificFP(double V) { … }
inline specific_fpval m_FPOne() { … }
struct bind_const_intval_ty { … };
template <bool AllowPoison> struct specific_intval { … };
template <bool AllowPoison> struct specific_intval64 { … };
inline specific_intval<false> m_SpecificInt(const APInt &V) { … }
inline specific_intval64<false> m_SpecificInt(uint64_t V) { … }
inline specific_intval<true> m_SpecificIntAllowPoison(const APInt &V) { … }
inline specific_intval64<true> m_SpecificIntAllowPoison(uint64_t V) { … }
inline bind_const_intval_ty m_ConstantInt(uint64_t &V) { … }
struct specific_bbval { … };
inline specific_bbval m_SpecificBB(BasicBlock *BB) { … }
inline deferredval_ty<BasicBlock> m_Deferred(BasicBlock *const &BB) { … }
inline deferredval_ty<const BasicBlock>
m_Deferred(const BasicBlock *const &BB) { … }
template <typename LHS_t, typename RHS_t, bool Commutable = false>
struct AnyBinaryOp_match { … };
template <typename LHS, typename RHS>
inline AnyBinaryOp_match<LHS, RHS> m_BinOp(const LHS &L, const RHS &R) { … }
template <typename OP_t> struct AnyUnaryOp_match { … };
template <typename OP_t> inline AnyUnaryOp_match<OP_t> m_UnOp(const OP_t &X) { … }
template <typename LHS_t, typename RHS_t, unsigned Opcode,
bool Commutable = false>
struct BinaryOp_match { … };
template <typename LHS, typename RHS>
inline BinaryOp_match<LHS, RHS, Instruction::Add> m_Add(const LHS &L,
const RHS &R) { … }
template <typename LHS, typename RHS>
inline BinaryOp_match<LHS, RHS, Instruction::FAdd> m_FAdd(const LHS &L,
const RHS &R) { … }
template <typename LHS, typename RHS>
inline BinaryOp_match<LHS, RHS, Instruction::Sub> m_Sub(const LHS &L,
const RHS &R) { … }
template <typename LHS, typename RHS>
inline BinaryOp_match<LHS, RHS, Instruction::FSub> m_FSub(const LHS &L,
const RHS &R) { … }
template <typename Op_t> struct FNeg_match { … };
template <typename OpTy> inline FNeg_match<OpTy> m_FNeg(const OpTy &X) { … }
template <typename RHS>
inline BinaryOp_match<cstfp_pred_ty<is_any_zero_fp>, RHS, Instruction::FSub>
m_FNegNSZ(const RHS &X) { … }
template <typename LHS, typename RHS>
inline BinaryOp_match<LHS, RHS, Instruction::Mul> m_Mul(const LHS &L,
const RHS &R) { … }
template <typename LHS, typename RHS>
inline BinaryOp_match<LHS, RHS, Instruction::FMul> m_FMul(const LHS &L,
const RHS &R) { … }
template <typename LHS, typename RHS>
inline BinaryOp_match<LHS, RHS, Instruction::UDiv> m_UDiv(const LHS &L,
const RHS &R) { … }
template <typename LHS, typename RHS>
inline BinaryOp_match<LHS, RHS, Instruction::SDiv> m_SDiv(const LHS &L,
const RHS &R) { … }
template <typename LHS, typename RHS>
inline BinaryOp_match<LHS, RHS, Instruction::FDiv> m_FDiv(const LHS &L,
const RHS &R) { … }
template <typename LHS, typename RHS>
inline BinaryOp_match<LHS, RHS, Instruction::URem> m_URem(const LHS &L,
const RHS &R) { … }
template <typename LHS, typename RHS>
inline BinaryOp_match<LHS, RHS, Instruction::SRem> m_SRem(const LHS &L,
const RHS &R) { … }
template <typename LHS, typename RHS>
inline BinaryOp_match<LHS, RHS, Instruction::FRem> m_FRem(const LHS &L,
const RHS &R) { … }
template <typename LHS, typename RHS>
inline BinaryOp_match<LHS, RHS, Instruction::And> m_And(const LHS &L,
const RHS &R) { … }
template <typename LHS, typename RHS>
inline BinaryOp_match<LHS, RHS, Instruction::Or> m_Or(const LHS &L,
const RHS &R) { … }
template <typename LHS, typename RHS>
inline BinaryOp_match<LHS, RHS, Instruction::Xor> m_Xor(const LHS &L,
const RHS &R) { … }
template <typename LHS, typename RHS>
inline BinaryOp_match<LHS, RHS, Instruction::Shl> m_Shl(const LHS &L,
const RHS &R) { … }
template <typename LHS, typename RHS>
inline BinaryOp_match<LHS, RHS, Instruction::LShr> m_LShr(const LHS &L,
const RHS &R) { … }
template <typename LHS, typename RHS>
inline BinaryOp_match<LHS, RHS, Instruction::AShr> m_AShr(const LHS &L,
const RHS &R) { … }
template <typename LHS_t, typename RHS_t, unsigned Opcode,
unsigned WrapFlags = 0, bool Commutable = false>
struct OverflowingBinaryOp_match { … };
template <typename LHS, typename RHS>
inline OverflowingBinaryOp_match<LHS, RHS, Instruction::Add,
OverflowingBinaryOperator::NoSignedWrap>
m_NSWAdd(const LHS &L, const RHS &R) { … }
template <typename LHS, typename RHS>
inline OverflowingBinaryOp_match<LHS, RHS, Instruction::Sub,
OverflowingBinaryOperator::NoSignedWrap>
m_NSWSub(const LHS &L, const RHS &R) { … }
template <typename LHS, typename RHS>
inline OverflowingBinaryOp_match<LHS, RHS, Instruction::Mul,
OverflowingBinaryOperator::NoSignedWrap>
m_NSWMul(const LHS &L, const RHS &R) { … }
template <typename LHS, typename RHS>
inline OverflowingBinaryOp_match<LHS, RHS, Instruction::Shl,
OverflowingBinaryOperator::NoSignedWrap>
m_NSWShl(const LHS &L, const RHS &R) { … }
template <typename LHS, typename RHS>
inline OverflowingBinaryOp_match<LHS, RHS, Instruction::Add,
OverflowingBinaryOperator::NoUnsignedWrap>
m_NUWAdd(const LHS &L, const RHS &R) { … }
template <typename LHS, typename RHS>
inline OverflowingBinaryOp_match<
LHS, RHS, Instruction::Add, OverflowingBinaryOperator::NoUnsignedWrap, true>
m_c_NUWAdd(const LHS &L, const RHS &R) { … }
template <typename LHS, typename RHS>
inline OverflowingBinaryOp_match<LHS, RHS, Instruction::Sub,
OverflowingBinaryOperator::NoUnsignedWrap>
m_NUWSub(const LHS &L, const RHS &R) { … }
template <typename LHS, typename RHS>
inline OverflowingBinaryOp_match<LHS, RHS, Instruction::Mul,
OverflowingBinaryOperator::NoUnsignedWrap>
m_NUWMul(const LHS &L, const RHS &R) { … }
template <typename LHS, typename RHS>
inline OverflowingBinaryOp_match<LHS, RHS, Instruction::Shl,
OverflowingBinaryOperator::NoUnsignedWrap>
m_NUWShl(const LHS &L, const RHS &R) { … }
template <typename LHS_t, typename RHS_t, bool Commutable = false>
struct SpecificBinaryOp_match
: public BinaryOp_match<LHS_t, RHS_t, 0, Commutable> { … };
template <typename LHS, typename RHS>
inline SpecificBinaryOp_match<LHS, RHS> m_BinOp(unsigned Opcode, const LHS &L,
const RHS &R) { … }
template <typename LHS, typename RHS, bool Commutable = false>
struct DisjointOr_match { … };
template <typename LHS, typename RHS>
inline DisjointOr_match<LHS, RHS> m_DisjointOr(const LHS &L, const RHS &R) { … }
template <typename LHS, typename RHS>
inline DisjointOr_match<LHS, RHS, true> m_c_DisjointOr(const LHS &L,
const RHS &R) { … }
template <typename LHS, typename RHS>
inline match_combine_or<BinaryOp_match<LHS, RHS, Instruction::Add>,
DisjointOr_match<LHS, RHS>>
m_AddLike(const LHS &L, const RHS &R) { … }
template <typename LHS, typename RHS>
inline match_combine_or<
OverflowingBinaryOp_match<LHS, RHS, Instruction::Add,
OverflowingBinaryOperator::NoSignedWrap>,
DisjointOr_match<LHS, RHS>>
m_NSWAddLike(const LHS &L, const RHS &R) { … }
template <typename LHS, typename RHS>
inline match_combine_or<
OverflowingBinaryOp_match<LHS, RHS, Instruction::Add,
OverflowingBinaryOperator::NoUnsignedWrap>,
DisjointOr_match<LHS, RHS>>
m_NUWAddLike(const LHS &L, const RHS &R) { … }
template <typename LHS_t, typename RHS_t, typename Predicate,
bool Commutable = false>
struct BinOpPred_match : Predicate { … };
struct is_shift_op { … };
struct is_right_shift_op { … };
struct is_logical_shift_op { … };
struct is_bitwiselogic_op { … };
struct is_idiv_op { … };
struct is_irem_op { … };
template <typename LHS, typename RHS>
inline BinOpPred_match<LHS, RHS, is_shift_op> m_Shift(const LHS &L,
const RHS &R) { … }
template <typename LHS, typename RHS>
inline BinOpPred_match<LHS, RHS, is_right_shift_op> m_Shr(const LHS &L,
const RHS &R) { … }
template <typename LHS, typename RHS>
inline BinOpPred_match<LHS, RHS, is_logical_shift_op>
m_LogicalShift(const LHS &L, const RHS &R) { … }
template <typename LHS, typename RHS>
inline BinOpPred_match<LHS, RHS, is_bitwiselogic_op>
m_BitwiseLogic(const LHS &L, const RHS &R) { … }
template <typename LHS, typename RHS>
inline BinOpPred_match<LHS, RHS, is_bitwiselogic_op, true>
m_c_BitwiseLogic(const LHS &L, const RHS &R) { … }
template <typename LHS, typename RHS>
inline BinOpPred_match<LHS, RHS, is_idiv_op> m_IDiv(const LHS &L,
const RHS &R) { … }
template <typename LHS, typename RHS>
inline BinOpPred_match<LHS, RHS, is_irem_op> m_IRem(const LHS &L,
const RHS &R) { … }
template <typename SubPattern_t> struct Exact_match { … };
template <typename T> inline Exact_match<T> m_Exact(const T &SubPattern) { … }
template <typename LHS_t, typename RHS_t, typename Class, typename PredicateTy,
bool Commutable = false>
struct CmpClass_match { … };
template <typename LHS, typename RHS>
inline CmpClass_match<LHS, RHS, CmpInst, CmpInst::Predicate>
m_Cmp(CmpInst::Predicate &Pred, const LHS &L, const RHS &R) { … }
template <typename LHS, typename RHS>
inline CmpClass_match<LHS, RHS, ICmpInst, ICmpInst::Predicate>
m_ICmp(ICmpInst::Predicate &Pred, const LHS &L, const RHS &R) { … }
template <typename LHS, typename RHS>
inline CmpClass_match<LHS, RHS, FCmpInst, FCmpInst::Predicate>
m_FCmp(FCmpInst::Predicate &Pred, const LHS &L, const RHS &R) { … }
template <typename LHS, typename RHS>
inline CmpClass_match<LHS, RHS, CmpInst, CmpInst::Predicate>
m_Cmp(const LHS &L, const RHS &R) { … }
template <typename LHS, typename RHS>
inline CmpClass_match<LHS, RHS, ICmpInst, ICmpInst::Predicate>
m_ICmp(const LHS &L, const RHS &R) { … }
template <typename LHS, typename RHS>
inline CmpClass_match<LHS, RHS, FCmpInst, FCmpInst::Predicate>
m_FCmp(const LHS &L, const RHS &R) { … }
template <typename LHS_t, typename RHS_t, typename Class, typename PredicateTy,
bool Commutable = false>
struct SpecificCmpClass_match { … };
template <typename LHS, typename RHS>
inline SpecificCmpClass_match<LHS, RHS, CmpInst, CmpInst::Predicate>
m_SpecificCmp(CmpInst::Predicate MatchPred, const LHS &L, const RHS &R) { … }
template <typename LHS, typename RHS>
inline SpecificCmpClass_match<LHS, RHS, ICmpInst, ICmpInst::Predicate>
m_SpecificICmp(ICmpInst::Predicate MatchPred, const LHS &L, const RHS &R) { … }
template <typename LHS, typename RHS>
inline SpecificCmpClass_match<LHS, RHS, ICmpInst, ICmpInst::Predicate, true>
m_c_SpecificICmp(ICmpInst::Predicate MatchPred, const LHS &L, const RHS &R) { … }
template <typename LHS, typename RHS>
inline SpecificCmpClass_match<LHS, RHS, FCmpInst, FCmpInst::Predicate>
m_SpecificFCmp(FCmpInst::Predicate MatchPred, const LHS &L, const RHS &R) { … }
template <typename T0, unsigned Opcode> struct OneOps_match { … };
template <typename T0, typename T1, unsigned Opcode> struct TwoOps_match { … };
template <typename T0, typename T1, typename T2, unsigned Opcode>
struct ThreeOps_match { … };
template <unsigned Opcode, typename... OperandTypes> struct AnyOps_match { … };
template <typename Cond, typename LHS, typename RHS>
inline ThreeOps_match<Cond, LHS, RHS, Instruction::Select>
m_Select(const Cond &C, const LHS &L, const RHS &R) { … }
template <int64_t L, int64_t R, typename Cond>
inline ThreeOps_match<Cond, constantint_match<L>, constantint_match<R>,
Instruction::Select>
m_SelectCst(const Cond &C) { … }
template <typename OpTy>
inline OneOps_match<OpTy, Instruction::Freeze> m_Freeze(const OpTy &Op) { … }
template <typename Val_t, typename Elt_t, typename Idx_t>
inline ThreeOps_match<Val_t, Elt_t, Idx_t, Instruction::InsertElement>
m_InsertElt(const Val_t &Val, const Elt_t &Elt, const Idx_t &Idx) { … }
template <typename Val_t, typename Idx_t>
inline TwoOps_match<Val_t, Idx_t, Instruction::ExtractElement>
m_ExtractElt(const Val_t &Val, const Idx_t &Idx) { … }
template <typename T0, typename T1, typename T2> struct Shuffle_match { … };
struct m_Mask { … };
struct m_ZeroMask { … };
struct m_SpecificMask { … };
struct m_SplatOrPoisonMask { … };
template <typename PointerOpTy, typename OffsetOpTy> struct PtrAdd_match { … };
template <typename V1_t, typename V2_t>
inline TwoOps_match<V1_t, V2_t, Instruction::ShuffleVector>
m_Shuffle(const V1_t &v1, const V2_t &v2) { … }
template <typename V1_t, typename V2_t, typename Mask_t>
inline Shuffle_match<V1_t, V2_t, Mask_t>
m_Shuffle(const V1_t &v1, const V2_t &v2, const Mask_t &mask) { … }
template <typename OpTy>
inline OneOps_match<OpTy, Instruction::Load> m_Load(const OpTy &Op) { … }
template <typename ValueOpTy, typename PointerOpTy>
inline TwoOps_match<ValueOpTy, PointerOpTy, Instruction::Store>
m_Store(const ValueOpTy &ValueOp, const PointerOpTy &PointerOp) { … }
template <typename... OperandTypes>
inline auto m_GEP(const OperandTypes &...Ops) { … }
template <typename PointerOpTy, typename OffsetOpTy>
inline PtrAdd_match<PointerOpTy, OffsetOpTy>
m_PtrAdd(const PointerOpTy &PointerOp, const OffsetOpTy &OffsetOp) { … }
template <typename Op_t, unsigned Opcode> struct CastOperator_match { … };
template <typename Op_t, typename Class> struct CastInst_match { … };
template <typename Op_t> struct PtrToIntSameSize_match { … };
template <typename Op_t> struct NNegZExt_match { … };
template <typename Op_t, unsigned WrapFlags = 0> struct NoWrapTrunc_match { … };
template <typename OpTy>
inline CastOperator_match<OpTy, Instruction::BitCast>
m_BitCast(const OpTy &Op) { … }
template <typename Op_t> struct ElementWiseBitCast_match { … };
template <typename OpTy>
inline ElementWiseBitCast_match<OpTy> m_ElementWiseBitCast(const OpTy &Op) { … }
template <typename OpTy>
inline CastOperator_match<OpTy, Instruction::PtrToInt>
m_PtrToInt(const OpTy &Op) { … }
template <typename OpTy>
inline PtrToIntSameSize_match<OpTy> m_PtrToIntSameSize(const DataLayout &DL,
const OpTy &Op) { … }
template <typename OpTy>
inline CastOperator_match<OpTy, Instruction::IntToPtr>
m_IntToPtr(const OpTy &Op) { … }
template <typename OpTy>
inline CastInst_match<OpTy, TruncInst> m_Trunc(const OpTy &Op) { … }
template <typename OpTy>
inline NoWrapTrunc_match<OpTy, TruncInst::NoUnsignedWrap>
m_NUWTrunc(const OpTy &Op) { … }
template <typename OpTy>
inline NoWrapTrunc_match<OpTy, TruncInst::NoSignedWrap>
m_NSWTrunc(const OpTy &Op) { … }
template <typename OpTy>
inline match_combine_or<CastInst_match<OpTy, TruncInst>, OpTy>
m_TruncOrSelf(const OpTy &Op) { … }
template <typename OpTy>
inline CastInst_match<OpTy, SExtInst> m_SExt(const OpTy &Op) { … }
template <typename OpTy>
inline CastInst_match<OpTy, ZExtInst> m_ZExt(const OpTy &Op) { … }
template <typename OpTy>
inline NNegZExt_match<OpTy> m_NNegZExt(const OpTy &Op) { … }
template <typename OpTy>
inline match_combine_or<CastInst_match<OpTy, ZExtInst>, OpTy>
m_ZExtOrSelf(const OpTy &Op) { … }
template <typename OpTy>
inline match_combine_or<CastInst_match<OpTy, SExtInst>, OpTy>
m_SExtOrSelf(const OpTy &Op) { … }
template <typename OpTy>
inline match_combine_or<CastInst_match<OpTy, SExtInst>, NNegZExt_match<OpTy>>
m_SExtLike(const OpTy &Op) { … }
template <typename OpTy>
inline match_combine_or<CastInst_match<OpTy, ZExtInst>,
CastInst_match<OpTy, SExtInst>>
m_ZExtOrSExt(const OpTy &Op) { … }
template <typename OpTy>
inline match_combine_or<match_combine_or<CastInst_match<OpTy, ZExtInst>,
CastInst_match<OpTy, SExtInst>>,
OpTy>
m_ZExtOrSExtOrSelf(const OpTy &Op) { … }
template <typename OpTy>
inline CastInst_match<OpTy, UIToFPInst> m_UIToFP(const OpTy &Op) { … }
template <typename OpTy>
inline CastInst_match<OpTy, SIToFPInst> m_SIToFP(const OpTy &Op) { … }
template <typename OpTy>
inline CastInst_match<OpTy, FPToUIInst> m_FPToUI(const OpTy &Op) { … }
template <typename OpTy>
inline CastInst_match<OpTy, FPToSIInst> m_FPToSI(const OpTy &Op) { … }
template <typename OpTy>
inline CastInst_match<OpTy, FPTruncInst> m_FPTrunc(const OpTy &Op) { … }
template <typename OpTy>
inline CastInst_match<OpTy, FPExtInst> m_FPExt(const OpTy &Op) { … }
struct br_match { … };
inline br_match m_UnconditionalBr(BasicBlock *&Succ) { … }
template <typename Cond_t, typename TrueBlock_t, typename FalseBlock_t>
struct brc_match { … };
template <typename Cond_t>
inline brc_match<Cond_t, bind_ty<BasicBlock>, bind_ty<BasicBlock>>
m_Br(const Cond_t &C, BasicBlock *&T, BasicBlock *&F) { … }
template <typename Cond_t, typename TrueBlock_t, typename FalseBlock_t>
inline brc_match<Cond_t, TrueBlock_t, FalseBlock_t>
m_Br(const Cond_t &C, const TrueBlock_t &T, const FalseBlock_t &F) { … }
template <typename CmpInst_t, typename LHS_t, typename RHS_t, typename Pred_t,
bool Commutable = false>
struct MaxMin_match { … };
struct smax_pred_ty { … };
struct smin_pred_ty { … };
struct umax_pred_ty { … };
struct umin_pred_ty { … };
struct ofmax_pred_ty { … };
struct ofmin_pred_ty { … };
struct ufmax_pred_ty { … };
struct ufmin_pred_ty { … };
template <typename LHS, typename RHS>
inline MaxMin_match<ICmpInst, LHS, RHS, smax_pred_ty> m_SMax(const LHS &L,
const RHS &R) { … }
template <typename LHS, typename RHS>
inline MaxMin_match<ICmpInst, LHS, RHS, smin_pred_ty> m_SMin(const LHS &L,
const RHS &R) { … }
template <typename LHS, typename RHS>
inline MaxMin_match<ICmpInst, LHS, RHS, umax_pred_ty> m_UMax(const LHS &L,
const RHS &R) { … }
template <typename LHS, typename RHS>
inline MaxMin_match<ICmpInst, LHS, RHS, umin_pred_ty> m_UMin(const LHS &L,
const RHS &R) { … }
template <typename LHS, typename RHS>
inline match_combine_or<
match_combine_or<MaxMin_match<ICmpInst, LHS, RHS, smax_pred_ty>,
MaxMin_match<ICmpInst, LHS, RHS, smin_pred_ty>>,
match_combine_or<MaxMin_match<ICmpInst, LHS, RHS, umax_pred_ty>,
MaxMin_match<ICmpInst, LHS, RHS, umin_pred_ty>>>
m_MaxOrMin(const LHS &L, const RHS &R) { … }
template <typename LHS, typename RHS>
inline MaxMin_match<FCmpInst, LHS, RHS, ofmax_pred_ty> m_OrdFMax(const LHS &L,
const RHS &R) { … }
template <typename LHS, typename RHS>
inline MaxMin_match<FCmpInst, LHS, RHS, ofmin_pred_ty> m_OrdFMin(const LHS &L,
const RHS &R) { … }
template <typename LHS, typename RHS>
inline MaxMin_match<FCmpInst, LHS, RHS, ufmax_pred_ty>
m_UnordFMax(const LHS &L, const RHS &R) { … }
template <typename LHS, typename RHS>
inline MaxMin_match<FCmpInst, LHS, RHS, ufmin_pred_ty>
m_UnordFMin(const LHS &L, const RHS &R) { … }
template <typename ValTy>
inline BinaryOp_match<cst_pred_ty<is_all_ones>, ValTy, Instruction::Xor, true>
m_Not(const ValTy &V) { … }
template <typename ValTy>
inline BinaryOp_match<cst_pred_ty<is_all_ones, false>, ValTy, Instruction::Xor,
true>
m_NotForbidPoison(const ValTy &V) { … }
template <typename LHS_t, typename RHS_t, typename Sum_t>
struct UAddWithOverflow_match { … };
template <typename LHS_t, typename RHS_t, typename Sum_t>
UAddWithOverflow_match<LHS_t, RHS_t, Sum_t>
m_UAddWithOverflow(const LHS_t &L, const RHS_t &R, const Sum_t &S) { … }
template <typename Opnd_t> struct Argument_match { … };
template <unsigned OpI, typename Opnd_t>
inline Argument_match<Opnd_t> m_Argument(const Opnd_t &Op) { … }
struct IntrinsicID_match { … };
template <typename T0 = void, typename T1 = void, typename T2 = void,
typename T3 = void, typename T4 = void, typename T5 = void,
typename T6 = void, typename T7 = void, typename T8 = void,
typename T9 = void, typename T10 = void>
struct m_Intrinsic_Ty;
m_Intrinsic_Ty<T0>;
m_Intrinsic_Ty<T0, T1>;
m_Intrinsic_Ty<T0, T1, T2>;
m_Intrinsic_Ty<T0, T1, T2, T3>;
m_Intrinsic_Ty<T0, T1, T2, T3, T4>;
m_Intrinsic_Ty<T0, T1, T2, T3, T4, T5>;
template <Intrinsic::ID IntrID> inline IntrinsicID_match m_Intrinsic() { … }
template <typename Opnd0, typename Opnd1, typename Opnd2, typename Opnd3>
inline typename m_Intrinsic_Ty<Opnd0, Opnd1, Opnd2, Opnd3>::Ty
m_MaskedLoad(const Opnd0 &Op0, const Opnd1 &Op1, const Opnd2 &Op2,
const Opnd3 &Op3) { … }
template <typename Opnd0, typename Opnd1, typename Opnd2, typename Opnd3>
inline typename m_Intrinsic_Ty<Opnd0, Opnd1, Opnd2, Opnd3>::Ty
m_MaskedGather(const Opnd0 &Op0, const Opnd1 &Op1, const Opnd2 &Op2,
const Opnd3 &Op3) { … }
template <Intrinsic::ID IntrID, typename T0>
inline typename m_Intrinsic_Ty<T0>::Ty m_Intrinsic(const T0 &Op0) { … }
template <Intrinsic::ID IntrID, typename T0, typename T1>
inline typename m_Intrinsic_Ty<T0, T1>::Ty m_Intrinsic(const T0 &Op0,
const T1 &Op1) { … }
template <Intrinsic::ID IntrID, typename T0, typename T1, typename T2>
inline typename m_Intrinsic_Ty<T0, T1, T2>::Ty
m_Intrinsic(const T0 &Op0, const T1 &Op1, const T2 &Op2) { … }
template <Intrinsic::ID IntrID, typename T0, typename T1, typename T2,
typename T3>
inline typename m_Intrinsic_Ty<T0, T1, T2, T3>::Ty
m_Intrinsic(const T0 &Op0, const T1 &Op1, const T2 &Op2, const T3 &Op3) { … }
template <Intrinsic::ID IntrID, typename T0, typename T1, typename T2,
typename T3, typename T4>
inline typename m_Intrinsic_Ty<T0, T1, T2, T3, T4>::Ty
m_Intrinsic(const T0 &Op0, const T1 &Op1, const T2 &Op2, const T3 &Op3,
const T4 &Op4) { … }
template <Intrinsic::ID IntrID, typename T0, typename T1, typename T2,
typename T3, typename T4, typename T5>
inline typename m_Intrinsic_Ty<T0, T1, T2, T3, T4, T5>::Ty
m_Intrinsic(const T0 &Op0, const T1 &Op1, const T2 &Op2, const T3 &Op3,
const T4 &Op4, const T5 &Op5) { … }
template <typename Opnd0>
inline typename m_Intrinsic_Ty<Opnd0>::Ty m_BitReverse(const Opnd0 &Op0) { … }
template <typename Opnd0>
inline typename m_Intrinsic_Ty<Opnd0>::Ty m_BSwap(const Opnd0 &Op0) { … }
template <typename Opnd0>
inline typename m_Intrinsic_Ty<Opnd0>::Ty m_FAbs(const Opnd0 &Op0) { … }
template <typename Opnd0>
inline typename m_Intrinsic_Ty<Opnd0>::Ty m_FCanonicalize(const Opnd0 &Op0) { … }
template <typename Opnd0, typename Opnd1>
inline typename m_Intrinsic_Ty<Opnd0, Opnd1>::Ty m_FMin(const Opnd0 &Op0,
const Opnd1 &Op1) { … }
template <typename Opnd0, typename Opnd1>
inline typename m_Intrinsic_Ty<Opnd0, Opnd1>::Ty m_FMax(const Opnd0 &Op0,
const Opnd1 &Op1) { … }
template <typename Opnd0, typename Opnd1, typename Opnd2>
inline typename m_Intrinsic_Ty<Opnd0, Opnd1, Opnd2>::Ty
m_FShl(const Opnd0 &Op0, const Opnd1 &Op1, const Opnd2 &Op2) { … }
template <typename Opnd0, typename Opnd1, typename Opnd2>
inline typename m_Intrinsic_Ty<Opnd0, Opnd1, Opnd2>::Ty
m_FShr(const Opnd0 &Op0, const Opnd1 &Op1, const Opnd2 &Op2) { … }
template <typename Opnd0>
inline typename m_Intrinsic_Ty<Opnd0>::Ty m_Sqrt(const Opnd0 &Op0) { … }
template <typename Opnd0, typename Opnd1>
inline typename m_Intrinsic_Ty<Opnd0, Opnd1>::Ty m_CopySign(const Opnd0 &Op0,
const Opnd1 &Op1) { … }
template <typename Opnd0>
inline typename m_Intrinsic_Ty<Opnd0>::Ty m_VecReverse(const Opnd0 &Op0) { … }
template <typename LHS, typename RHS>
inline AnyBinaryOp_match<LHS, RHS, true> m_c_BinOp(const LHS &L, const RHS &R) { … }
template <typename LHS, typename RHS>
inline CmpClass_match<LHS, RHS, ICmpInst, ICmpInst::Predicate, true>
m_c_ICmp(ICmpInst::Predicate &Pred, const LHS &L, const RHS &R) { … }
template <typename LHS, typename RHS>
inline CmpClass_match<LHS, RHS, ICmpInst, ICmpInst::Predicate, true>
m_c_ICmp(const LHS &L, const RHS &R) { … }
template <typename LHS, typename RHS>
inline SpecificBinaryOp_match<LHS, RHS, true>
m_c_BinOp(unsigned Opcode, const LHS &L, const RHS &R) { … }
template <typename LHS, typename RHS>
inline BinaryOp_match<LHS, RHS, Instruction::Add, true> m_c_Add(const LHS &L,
const RHS &R) { … }
template <typename LHS, typename RHS>
inline BinaryOp_match<LHS, RHS, Instruction::Mul, true> m_c_Mul(const LHS &L,
const RHS &R) { … }
template <typename LHS, typename RHS>
inline BinaryOp_match<LHS, RHS, Instruction::And, true> m_c_And(const LHS &L,
const RHS &R) { … }
template <typename LHS, typename RHS>
inline BinaryOp_match<LHS, RHS, Instruction::Or, true> m_c_Or(const LHS &L,
const RHS &R) { … }
template <typename LHS, typename RHS>
inline BinaryOp_match<LHS, RHS, Instruction::Xor, true> m_c_Xor(const LHS &L,
const RHS &R) { … }
template <typename ValTy>
inline BinaryOp_match<cst_pred_ty<is_zero_int>, ValTy, Instruction::Sub>
m_Neg(const ValTy &V) { … }
template <typename ValTy>
inline OverflowingBinaryOp_match<cst_pred_ty<is_zero_int>, ValTy,
Instruction::Sub,
OverflowingBinaryOperator::NoSignedWrap>
m_NSWNeg(const ValTy &V) { … }
template <typename LHS, typename RHS>
inline MaxMin_match<ICmpInst, LHS, RHS, smin_pred_ty, true>
m_c_SMin(const LHS &L, const RHS &R) { … }
template <typename LHS, typename RHS>
inline MaxMin_match<ICmpInst, LHS, RHS, smax_pred_ty, true>
m_c_SMax(const LHS &L, const RHS &R) { … }
template <typename LHS, typename RHS>
inline MaxMin_match<ICmpInst, LHS, RHS, umin_pred_ty, true>
m_c_UMin(const LHS &L, const RHS &R) { … }
template <typename LHS, typename RHS>
inline MaxMin_match<ICmpInst, LHS, RHS, umax_pred_ty, true>
m_c_UMax(const LHS &L, const RHS &R) { … }
template <typename LHS, typename RHS>
inline match_combine_or<
match_combine_or<MaxMin_match<ICmpInst, LHS, RHS, smax_pred_ty, true>,
MaxMin_match<ICmpInst, LHS, RHS, smin_pred_ty, true>>,
match_combine_or<MaxMin_match<ICmpInst, LHS, RHS, umax_pred_ty, true>,
MaxMin_match<ICmpInst, LHS, RHS, umin_pred_ty, true>>>
m_c_MaxOrMin(const LHS &L, const RHS &R) { … }
template <Intrinsic::ID IntrID, typename T0, typename T1>
inline match_combine_or<typename m_Intrinsic_Ty<T0, T1>::Ty,
typename m_Intrinsic_Ty<T1, T0>::Ty>
m_c_Intrinsic(const T0 &Op0, const T1 &Op1) { … }
template <typename LHS, typename RHS>
inline BinaryOp_match<LHS, RHS, Instruction::FAdd, true>
m_c_FAdd(const LHS &L, const RHS &R) { … }
template <typename LHS, typename RHS>
inline BinaryOp_match<LHS, RHS, Instruction::FMul, true>
m_c_FMul(const LHS &L, const RHS &R) { … }
template <typename Opnd_t> struct Signum_match { … };
template <typename Val_t> inline Signum_match<Val_t> m_Signum(const Val_t &V) { … }
template <int Ind, typename Opnd_t> struct ExtractValue_match { … };
template <int Ind, typename Val_t>
inline ExtractValue_match<Ind, Val_t> m_ExtractValue(const Val_t &V) { … }
template <typename Val_t>
inline ExtractValue_match<-1, Val_t> m_ExtractValue(const Val_t &V) { … }
template <int Ind, typename T0, typename T1> struct InsertValue_match { … };
template <int Ind, typename Val_t, typename Elt_t>
inline InsertValue_match<Ind, Val_t, Elt_t> m_InsertValue(const Val_t &Val,
const Elt_t &Elt) { … }
struct VScaleVal_match { … };
inline VScaleVal_match m_VScale() { … }
template <typename Opnd0, typename Opnd1>
inline typename m_Intrinsic_Ty<Opnd0, Opnd1>::Ty
m_Interleave2(const Opnd0 &Op0, const Opnd1 &Op1) { … }
template <typename Opnd>
inline typename m_Intrinsic_Ty<Opnd>::Ty m_Deinterleave2(const Opnd &Op) { … }
template <typename LHS, typename RHS, unsigned Opcode, bool Commutable = false>
struct LogicalOp_match { … };
template <typename LHS, typename RHS>
inline LogicalOp_match<LHS, RHS, Instruction::And> m_LogicalAnd(const LHS &L,
const RHS &R) { … }
inline auto m_LogicalAnd() { … }
template <typename LHS, typename RHS>
inline LogicalOp_match<LHS, RHS, Instruction::And, true>
m_c_LogicalAnd(const LHS &L, const RHS &R) { … }
template <typename LHS, typename RHS>
inline LogicalOp_match<LHS, RHS, Instruction::Or> m_LogicalOr(const LHS &L,
const RHS &R) { … }
inline auto m_LogicalOr() { … }
template <typename LHS, typename RHS>
inline LogicalOp_match<LHS, RHS, Instruction::Or, true>
m_c_LogicalOr(const LHS &L, const RHS &R) { … }
template <typename LHS, typename RHS, bool Commutable = false>
inline auto m_LogicalOp(const LHS &L, const RHS &R) { … }
inline auto m_LogicalOp() { … }
template <typename LHS, typename RHS>
inline auto m_c_LogicalOp(const LHS &L, const RHS &R) { … }
}
}
#endif