1 //===- PatternMatch.h - Match on the LLVM IR --------------------*- C++ -*-===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // This file provides a simple and efficient mechanism for performing general
10 // tree-based pattern matches on the LLVM IR. The power of these routines is
11 // that it allows you to write concise patterns that are expressive and easy to
12 // understand. The other major advantage of this is that it allows you to
13 // trivially capture/bind elements in the pattern to variables. For example,
14 // you can do something like this:
17 // Value *X, *Y; ConstantInt *C1, *C2; // (X & C1) | (Y & C2)
18 // if (match(Exp, m_Or(m_And(m_Value(X), m_ConstantInt(C1)),
19 // m_And(m_Value(Y), m_ConstantInt(C2))))) {
20 // ... Pattern is matched and variables are bound ...
23 // This is primarily useful to things like the instruction combiner, but can
24 // also be useful for static analysis tools or code generators.
26 //===----------------------------------------------------------------------===//
28 #ifndef LLVM_IR_PATTERNMATCH_H
29 #define LLVM_IR_PATTERNMATCH_H
31 #include "llvm/ADT/APFloat.h"
32 #include "llvm/ADT/APInt.h"
33 #include "llvm/IR/Constant.h"
34 #include "llvm/IR/Constants.h"
35 #include "llvm/IR/InstrTypes.h"
36 #include "llvm/IR/Instruction.h"
37 #include "llvm/IR/Instructions.h"
38 #include "llvm/IR/Intrinsics.h"
39 #include "llvm/IR/Operator.h"
40 #include "llvm/IR/Value.h"
41 #include "llvm/Support/Casting.h"
45 namespace PatternMatch
{
47 template <typename Val
, typename Pattern
> bool match(Val
*V
, const Pattern
&P
) {
48 return const_cast<Pattern
&>(P
).match(V
);
51 template <typename SubPattern_t
> struct OneUse_match
{
52 SubPattern_t SubPattern
;
54 OneUse_match(const SubPattern_t
&SP
) : SubPattern(SP
) {}
56 template <typename OpTy
> bool match(OpTy
*V
) {
57 return V
->hasOneUse() && SubPattern
.match(V
);
61 template <typename T
> inline OneUse_match
<T
> m_OneUse(const T
&SubPattern
) {
65 template <typename Class
> struct class_match
{
66 template <typename ITy
> bool match(ITy
*V
) { return isa
<Class
>(V
); }
69 /// Match an arbitrary value and ignore it.
70 inline class_match
<Value
> m_Value() { return class_match
<Value
>(); }
72 /// Match an arbitrary binary operation and ignore it.
73 inline class_match
<BinaryOperator
> m_BinOp() {
74 return class_match
<BinaryOperator
>();
77 /// Matches any compare instruction and ignore it.
78 inline class_match
<CmpInst
> m_Cmp() { return class_match
<CmpInst
>(); }
80 /// Match an arbitrary ConstantInt and ignore it.
81 inline class_match
<ConstantInt
> m_ConstantInt() {
82 return class_match
<ConstantInt
>();
85 /// Match an arbitrary undef constant.
86 inline class_match
<UndefValue
> m_Undef() { return class_match
<UndefValue
>(); }
88 /// Match an arbitrary Constant and ignore it.
89 inline class_match
<Constant
> m_Constant() { return class_match
<Constant
>(); }
91 /// Matching combinators
92 template <typename LTy
, typename RTy
> struct match_combine_or
{
96 match_combine_or(const LTy
&Left
, const RTy
&Right
) : L(Left
), R(Right
) {}
98 template <typename ITy
> bool match(ITy
*V
) {
107 template <typename LTy
, typename RTy
> struct match_combine_and
{
111 match_combine_and(const LTy
&Left
, const RTy
&Right
) : L(Left
), R(Right
) {}
113 template <typename ITy
> bool match(ITy
*V
) {
121 /// Combine two pattern matchers matching L || R
122 template <typename LTy
, typename RTy
>
123 inline match_combine_or
<LTy
, RTy
> m_CombineOr(const LTy
&L
, const RTy
&R
) {
124 return match_combine_or
<LTy
, RTy
>(L
, R
);
127 /// Combine two pattern matchers matching L && R
128 template <typename LTy
, typename RTy
>
129 inline match_combine_and
<LTy
, RTy
> m_CombineAnd(const LTy
&L
, const RTy
&R
) {
130 return match_combine_and
<LTy
, RTy
>(L
, R
);
136 apint_match(const APInt
*&R
) : Res(R
) {}
138 template <typename ITy
> bool match(ITy
*V
) {
139 if (auto *CI
= dyn_cast
<ConstantInt
>(V
)) {
140 Res
= &CI
->getValue();
143 if (V
->getType()->isVectorTy())
144 if (const auto *C
= dyn_cast
<Constant
>(V
))
145 if (auto *CI
= dyn_cast_or_null
<ConstantInt
>(C
->getSplatValue())) {
146 Res
= &CI
->getValue();
152 // Either constexpr if or renaming ConstantFP::getValueAPF to
153 // ConstantFP::getValue is needed to do it via single template
154 // function for both apint/apfloat.
155 struct apfloat_match
{
157 apfloat_match(const APFloat
*&R
) : Res(R
) {}
158 template <typename ITy
> bool match(ITy
*V
) {
159 if (auto *CI
= dyn_cast
<ConstantFP
>(V
)) {
160 Res
= &CI
->getValueAPF();
163 if (V
->getType()->isVectorTy())
164 if (const auto *C
= dyn_cast
<Constant
>(V
))
165 if (auto *CI
= dyn_cast_or_null
<ConstantFP
>(C
->getSplatValue())) {
166 Res
= &CI
->getValueAPF();
173 /// Match a ConstantInt or splatted ConstantVector, binding the
174 /// specified pointer to the contained APInt.
175 inline apint_match
m_APInt(const APInt
*&Res
) { return Res
; }
177 /// Match a ConstantFP or splatted ConstantVector, binding the
178 /// specified pointer to the contained APFloat.
179 inline apfloat_match
m_APFloat(const APFloat
*&Res
) { return Res
; }
181 template <int64_t Val
> struct constantint_match
{
182 template <typename ITy
> bool match(ITy
*V
) {
183 if (const auto *CI
= dyn_cast
<ConstantInt
>(V
)) {
184 const APInt
&CIV
= CI
->getValue();
186 return CIV
== static_cast<uint64_t>(Val
);
187 // If Val is negative, and CI is shorter than it, truncate to the right
188 // number of bits. If it is larger, then we have to sign extend. Just
189 // compare their negated values.
196 /// Match a ConstantInt with a specific value.
197 template <int64_t Val
> inline constantint_match
<Val
> m_ConstantInt() {
198 return constantint_match
<Val
>();
201 /// This helper class is used to match scalar and vector integer constants that
202 /// satisfy a specified predicate.
203 /// For vector constants, undefined elements are ignored.
204 template <typename Predicate
> struct cst_pred_ty
: public Predicate
{
205 template <typename ITy
> bool match(ITy
*V
) {
206 if (const auto *CI
= dyn_cast
<ConstantInt
>(V
))
207 return this->isValue(CI
->getValue());
208 if (V
->getType()->isVectorTy()) {
209 if (const auto *C
= dyn_cast
<Constant
>(V
)) {
210 if (const auto *CI
= dyn_cast_or_null
<ConstantInt
>(C
->getSplatValue()))
211 return this->isValue(CI
->getValue());
213 // Non-splat vector constant: check each element for a match.
214 unsigned NumElts
= V
->getType()->getVectorNumElements();
215 assert(NumElts
!= 0 && "Constant vector with no elements?");
216 bool HasNonUndefElements
= false;
217 for (unsigned i
= 0; i
!= NumElts
; ++i
) {
218 Constant
*Elt
= C
->getAggregateElement(i
);
221 if (isa
<UndefValue
>(Elt
))
223 auto *CI
= dyn_cast
<ConstantInt
>(Elt
);
224 if (!CI
|| !this->isValue(CI
->getValue()))
226 HasNonUndefElements
= true;
228 return HasNonUndefElements
;
235 /// This helper class is used to match scalar and vector constants that
236 /// satisfy a specified predicate, and bind them to an APInt.
237 template <typename Predicate
> struct api_pred_ty
: public Predicate
{
240 api_pred_ty(const APInt
*&R
) : Res(R
) {}
242 template <typename ITy
> bool match(ITy
*V
) {
243 if (const auto *CI
= dyn_cast
<ConstantInt
>(V
))
244 if (this->isValue(CI
->getValue())) {
245 Res
= &CI
->getValue();
248 if (V
->getType()->isVectorTy())
249 if (const auto *C
= dyn_cast
<Constant
>(V
))
250 if (auto *CI
= dyn_cast_or_null
<ConstantInt
>(C
->getSplatValue()))
251 if (this->isValue(CI
->getValue())) {
252 Res
= &CI
->getValue();
260 /// This helper class is used to match scalar and vector floating-point
261 /// constants that satisfy a specified predicate.
262 /// For vector constants, undefined elements are ignored.
263 template <typename Predicate
> struct cstfp_pred_ty
: public Predicate
{
264 template <typename ITy
> bool match(ITy
*V
) {
265 if (const auto *CF
= dyn_cast
<ConstantFP
>(V
))
266 return this->isValue(CF
->getValueAPF());
267 if (V
->getType()->isVectorTy()) {
268 if (const auto *C
= dyn_cast
<Constant
>(V
)) {
269 if (const auto *CF
= dyn_cast_or_null
<ConstantFP
>(C
->getSplatValue()))
270 return this->isValue(CF
->getValueAPF());
272 // Non-splat vector constant: check each element for a match.
273 unsigned NumElts
= V
->getType()->getVectorNumElements();
274 assert(NumElts
!= 0 && "Constant vector with no elements?");
275 bool HasNonUndefElements
= false;
276 for (unsigned i
= 0; i
!= NumElts
; ++i
) {
277 Constant
*Elt
= C
->getAggregateElement(i
);
280 if (isa
<UndefValue
>(Elt
))
282 auto *CF
= dyn_cast
<ConstantFP
>(Elt
);
283 if (!CF
|| !this->isValue(CF
->getValueAPF()))
285 HasNonUndefElements
= true;
287 return HasNonUndefElements
;
294 ///////////////////////////////////////////////////////////////////////////////
296 // Encapsulate constant value queries for use in templated predicate matchers.
297 // This allows checking if constants match using compound predicates and works
298 // with vector constants, possibly with relaxed constraints. For example, ignore
301 ///////////////////////////////////////////////////////////////////////////////
304 bool isValue(const APInt
&C
) { return C
.isAllOnesValue(); }
306 /// Match an integer or vector with all bits set.
307 /// For vectors, this includes constants with undefined elements.
308 inline cst_pred_ty
<is_all_ones
> m_AllOnes() {
309 return cst_pred_ty
<is_all_ones
>();
312 struct is_maxsignedvalue
{
313 bool isValue(const APInt
&C
) { return C
.isMaxSignedValue(); }
315 /// Match an integer or vector with values having all bits except for the high
316 /// bit set (0x7f...).
317 /// For vectors, this includes constants with undefined elements.
318 inline cst_pred_ty
<is_maxsignedvalue
> m_MaxSignedValue() {
319 return cst_pred_ty
<is_maxsignedvalue
>();
321 inline api_pred_ty
<is_maxsignedvalue
> m_MaxSignedValue(const APInt
*&V
) {
326 bool isValue(const APInt
&C
) { return C
.isNegative(); }
328 /// Match an integer or vector of negative values.
329 /// For vectors, this includes constants with undefined elements.
330 inline cst_pred_ty
<is_negative
> m_Negative() {
331 return cst_pred_ty
<is_negative
>();
333 inline api_pred_ty
<is_negative
> m_Negative(const APInt
*&V
) {
337 struct is_nonnegative
{
338 bool isValue(const APInt
&C
) { return C
.isNonNegative(); }
340 /// Match an integer or vector of nonnegative values.
341 /// For vectors, this includes constants with undefined elements.
342 inline cst_pred_ty
<is_nonnegative
> m_NonNegative() {
343 return cst_pred_ty
<is_nonnegative
>();
345 inline api_pred_ty
<is_nonnegative
> m_NonNegative(const APInt
*&V
) {
350 bool isValue(const APInt
&C
) { return C
.isOneValue(); }
352 /// Match an integer 1 or a vector with all elements equal to 1.
353 /// For vectors, this includes constants with undefined elements.
354 inline cst_pred_ty
<is_one
> m_One() {
355 return cst_pred_ty
<is_one
>();
359 bool isValue(const APInt
&C
) { return C
.isNullValue(); }
361 /// Match an integer 0 or a vector with all elements equal to 0.
362 /// For vectors, this includes constants with undefined elements.
363 inline cst_pred_ty
<is_zero_int
> m_ZeroInt() {
364 return cst_pred_ty
<is_zero_int
>();
368 template <typename ITy
> bool match(ITy
*V
) {
369 auto *C
= dyn_cast
<Constant
>(V
);
370 return C
&& (C
->isNullValue() || cst_pred_ty
<is_zero_int
>().match(C
));
373 /// Match any null constant or a vector with all elements equal to 0.
374 /// For vectors, this includes constants with undefined elements.
375 inline is_zero
m_Zero() {
380 bool isValue(const APInt
&C
) { return C
.isPowerOf2(); }
382 /// Match an integer or vector power-of-2.
383 /// For vectors, this includes constants with undefined elements.
384 inline cst_pred_ty
<is_power2
> m_Power2() {
385 return cst_pred_ty
<is_power2
>();
387 inline api_pred_ty
<is_power2
> m_Power2(const APInt
*&V
) {
391 struct is_power2_or_zero
{
392 bool isValue(const APInt
&C
) { return !C
|| C
.isPowerOf2(); }
394 /// Match an integer or vector of 0 or power-of-2 values.
395 /// For vectors, this includes constants with undefined elements.
396 inline cst_pred_ty
<is_power2_or_zero
> m_Power2OrZero() {
397 return cst_pred_ty
<is_power2_or_zero
>();
399 inline api_pred_ty
<is_power2_or_zero
> m_Power2OrZero(const APInt
*&V
) {
403 struct is_sign_mask
{
404 bool isValue(const APInt
&C
) { return C
.isSignMask(); }
406 /// Match an integer or vector with only the sign bit(s) set.
407 /// For vectors, this includes constants with undefined elements.
408 inline cst_pred_ty
<is_sign_mask
> m_SignMask() {
409 return cst_pred_ty
<is_sign_mask
>();
412 struct is_lowbit_mask
{
413 bool isValue(const APInt
&C
) { return C
.isMask(); }
415 /// Match an integer or vector with only the low bit(s) set.
416 /// For vectors, this includes constants with undefined elements.
417 inline cst_pred_ty
<is_lowbit_mask
> m_LowBitMask() {
418 return cst_pred_ty
<is_lowbit_mask
>();
422 bool isValue(const APFloat
&C
) { return C
.isNaN(); }
424 /// Match an arbitrary NaN constant. This includes quiet and signalling nans.
425 /// For vectors, this includes constants with undefined elements.
426 inline cstfp_pred_ty
<is_nan
> m_NaN() {
427 return cstfp_pred_ty
<is_nan
>();
430 struct is_any_zero_fp
{
431 bool isValue(const APFloat
&C
) { return C
.isZero(); }
433 /// Match a floating-point negative zero or positive zero.
434 /// For vectors, this includes constants with undefined elements.
435 inline cstfp_pred_ty
<is_any_zero_fp
> m_AnyZeroFP() {
436 return cstfp_pred_ty
<is_any_zero_fp
>();
439 struct is_pos_zero_fp
{
440 bool isValue(const APFloat
&C
) { return C
.isPosZero(); }
442 /// Match a floating-point positive zero.
443 /// For vectors, this includes constants with undefined elements.
444 inline cstfp_pred_ty
<is_pos_zero_fp
> m_PosZeroFP() {
445 return cstfp_pred_ty
<is_pos_zero_fp
>();
448 struct is_neg_zero_fp
{
449 bool isValue(const APFloat
&C
) { return C
.isNegZero(); }
451 /// Match a floating-point negative zero.
452 /// For vectors, this includes constants with undefined elements.
453 inline cstfp_pred_ty
<is_neg_zero_fp
> m_NegZeroFP() {
454 return cstfp_pred_ty
<is_neg_zero_fp
>();
457 ///////////////////////////////////////////////////////////////////////////////
459 template <typename Class
> struct bind_ty
{
462 bind_ty(Class
*&V
) : VR(V
) {}
464 template <typename ITy
> bool match(ITy
*V
) {
465 if (auto *CV
= dyn_cast
<Class
>(V
)) {
473 /// Match a value, capturing it if we match.
474 inline bind_ty
<Value
> m_Value(Value
*&V
) { return V
; }
475 inline bind_ty
<const Value
> m_Value(const Value
*&V
) { return V
; }
477 /// Match an instruction, capturing it if we match.
478 inline bind_ty
<Instruction
> m_Instruction(Instruction
*&I
) { return I
; }
479 /// Match a binary operator, capturing it if we match.
480 inline bind_ty
<BinaryOperator
> m_BinOp(BinaryOperator
*&I
) { return I
; }
482 /// Match a ConstantInt, capturing the value if we match.
483 inline bind_ty
<ConstantInt
> m_ConstantInt(ConstantInt
*&CI
) { return CI
; }
485 /// Match a Constant, capturing the value if we match.
486 inline bind_ty
<Constant
> m_Constant(Constant
*&C
) { return C
; }
488 /// Match a ConstantFP, capturing the value if we match.
489 inline bind_ty
<ConstantFP
> m_ConstantFP(ConstantFP
*&C
) { return C
; }
491 /// Match a specified Value*.
492 struct specificval_ty
{
495 specificval_ty(const Value
*V
) : Val(V
) {}
497 template <typename ITy
> bool match(ITy
*V
) { return V
== Val
; }
500 /// Match if we have a specific specified value.
501 inline specificval_ty
m_Specific(const Value
*V
) { return V
; }
503 /// Stores a reference to the Value *, not the Value * itself,
504 /// thus can be used in commutative matchers.
505 template <typename Class
> struct deferredval_ty
{
508 deferredval_ty(Class
*const &V
) : Val(V
) {}
510 template <typename ITy
> bool match(ITy
*const V
) { return V
== Val
; }
513 /// A commutative-friendly version of m_Specific().
514 inline deferredval_ty
<Value
> m_Deferred(Value
*const &V
) { return V
; }
515 inline deferredval_ty
<const Value
> m_Deferred(const Value
*const &V
) {
519 /// Match a specified floating point value or vector of all elements of
521 struct specific_fpval
{
524 specific_fpval(double V
) : Val(V
) {}
526 template <typename ITy
> bool match(ITy
*V
) {
527 if (const auto *CFP
= dyn_cast
<ConstantFP
>(V
))
528 return CFP
->isExactlyValue(Val
);
529 if (V
->getType()->isVectorTy())
530 if (const auto *C
= dyn_cast
<Constant
>(V
))
531 if (auto *CFP
= dyn_cast_or_null
<ConstantFP
>(C
->getSplatValue()))
532 return CFP
->isExactlyValue(Val
);
537 /// Match a specific floating point value or vector with all elements
538 /// equal to the value.
539 inline specific_fpval
m_SpecificFP(double V
) { return specific_fpval(V
); }
541 /// Match a float 1.0 or vector with all elements equal to 1.0.
542 inline specific_fpval
m_FPOne() { return m_SpecificFP(1.0); }
544 struct bind_const_intval_ty
{
547 bind_const_intval_ty(uint64_t &V
) : VR(V
) {}
549 template <typename ITy
> bool match(ITy
*V
) {
550 if (const auto *CV
= dyn_cast
<ConstantInt
>(V
))
551 if (CV
->getValue().ule(UINT64_MAX
)) {
552 VR
= CV
->getZExtValue();
559 /// Match a specified integer value or vector of all elements of that
561 struct specific_intval
{
564 specific_intval(uint64_t V
) : Val(V
) {}
566 template <typename ITy
> bool match(ITy
*V
) {
567 const auto *CI
= dyn_cast
<ConstantInt
>(V
);
568 if (!CI
&& V
->getType()->isVectorTy())
569 if (const auto *C
= dyn_cast
<Constant
>(V
))
570 CI
= dyn_cast_or_null
<ConstantInt
>(C
->getSplatValue());
572 return CI
&& CI
->getValue() == Val
;
576 /// Match a specific integer value or vector with all elements equal to
578 inline specific_intval
m_SpecificInt(uint64_t V
) { return specific_intval(V
); }
580 /// Match a ConstantInt and bind to its value. This does not match
581 /// ConstantInts wider than 64-bits.
582 inline bind_const_intval_ty
m_ConstantInt(uint64_t &V
) { return V
; }
584 //===----------------------------------------------------------------------===//
585 // Matcher for any binary operator.
587 template <typename LHS_t
, typename RHS_t
, bool Commutable
= false>
588 struct AnyBinaryOp_match
{
592 // The evaluation order is always stable, regardless of Commutability.
593 // The LHS is always matched first.
594 AnyBinaryOp_match(const LHS_t
&LHS
, const RHS_t
&RHS
) : L(LHS
), R(RHS
) {}
596 template <typename OpTy
> bool match(OpTy
*V
) {
597 if (auto *I
= dyn_cast
<BinaryOperator
>(V
))
598 return (L
.match(I
->getOperand(0)) && R
.match(I
->getOperand(1))) ||
599 (Commutable
&& L
.match(I
->getOperand(1)) &&
600 R
.match(I
->getOperand(0)));
605 template <typename LHS
, typename RHS
>
606 inline AnyBinaryOp_match
<LHS
, RHS
> m_BinOp(const LHS
&L
, const RHS
&R
) {
607 return AnyBinaryOp_match
<LHS
, RHS
>(L
, R
);
610 //===----------------------------------------------------------------------===//
611 // Matchers for specific binary operators.
614 template <typename LHS_t
, typename RHS_t
, unsigned Opcode
,
615 bool Commutable
= false>
616 struct BinaryOp_match
{
620 // The evaluation order is always stable, regardless of Commutability.
621 // The LHS is always matched first.
622 BinaryOp_match(const LHS_t
&LHS
, const RHS_t
&RHS
) : L(LHS
), R(RHS
) {}
624 template <typename OpTy
> bool match(OpTy
*V
) {
625 if (V
->getValueID() == Value::InstructionVal
+ Opcode
) {
626 auto *I
= cast
<BinaryOperator
>(V
);
627 return (L
.match(I
->getOperand(0)) && R
.match(I
->getOperand(1))) ||
628 (Commutable
&& L
.match(I
->getOperand(1)) &&
629 R
.match(I
->getOperand(0)));
631 if (auto *CE
= dyn_cast
<ConstantExpr
>(V
))
632 return CE
->getOpcode() == Opcode
&&
633 ((L
.match(CE
->getOperand(0)) && R
.match(CE
->getOperand(1))) ||
634 (Commutable
&& L
.match(CE
->getOperand(1)) &&
635 R
.match(CE
->getOperand(0))));
640 template <typename LHS
, typename RHS
>
641 inline BinaryOp_match
<LHS
, RHS
, Instruction::Add
> m_Add(const LHS
&L
,
643 return BinaryOp_match
<LHS
, RHS
, Instruction::Add
>(L
, R
);
646 template <typename LHS
, typename RHS
>
647 inline BinaryOp_match
<LHS
, RHS
, Instruction::FAdd
> m_FAdd(const LHS
&L
,
649 return BinaryOp_match
<LHS
, RHS
, Instruction::FAdd
>(L
, R
);
652 template <typename LHS
, typename RHS
>
653 inline BinaryOp_match
<LHS
, RHS
, Instruction::Sub
> m_Sub(const LHS
&L
,
655 return BinaryOp_match
<LHS
, RHS
, Instruction::Sub
>(L
, R
);
658 template <typename LHS
, typename RHS
>
659 inline BinaryOp_match
<LHS
, RHS
, Instruction::FSub
> m_FSub(const LHS
&L
,
661 return BinaryOp_match
<LHS
, RHS
, Instruction::FSub
>(L
, R
);
664 template <typename Op_t
> struct FNeg_match
{
667 FNeg_match(const Op_t
&Op
) : X(Op
) {}
668 template <typename OpTy
> bool match(OpTy
*V
) {
669 auto *FPMO
= dyn_cast
<FPMathOperator
>(V
);
670 if (!FPMO
|| FPMO
->getOpcode() != Instruction::FSub
)
672 if (FPMO
->hasNoSignedZeros()) {
673 // With 'nsz', any zero goes.
674 if (!cstfp_pred_ty
<is_any_zero_fp
>().match(FPMO
->getOperand(0)))
677 // Without 'nsz', we need fsub -0.0, X exactly.
678 if (!cstfp_pred_ty
<is_neg_zero_fp
>().match(FPMO
->getOperand(0)))
681 return X
.match(FPMO
->getOperand(1));
685 /// Match 'fneg X' as 'fsub -0.0, X'.
686 template <typename OpTy
>
687 inline FNeg_match
<OpTy
>
688 m_FNeg(const OpTy
&X
) {
689 return FNeg_match
<OpTy
>(X
);
692 /// Match 'fneg X' as 'fsub +-0.0, X'.
693 template <typename RHS
>
694 inline BinaryOp_match
<cstfp_pred_ty
<is_any_zero_fp
>, RHS
, Instruction::FSub
>
695 m_FNegNSZ(const RHS
&X
) {
696 return m_FSub(m_AnyZeroFP(), X
);
699 template <typename LHS
, typename RHS
>
700 inline BinaryOp_match
<LHS
, RHS
, Instruction::Mul
> m_Mul(const LHS
&L
,
702 return BinaryOp_match
<LHS
, RHS
, Instruction::Mul
>(L
, R
);
705 template <typename LHS
, typename RHS
>
706 inline BinaryOp_match
<LHS
, RHS
, Instruction::FMul
> m_FMul(const LHS
&L
,
708 return BinaryOp_match
<LHS
, RHS
, Instruction::FMul
>(L
, R
);
711 template <typename LHS
, typename RHS
>
712 inline BinaryOp_match
<LHS
, RHS
, Instruction::UDiv
> m_UDiv(const LHS
&L
,
714 return BinaryOp_match
<LHS
, RHS
, Instruction::UDiv
>(L
, R
);
717 template <typename LHS
, typename RHS
>
718 inline BinaryOp_match
<LHS
, RHS
, Instruction::SDiv
> m_SDiv(const LHS
&L
,
720 return BinaryOp_match
<LHS
, RHS
, Instruction::SDiv
>(L
, R
);
723 template <typename LHS
, typename RHS
>
724 inline BinaryOp_match
<LHS
, RHS
, Instruction::FDiv
> m_FDiv(const LHS
&L
,
726 return BinaryOp_match
<LHS
, RHS
, Instruction::FDiv
>(L
, R
);
729 template <typename LHS
, typename RHS
>
730 inline BinaryOp_match
<LHS
, RHS
, Instruction::URem
> m_URem(const LHS
&L
,
732 return BinaryOp_match
<LHS
, RHS
, Instruction::URem
>(L
, R
);
735 template <typename LHS
, typename RHS
>
736 inline BinaryOp_match
<LHS
, RHS
, Instruction::SRem
> m_SRem(const LHS
&L
,
738 return BinaryOp_match
<LHS
, RHS
, Instruction::SRem
>(L
, R
);
741 template <typename LHS
, typename RHS
>
742 inline BinaryOp_match
<LHS
, RHS
, Instruction::FRem
> m_FRem(const LHS
&L
,
744 return BinaryOp_match
<LHS
, RHS
, Instruction::FRem
>(L
, R
);
747 template <typename LHS
, typename RHS
>
748 inline BinaryOp_match
<LHS
, RHS
, Instruction::And
> m_And(const LHS
&L
,
750 return BinaryOp_match
<LHS
, RHS
, Instruction::And
>(L
, R
);
753 template <typename LHS
, typename RHS
>
754 inline BinaryOp_match
<LHS
, RHS
, Instruction::Or
> m_Or(const LHS
&L
,
756 return BinaryOp_match
<LHS
, RHS
, Instruction::Or
>(L
, R
);
759 template <typename LHS
, typename RHS
>
760 inline BinaryOp_match
<LHS
, RHS
, Instruction::Xor
> m_Xor(const LHS
&L
,
762 return BinaryOp_match
<LHS
, RHS
, Instruction::Xor
>(L
, R
);
765 template <typename LHS
, typename RHS
>
766 inline BinaryOp_match
<LHS
, RHS
, Instruction::Shl
> m_Shl(const LHS
&L
,
768 return BinaryOp_match
<LHS
, RHS
, Instruction::Shl
>(L
, R
);
771 template <typename LHS
, typename RHS
>
772 inline BinaryOp_match
<LHS
, RHS
, Instruction::LShr
> m_LShr(const LHS
&L
,
774 return BinaryOp_match
<LHS
, RHS
, Instruction::LShr
>(L
, R
);
777 template <typename LHS
, typename RHS
>
778 inline BinaryOp_match
<LHS
, RHS
, Instruction::AShr
> m_AShr(const LHS
&L
,
780 return BinaryOp_match
<LHS
, RHS
, Instruction::AShr
>(L
, R
);
783 template <typename LHS_t
, typename RHS_t
, unsigned Opcode
,
784 unsigned WrapFlags
= 0>
785 struct OverflowingBinaryOp_match
{
789 OverflowingBinaryOp_match(const LHS_t
&LHS
, const RHS_t
&RHS
)
792 template <typename OpTy
> bool match(OpTy
*V
) {
793 if (auto *Op
= dyn_cast
<OverflowingBinaryOperator
>(V
)) {
794 if (Op
->getOpcode() != Opcode
)
796 if (WrapFlags
& OverflowingBinaryOperator::NoUnsignedWrap
&&
797 !Op
->hasNoUnsignedWrap())
799 if (WrapFlags
& OverflowingBinaryOperator::NoSignedWrap
&&
800 !Op
->hasNoSignedWrap())
802 return L
.match(Op
->getOperand(0)) && R
.match(Op
->getOperand(1));
808 template <typename LHS
, typename RHS
>
809 inline OverflowingBinaryOp_match
<LHS
, RHS
, Instruction::Add
,
810 OverflowingBinaryOperator::NoSignedWrap
>
811 m_NSWAdd(const LHS
&L
, const RHS
&R
) {
812 return OverflowingBinaryOp_match
<LHS
, RHS
, Instruction::Add
,
813 OverflowingBinaryOperator::NoSignedWrap
>(
816 template <typename LHS
, typename RHS
>
817 inline OverflowingBinaryOp_match
<LHS
, RHS
, Instruction::Sub
,
818 OverflowingBinaryOperator::NoSignedWrap
>
819 m_NSWSub(const LHS
&L
, const RHS
&R
) {
820 return OverflowingBinaryOp_match
<LHS
, RHS
, Instruction::Sub
,
821 OverflowingBinaryOperator::NoSignedWrap
>(
824 template <typename LHS
, typename RHS
>
825 inline OverflowingBinaryOp_match
<LHS
, RHS
, Instruction::Mul
,
826 OverflowingBinaryOperator::NoSignedWrap
>
827 m_NSWMul(const LHS
&L
, const RHS
&R
) {
828 return OverflowingBinaryOp_match
<LHS
, RHS
, Instruction::Mul
,
829 OverflowingBinaryOperator::NoSignedWrap
>(
832 template <typename LHS
, typename RHS
>
833 inline OverflowingBinaryOp_match
<LHS
, RHS
, Instruction::Shl
,
834 OverflowingBinaryOperator::NoSignedWrap
>
835 m_NSWShl(const LHS
&L
, const RHS
&R
) {
836 return OverflowingBinaryOp_match
<LHS
, RHS
, Instruction::Shl
,
837 OverflowingBinaryOperator::NoSignedWrap
>(
841 template <typename LHS
, typename RHS
>
842 inline OverflowingBinaryOp_match
<LHS
, RHS
, Instruction::Add
,
843 OverflowingBinaryOperator::NoUnsignedWrap
>
844 m_NUWAdd(const LHS
&L
, const RHS
&R
) {
845 return OverflowingBinaryOp_match
<LHS
, RHS
, Instruction::Add
,
846 OverflowingBinaryOperator::NoUnsignedWrap
>(
849 template <typename LHS
, typename RHS
>
850 inline OverflowingBinaryOp_match
<LHS
, RHS
, Instruction::Sub
,
851 OverflowingBinaryOperator::NoUnsignedWrap
>
852 m_NUWSub(const LHS
&L
, const RHS
&R
) {
853 return OverflowingBinaryOp_match
<LHS
, RHS
, Instruction::Sub
,
854 OverflowingBinaryOperator::NoUnsignedWrap
>(
857 template <typename LHS
, typename RHS
>
858 inline OverflowingBinaryOp_match
<LHS
, RHS
, Instruction::Mul
,
859 OverflowingBinaryOperator::NoUnsignedWrap
>
860 m_NUWMul(const LHS
&L
, const RHS
&R
) {
861 return OverflowingBinaryOp_match
<LHS
, RHS
, Instruction::Mul
,
862 OverflowingBinaryOperator::NoUnsignedWrap
>(
865 template <typename LHS
, typename RHS
>
866 inline OverflowingBinaryOp_match
<LHS
, RHS
, Instruction::Shl
,
867 OverflowingBinaryOperator::NoUnsignedWrap
>
868 m_NUWShl(const LHS
&L
, const RHS
&R
) {
869 return OverflowingBinaryOp_match
<LHS
, RHS
, Instruction::Shl
,
870 OverflowingBinaryOperator::NoUnsignedWrap
>(
874 //===----------------------------------------------------------------------===//
875 // Class that matches a group of binary opcodes.
877 template <typename LHS_t
, typename RHS_t
, typename Predicate
>
878 struct BinOpPred_match
: Predicate
{
882 BinOpPred_match(const LHS_t
&LHS
, const RHS_t
&RHS
) : L(LHS
), R(RHS
) {}
884 template <typename OpTy
> bool match(OpTy
*V
) {
885 if (auto *I
= dyn_cast
<Instruction
>(V
))
886 return this->isOpType(I
->getOpcode()) && L
.match(I
->getOperand(0)) &&
887 R
.match(I
->getOperand(1));
888 if (auto *CE
= dyn_cast
<ConstantExpr
>(V
))
889 return this->isOpType(CE
->getOpcode()) && L
.match(CE
->getOperand(0)) &&
890 R
.match(CE
->getOperand(1));
896 bool isOpType(unsigned Opcode
) { return Instruction::isShift(Opcode
); }
899 struct is_right_shift_op
{
900 bool isOpType(unsigned Opcode
) {
901 return Opcode
== Instruction::LShr
|| Opcode
== Instruction::AShr
;
905 struct is_logical_shift_op
{
906 bool isOpType(unsigned Opcode
) {
907 return Opcode
== Instruction::LShr
|| Opcode
== Instruction::Shl
;
911 struct is_bitwiselogic_op
{
912 bool isOpType(unsigned Opcode
) {
913 return Instruction::isBitwiseLogicOp(Opcode
);
918 bool isOpType(unsigned Opcode
) {
919 return Opcode
== Instruction::SDiv
|| Opcode
== Instruction::UDiv
;
923 /// Matches shift operations.
924 template <typename LHS
, typename RHS
>
925 inline BinOpPred_match
<LHS
, RHS
, is_shift_op
> m_Shift(const LHS
&L
,
927 return BinOpPred_match
<LHS
, RHS
, is_shift_op
>(L
, R
);
930 /// Matches logical shift operations.
931 template <typename LHS
, typename RHS
>
932 inline BinOpPred_match
<LHS
, RHS
, is_right_shift_op
> m_Shr(const LHS
&L
,
934 return BinOpPred_match
<LHS
, RHS
, is_right_shift_op
>(L
, R
);
937 /// Matches logical shift operations.
938 template <typename LHS
, typename RHS
>
939 inline BinOpPred_match
<LHS
, RHS
, is_logical_shift_op
>
940 m_LogicalShift(const LHS
&L
, const RHS
&R
) {
941 return BinOpPred_match
<LHS
, RHS
, is_logical_shift_op
>(L
, R
);
944 /// Matches bitwise logic operations.
945 template <typename LHS
, typename RHS
>
946 inline BinOpPred_match
<LHS
, RHS
, is_bitwiselogic_op
>
947 m_BitwiseLogic(const LHS
&L
, const RHS
&R
) {
948 return BinOpPred_match
<LHS
, RHS
, is_bitwiselogic_op
>(L
, R
);
951 /// Matches integer division operations.
952 template <typename LHS
, typename RHS
>
953 inline BinOpPred_match
<LHS
, RHS
, is_idiv_op
> m_IDiv(const LHS
&L
,
955 return BinOpPred_match
<LHS
, RHS
, is_idiv_op
>(L
, R
);
958 //===----------------------------------------------------------------------===//
959 // Class that matches exact binary ops.
961 template <typename SubPattern_t
> struct Exact_match
{
962 SubPattern_t SubPattern
;
964 Exact_match(const SubPattern_t
&SP
) : SubPattern(SP
) {}
966 template <typename OpTy
> bool match(OpTy
*V
) {
967 if (auto *PEO
= dyn_cast
<PossiblyExactOperator
>(V
))
968 return PEO
->isExact() && SubPattern
.match(V
);
973 template <typename T
> inline Exact_match
<T
> m_Exact(const T
&SubPattern
) {
977 //===----------------------------------------------------------------------===//
978 // Matchers for CmpInst classes
981 template <typename LHS_t
, typename RHS_t
, typename Class
, typename PredicateTy
,
982 bool Commutable
= false>
983 struct CmpClass_match
{
984 PredicateTy
&Predicate
;
988 // The evaluation order is always stable, regardless of Commutability.
989 // The LHS is always matched first.
990 CmpClass_match(PredicateTy
&Pred
, const LHS_t
&LHS
, const RHS_t
&RHS
)
991 : Predicate(Pred
), L(LHS
), R(RHS
) {}
993 template <typename OpTy
> bool match(OpTy
*V
) {
994 if (auto *I
= dyn_cast
<Class
>(V
))
995 if ((L
.match(I
->getOperand(0)) && R
.match(I
->getOperand(1))) ||
996 (Commutable
&& L
.match(I
->getOperand(1)) &&
997 R
.match(I
->getOperand(0)))) {
998 Predicate
= I
->getPredicate();
1005 template <typename LHS
, typename RHS
>
1006 inline CmpClass_match
<LHS
, RHS
, CmpInst
, CmpInst::Predicate
>
1007 m_Cmp(CmpInst::Predicate
&Pred
, const LHS
&L
, const RHS
&R
) {
1008 return CmpClass_match
<LHS
, RHS
, CmpInst
, CmpInst::Predicate
>(Pred
, L
, R
);
1011 template <typename LHS
, typename RHS
>
1012 inline CmpClass_match
<LHS
, RHS
, ICmpInst
, ICmpInst::Predicate
>
1013 m_ICmp(ICmpInst::Predicate
&Pred
, const LHS
&L
, const RHS
&R
) {
1014 return CmpClass_match
<LHS
, RHS
, ICmpInst
, ICmpInst::Predicate
>(Pred
, L
, R
);
1017 template <typename LHS
, typename RHS
>
1018 inline CmpClass_match
<LHS
, RHS
, FCmpInst
, FCmpInst::Predicate
>
1019 m_FCmp(FCmpInst::Predicate
&Pred
, const LHS
&L
, const RHS
&R
) {
1020 return CmpClass_match
<LHS
, RHS
, FCmpInst
, FCmpInst::Predicate
>(Pred
, L
, R
);
1023 //===----------------------------------------------------------------------===//
1024 // Matchers for instructions with a given opcode and number of operands.
1027 /// Matches instructions with Opcode and three operands.
1028 template <typename T0
, unsigned Opcode
> struct OneOps_match
{
1031 OneOps_match(const T0
&Op1
) : Op1(Op1
) {}
1033 template <typename OpTy
> bool match(OpTy
*V
) {
1034 if (V
->getValueID() == Value::InstructionVal
+ Opcode
) {
1035 auto *I
= cast
<Instruction
>(V
);
1036 return Op1
.match(I
->getOperand(0));
1042 /// Matches instructions with Opcode and three operands.
1043 template <typename T0
, typename T1
, unsigned Opcode
> struct TwoOps_match
{
1047 TwoOps_match(const T0
&Op1
, const T1
&Op2
) : Op1(Op1
), Op2(Op2
) {}
1049 template <typename OpTy
> bool match(OpTy
*V
) {
1050 if (V
->getValueID() == Value::InstructionVal
+ Opcode
) {
1051 auto *I
= cast
<Instruction
>(V
);
1052 return Op1
.match(I
->getOperand(0)) && Op2
.match(I
->getOperand(1));
1058 /// Matches instructions with Opcode and three operands.
1059 template <typename T0
, typename T1
, typename T2
, unsigned Opcode
>
1060 struct ThreeOps_match
{
1065 ThreeOps_match(const T0
&Op1
, const T1
&Op2
, const T2
&Op3
)
1066 : Op1(Op1
), Op2(Op2
), Op3(Op3
) {}
1068 template <typename OpTy
> bool match(OpTy
*V
) {
1069 if (V
->getValueID() == Value::InstructionVal
+ Opcode
) {
1070 auto *I
= cast
<Instruction
>(V
);
1071 return Op1
.match(I
->getOperand(0)) && Op2
.match(I
->getOperand(1)) &&
1072 Op3
.match(I
->getOperand(2));
1078 /// Matches SelectInst.
1079 template <typename Cond
, typename LHS
, typename RHS
>
1080 inline ThreeOps_match
<Cond
, LHS
, RHS
, Instruction::Select
>
1081 m_Select(const Cond
&C
, const LHS
&L
, const RHS
&R
) {
1082 return ThreeOps_match
<Cond
, LHS
, RHS
, Instruction::Select
>(C
, L
, R
);
1085 /// This matches a select of two constants, e.g.:
1086 /// m_SelectCst<-1, 0>(m_Value(V))
1087 template <int64_t L
, int64_t R
, typename Cond
>
1088 inline ThreeOps_match
<Cond
, constantint_match
<L
>, constantint_match
<R
>,
1089 Instruction::Select
>
1090 m_SelectCst(const Cond
&C
) {
1091 return m_Select(C
, m_ConstantInt
<L
>(), m_ConstantInt
<R
>());
1094 /// Matches InsertElementInst.
1095 template <typename Val_t
, typename Elt_t
, typename Idx_t
>
1096 inline ThreeOps_match
<Val_t
, Elt_t
, Idx_t
, Instruction::InsertElement
>
1097 m_InsertElement(const Val_t
&Val
, const Elt_t
&Elt
, const Idx_t
&Idx
) {
1098 return ThreeOps_match
<Val_t
, Elt_t
, Idx_t
, Instruction::InsertElement
>(
1102 /// Matches ExtractElementInst.
1103 template <typename Val_t
, typename Idx_t
>
1104 inline TwoOps_match
<Val_t
, Idx_t
, Instruction::ExtractElement
>
1105 m_ExtractElement(const Val_t
&Val
, const Idx_t
&Idx
) {
1106 return TwoOps_match
<Val_t
, Idx_t
, Instruction::ExtractElement
>(Val
, Idx
);
1109 /// Matches ShuffleVectorInst.
1110 template <typename V1_t
, typename V2_t
, typename Mask_t
>
1111 inline ThreeOps_match
<V1_t
, V2_t
, Mask_t
, Instruction::ShuffleVector
>
1112 m_ShuffleVector(const V1_t
&v1
, const V2_t
&v2
, const Mask_t
&m
) {
1113 return ThreeOps_match
<V1_t
, V2_t
, Mask_t
, Instruction::ShuffleVector
>(v1
, v2
,
1117 /// Matches LoadInst.
1118 template <typename OpTy
>
1119 inline OneOps_match
<OpTy
, Instruction::Load
> m_Load(const OpTy
&Op
) {
1120 return OneOps_match
<OpTy
, Instruction::Load
>(Op
);
1123 /// Matches StoreInst.
1124 template <typename ValueOpTy
, typename PointerOpTy
>
1125 inline TwoOps_match
<ValueOpTy
, PointerOpTy
, Instruction::Store
>
1126 m_Store(const ValueOpTy
&ValueOp
, const PointerOpTy
&PointerOp
) {
1127 return TwoOps_match
<ValueOpTy
, PointerOpTy
, Instruction::Store
>(ValueOp
,
1131 //===----------------------------------------------------------------------===//
1132 // Matchers for CastInst classes
1135 template <typename Op_t
, unsigned Opcode
> struct CastClass_match
{
1138 CastClass_match(const Op_t
&OpMatch
) : Op(OpMatch
) {}
1140 template <typename OpTy
> bool match(OpTy
*V
) {
1141 if (auto *O
= dyn_cast
<Operator
>(V
))
1142 return O
->getOpcode() == Opcode
&& Op
.match(O
->getOperand(0));
1147 /// Matches BitCast.
1148 template <typename OpTy
>
1149 inline CastClass_match
<OpTy
, Instruction::BitCast
> m_BitCast(const OpTy
&Op
) {
1150 return CastClass_match
<OpTy
, Instruction::BitCast
>(Op
);
1153 /// Matches PtrToInt.
1154 template <typename OpTy
>
1155 inline CastClass_match
<OpTy
, Instruction::PtrToInt
> m_PtrToInt(const OpTy
&Op
) {
1156 return CastClass_match
<OpTy
, Instruction::PtrToInt
>(Op
);
1160 template <typename OpTy
>
1161 inline CastClass_match
<OpTy
, Instruction::Trunc
> m_Trunc(const OpTy
&Op
) {
1162 return CastClass_match
<OpTy
, Instruction::Trunc
>(Op
);
1166 template <typename OpTy
>
1167 inline CastClass_match
<OpTy
, Instruction::SExt
> m_SExt(const OpTy
&Op
) {
1168 return CastClass_match
<OpTy
, Instruction::SExt
>(Op
);
1172 template <typename OpTy
>
1173 inline CastClass_match
<OpTy
, Instruction::ZExt
> m_ZExt(const OpTy
&Op
) {
1174 return CastClass_match
<OpTy
, Instruction::ZExt
>(Op
);
1177 template <typename OpTy
>
1178 inline match_combine_or
<CastClass_match
<OpTy
, Instruction::ZExt
>,
1179 CastClass_match
<OpTy
, Instruction::SExt
>>
1180 m_ZExtOrSExt(const OpTy
&Op
) {
1181 return m_CombineOr(m_ZExt(Op
), m_SExt(Op
));
1185 template <typename OpTy
>
1186 inline CastClass_match
<OpTy
, Instruction::UIToFP
> m_UIToFP(const OpTy
&Op
) {
1187 return CastClass_match
<OpTy
, Instruction::UIToFP
>(Op
);
1191 template <typename OpTy
>
1192 inline CastClass_match
<OpTy
, Instruction::SIToFP
> m_SIToFP(const OpTy
&Op
) {
1193 return CastClass_match
<OpTy
, Instruction::SIToFP
>(Op
);
1197 template <typename OpTy
>
1198 inline CastClass_match
<OpTy
, Instruction::FPTrunc
> m_FPTrunc(const OpTy
&Op
) {
1199 return CastClass_match
<OpTy
, Instruction::FPTrunc
>(Op
);
1203 template <typename OpTy
>
1204 inline CastClass_match
<OpTy
, Instruction::FPExt
> m_FPExt(const OpTy
&Op
) {
1205 return CastClass_match
<OpTy
, Instruction::FPExt
>(Op
);
1208 //===----------------------------------------------------------------------===//
1209 // Matchers for control flow.
1215 br_match(BasicBlock
*&Succ
) : Succ(Succ
) {}
1217 template <typename OpTy
> bool match(OpTy
*V
) {
1218 if (auto *BI
= dyn_cast
<BranchInst
>(V
))
1219 if (BI
->isUnconditional()) {
1220 Succ
= BI
->getSuccessor(0);
1227 inline br_match
m_UnconditionalBr(BasicBlock
*&Succ
) { return br_match(Succ
); }
1229 template <typename Cond_t
> struct brc_match
{
1231 BasicBlock
*&T
, *&F
;
1233 brc_match(const Cond_t
&C
, BasicBlock
*&t
, BasicBlock
*&f
)
1234 : Cond(C
), T(t
), F(f
) {}
1236 template <typename OpTy
> bool match(OpTy
*V
) {
1237 if (auto *BI
= dyn_cast
<BranchInst
>(V
))
1238 if (BI
->isConditional() && Cond
.match(BI
->getCondition())) {
1239 T
= BI
->getSuccessor(0);
1240 F
= BI
->getSuccessor(1);
1247 template <typename Cond_t
>
1248 inline brc_match
<Cond_t
> m_Br(const Cond_t
&C
, BasicBlock
*&T
, BasicBlock
*&F
) {
1249 return brc_match
<Cond_t
>(C
, T
, F
);
1252 //===----------------------------------------------------------------------===//
1253 // Matchers for max/min idioms, eg: "select (sgt x, y), x, y" -> smax(x,y).
1256 template <typename CmpInst_t
, typename LHS_t
, typename RHS_t
, typename Pred_t
,
1257 bool Commutable
= false>
1258 struct MaxMin_match
{
1262 // The evaluation order is always stable, regardless of Commutability.
1263 // The LHS is always matched first.
1264 MaxMin_match(const LHS_t
&LHS
, const RHS_t
&RHS
) : L(LHS
), R(RHS
) {}
1266 template <typename OpTy
> bool match(OpTy
*V
) {
1267 // Look for "(x pred y) ? x : y" or "(x pred y) ? y : x".
1268 auto *SI
= dyn_cast
<SelectInst
>(V
);
1271 auto *Cmp
= dyn_cast
<CmpInst_t
>(SI
->getCondition());
1274 // At this point we have a select conditioned on a comparison. Check that
1275 // it is the values returned by the select that are being compared.
1276 Value
*TrueVal
= SI
->getTrueValue();
1277 Value
*FalseVal
= SI
->getFalseValue();
1278 Value
*LHS
= Cmp
->getOperand(0);
1279 Value
*RHS
= Cmp
->getOperand(1);
1280 if ((TrueVal
!= LHS
|| FalseVal
!= RHS
) &&
1281 (TrueVal
!= RHS
|| FalseVal
!= LHS
))
1283 typename
CmpInst_t::Predicate Pred
=
1284 LHS
== TrueVal
? Cmp
->getPredicate() : Cmp
->getInversePredicate();
1285 // Does "(x pred y) ? x : y" represent the desired max/min operation?
1286 if (!Pred_t::match(Pred
))
1288 // It does! Bind the operands.
1289 return (L
.match(LHS
) && R
.match(RHS
)) ||
1290 (Commutable
&& L
.match(RHS
) && R
.match(LHS
));
1294 /// Helper class for identifying signed max predicates.
1295 struct smax_pred_ty
{
1296 static bool match(ICmpInst::Predicate Pred
) {
1297 return Pred
== CmpInst::ICMP_SGT
|| Pred
== CmpInst::ICMP_SGE
;
1301 /// Helper class for identifying signed min predicates.
1302 struct smin_pred_ty
{
1303 static bool match(ICmpInst::Predicate Pred
) {
1304 return Pred
== CmpInst::ICMP_SLT
|| Pred
== CmpInst::ICMP_SLE
;
1308 /// Helper class for identifying unsigned max predicates.
1309 struct umax_pred_ty
{
1310 static bool match(ICmpInst::Predicate Pred
) {
1311 return Pred
== CmpInst::ICMP_UGT
|| Pred
== CmpInst::ICMP_UGE
;
1315 /// Helper class for identifying unsigned min predicates.
1316 struct umin_pred_ty
{
1317 static bool match(ICmpInst::Predicate Pred
) {
1318 return Pred
== CmpInst::ICMP_ULT
|| Pred
== CmpInst::ICMP_ULE
;
1322 /// Helper class for identifying ordered max predicates.
1323 struct ofmax_pred_ty
{
1324 static bool match(FCmpInst::Predicate Pred
) {
1325 return Pred
== CmpInst::FCMP_OGT
|| Pred
== CmpInst::FCMP_OGE
;
1329 /// Helper class for identifying ordered min predicates.
1330 struct ofmin_pred_ty
{
1331 static bool match(FCmpInst::Predicate Pred
) {
1332 return Pred
== CmpInst::FCMP_OLT
|| Pred
== CmpInst::FCMP_OLE
;
1336 /// Helper class for identifying unordered max predicates.
1337 struct ufmax_pred_ty
{
1338 static bool match(FCmpInst::Predicate Pred
) {
1339 return Pred
== CmpInst::FCMP_UGT
|| Pred
== CmpInst::FCMP_UGE
;
1343 /// Helper class for identifying unordered min predicates.
1344 struct ufmin_pred_ty
{
1345 static bool match(FCmpInst::Predicate Pred
) {
1346 return Pred
== CmpInst::FCMP_ULT
|| Pred
== CmpInst::FCMP_ULE
;
1350 template <typename LHS
, typename RHS
>
1351 inline MaxMin_match
<ICmpInst
, LHS
, RHS
, smax_pred_ty
> m_SMax(const LHS
&L
,
1353 return MaxMin_match
<ICmpInst
, LHS
, RHS
, smax_pred_ty
>(L
, R
);
1356 template <typename LHS
, typename RHS
>
1357 inline MaxMin_match
<ICmpInst
, LHS
, RHS
, smin_pred_ty
> m_SMin(const LHS
&L
,
1359 return MaxMin_match
<ICmpInst
, LHS
, RHS
, smin_pred_ty
>(L
, R
);
1362 template <typename LHS
, typename RHS
>
1363 inline MaxMin_match
<ICmpInst
, LHS
, RHS
, umax_pred_ty
> m_UMax(const LHS
&L
,
1365 return MaxMin_match
<ICmpInst
, LHS
, RHS
, umax_pred_ty
>(L
, R
);
1368 template <typename LHS
, typename RHS
>
1369 inline MaxMin_match
<ICmpInst
, LHS
, RHS
, umin_pred_ty
> m_UMin(const LHS
&L
,
1371 return MaxMin_match
<ICmpInst
, LHS
, RHS
, umin_pred_ty
>(L
, R
);
1374 /// Match an 'ordered' floating point maximum function.
1375 /// Floating point has one special value 'NaN'. Therefore, there is no total
1376 /// order. However, if we can ignore the 'NaN' value (for example, because of a
1377 /// 'no-nans-float-math' flag) a combination of a fcmp and select has 'maximum'
1378 /// semantics. In the presence of 'NaN' we have to preserve the original
1379 /// select(fcmp(ogt/ge, L, R), L, R) semantics matched by this predicate.
1381 /// max(L, R) iff L and R are not NaN
1382 /// m_OrdFMax(L, R) = R iff L or R are NaN
1383 template <typename LHS
, typename RHS
>
1384 inline MaxMin_match
<FCmpInst
, LHS
, RHS
, ofmax_pred_ty
> m_OrdFMax(const LHS
&L
,
1386 return MaxMin_match
<FCmpInst
, LHS
, RHS
, ofmax_pred_ty
>(L
, R
);
1389 /// Match an 'ordered' floating point minimum function.
1390 /// Floating point has one special value 'NaN'. Therefore, there is no total
1391 /// order. However, if we can ignore the 'NaN' value (for example, because of a
1392 /// 'no-nans-float-math' flag) a combination of a fcmp and select has 'minimum'
1393 /// semantics. In the presence of 'NaN' we have to preserve the original
1394 /// select(fcmp(olt/le, L, R), L, R) semantics matched by this predicate.
1396 /// min(L, R) iff L and R are not NaN
1397 /// m_OrdFMin(L, R) = R iff L or R are NaN
1398 template <typename LHS
, typename RHS
>
1399 inline MaxMin_match
<FCmpInst
, LHS
, RHS
, ofmin_pred_ty
> m_OrdFMin(const LHS
&L
,
1401 return MaxMin_match
<FCmpInst
, LHS
, RHS
, ofmin_pred_ty
>(L
, R
);
1404 /// Match an 'unordered' floating point maximum function.
1405 /// Floating point has one special value 'NaN'. Therefore, there is no total
1406 /// order. However, if we can ignore the 'NaN' value (for example, because of a
1407 /// 'no-nans-float-math' flag) a combination of a fcmp and select has 'maximum'
1408 /// semantics. In the presence of 'NaN' we have to preserve the original
1409 /// select(fcmp(ugt/ge, L, R), L, R) semantics matched by this predicate.
1411 /// max(L, R) iff L and R are not NaN
1412 /// m_UnordFMax(L, R) = L iff L or R are NaN
1413 template <typename LHS
, typename RHS
>
1414 inline MaxMin_match
<FCmpInst
, LHS
, RHS
, ufmax_pred_ty
>
1415 m_UnordFMax(const LHS
&L
, const RHS
&R
) {
1416 return MaxMin_match
<FCmpInst
, LHS
, RHS
, ufmax_pred_ty
>(L
, R
);
1419 /// Match an 'unordered' floating point minimum function.
1420 /// Floating point has one special value 'NaN'. Therefore, there is no total
1421 /// order. However, if we can ignore the 'NaN' value (for example, because of a
1422 /// 'no-nans-float-math' flag) a combination of a fcmp and select has 'minimum'
1423 /// semantics. In the presence of 'NaN' we have to preserve the original
1424 /// select(fcmp(ult/le, L, R), L, R) semantics matched by this predicate.
1426 /// min(L, R) iff L and R are not NaN
1427 /// m_UnordFMin(L, R) = L iff L or R are NaN
1428 template <typename LHS
, typename RHS
>
1429 inline MaxMin_match
<FCmpInst
, LHS
, RHS
, ufmin_pred_ty
>
1430 m_UnordFMin(const LHS
&L
, const RHS
&R
) {
1431 return MaxMin_match
<FCmpInst
, LHS
, RHS
, ufmin_pred_ty
>(L
, R
);
1434 //===----------------------------------------------------------------------===//
1435 // Matchers for overflow check patterns: e.g. (a + b) u< a
1438 template <typename LHS_t
, typename RHS_t
, typename Sum_t
>
1439 struct UAddWithOverflow_match
{
1444 UAddWithOverflow_match(const LHS_t
&L
, const RHS_t
&R
, const Sum_t
&S
)
1445 : L(L
), R(R
), S(S
) {}
1447 template <typename OpTy
> bool match(OpTy
*V
) {
1448 Value
*ICmpLHS
, *ICmpRHS
;
1449 ICmpInst::Predicate Pred
;
1450 if (!m_ICmp(Pred
, m_Value(ICmpLHS
), m_Value(ICmpRHS
)).match(V
))
1453 Value
*AddLHS
, *AddRHS
;
1454 auto AddExpr
= m_Add(m_Value(AddLHS
), m_Value(AddRHS
));
1456 // (a + b) u< a, (a + b) u< b
1457 if (Pred
== ICmpInst::ICMP_ULT
)
1458 if (AddExpr
.match(ICmpLHS
) && (ICmpRHS
== AddLHS
|| ICmpRHS
== AddRHS
))
1459 return L
.match(AddLHS
) && R
.match(AddRHS
) && S
.match(ICmpLHS
);
1461 // a >u (a + b), b >u (a + b)
1462 if (Pred
== ICmpInst::ICMP_UGT
)
1463 if (AddExpr
.match(ICmpRHS
) && (ICmpLHS
== AddLHS
|| ICmpLHS
== AddRHS
))
1464 return L
.match(AddLHS
) && R
.match(AddRHS
) && S
.match(ICmpRHS
);
1466 // Match special-case for increment-by-1.
1467 if (Pred
== ICmpInst::ICMP_EQ
) {
1470 if (AddExpr
.match(ICmpLHS
) && m_ZeroInt().match(ICmpRHS
) &&
1471 (m_One().match(AddLHS
) || m_One().match(AddRHS
)))
1472 return L
.match(AddLHS
) && R
.match(AddRHS
) && S
.match(ICmpLHS
);
1475 if (m_ZeroInt().match(ICmpLHS
) && AddExpr
.match(ICmpRHS
) &&
1476 (m_One().match(AddLHS
) || m_One().match(AddRHS
)))
1477 return L
.match(AddLHS
) && R
.match(AddRHS
) && S
.match(ICmpRHS
);
1484 /// Match an icmp instruction checking for unsigned overflow on addition.
1486 /// S is matched to the addition whose result is being checked for overflow, and
1487 /// L and R are matched to the LHS and RHS of S.
1488 template <typename LHS_t
, typename RHS_t
, typename Sum_t
>
1489 UAddWithOverflow_match
<LHS_t
, RHS_t
, Sum_t
>
1490 m_UAddWithOverflow(const LHS_t
&L
, const RHS_t
&R
, const Sum_t
&S
) {
1491 return UAddWithOverflow_match
<LHS_t
, RHS_t
, Sum_t
>(L
, R
, S
);
1494 template <typename Opnd_t
> struct Argument_match
{
1498 Argument_match(unsigned OpIdx
, const Opnd_t
&V
) : OpI(OpIdx
), Val(V
) {}
1500 template <typename OpTy
> bool match(OpTy
*V
) {
1501 // FIXME: Should likely be switched to use `CallBase`.
1502 if (const auto *CI
= dyn_cast
<CallInst
>(V
))
1503 return Val
.match(CI
->getArgOperand(OpI
));
1508 /// Match an argument.
1509 template <unsigned OpI
, typename Opnd_t
>
1510 inline Argument_match
<Opnd_t
> m_Argument(const Opnd_t
&Op
) {
1511 return Argument_match
<Opnd_t
>(OpI
, Op
);
1514 /// Intrinsic matchers.
1515 struct IntrinsicID_match
{
1518 IntrinsicID_match(Intrinsic::ID IntrID
) : ID(IntrID
) {}
1520 template <typename OpTy
> bool match(OpTy
*V
) {
1521 if (const auto *CI
= dyn_cast
<CallInst
>(V
))
1522 if (const auto *F
= CI
->getCalledFunction())
1523 return F
->getIntrinsicID() == ID
;
1528 /// Intrinsic matches are combinations of ID matchers, and argument
1529 /// matchers. Higher arity matcher are defined recursively in terms of and-ing
1530 /// them with lower arity matchers. Here's some convenient typedefs for up to
1531 /// several arguments, and more can be added as needed
1532 template <typename T0
= void, typename T1
= void, typename T2
= void,
1533 typename T3
= void, typename T4
= void, typename T5
= void,
1534 typename T6
= void, typename T7
= void, typename T8
= void,
1535 typename T9
= void, typename T10
= void>
1536 struct m_Intrinsic_Ty
;
1537 template <typename T0
> struct m_Intrinsic_Ty
<T0
> {
1538 using Ty
= match_combine_and
<IntrinsicID_match
, Argument_match
<T0
>>;
1540 template <typename T0
, typename T1
> struct m_Intrinsic_Ty
<T0
, T1
> {
1542 match_combine_and
<typename m_Intrinsic_Ty
<T0
>::Ty
, Argument_match
<T1
>>;
1544 template <typename T0
, typename T1
, typename T2
>
1545 struct m_Intrinsic_Ty
<T0
, T1
, T2
> {
1547 match_combine_and
<typename m_Intrinsic_Ty
<T0
, T1
>::Ty
,
1548 Argument_match
<T2
>>;
1550 template <typename T0
, typename T1
, typename T2
, typename T3
>
1551 struct m_Intrinsic_Ty
<T0
, T1
, T2
, T3
> {
1553 match_combine_and
<typename m_Intrinsic_Ty
<T0
, T1
, T2
>::Ty
,
1554 Argument_match
<T3
>>;
1557 /// Match intrinsic calls like this:
1558 /// m_Intrinsic<Intrinsic::fabs>(m_Value(X))
1559 template <Intrinsic::ID IntrID
> inline IntrinsicID_match
m_Intrinsic() {
1560 return IntrinsicID_match(IntrID
);
1563 template <Intrinsic::ID IntrID
, typename T0
>
1564 inline typename m_Intrinsic_Ty
<T0
>::Ty
m_Intrinsic(const T0
&Op0
) {
1565 return m_CombineAnd(m_Intrinsic
<IntrID
>(), m_Argument
<0>(Op0
));
1568 template <Intrinsic::ID IntrID
, typename T0
, typename T1
>
1569 inline typename m_Intrinsic_Ty
<T0
, T1
>::Ty
m_Intrinsic(const T0
&Op0
,
1571 return m_CombineAnd(m_Intrinsic
<IntrID
>(Op0
), m_Argument
<1>(Op1
));
1574 template <Intrinsic::ID IntrID
, typename T0
, typename T1
, typename T2
>
1575 inline typename m_Intrinsic_Ty
<T0
, T1
, T2
>::Ty
1576 m_Intrinsic(const T0
&Op0
, const T1
&Op1
, const T2
&Op2
) {
1577 return m_CombineAnd(m_Intrinsic
<IntrID
>(Op0
, Op1
), m_Argument
<2>(Op2
));
1580 template <Intrinsic::ID IntrID
, typename T0
, typename T1
, typename T2
,
1582 inline typename m_Intrinsic_Ty
<T0
, T1
, T2
, T3
>::Ty
1583 m_Intrinsic(const T0
&Op0
, const T1
&Op1
, const T2
&Op2
, const T3
&Op3
) {
1584 return m_CombineAnd(m_Intrinsic
<IntrID
>(Op0
, Op1
, Op2
), m_Argument
<3>(Op3
));
1587 // Helper intrinsic matching specializations.
1588 template <typename Opnd0
>
1589 inline typename m_Intrinsic_Ty
<Opnd0
>::Ty
m_BitReverse(const Opnd0
&Op0
) {
1590 return m_Intrinsic
<Intrinsic::bitreverse
>(Op0
);
1593 template <typename Opnd0
>
1594 inline typename m_Intrinsic_Ty
<Opnd0
>::Ty
m_BSwap(const Opnd0
&Op0
) {
1595 return m_Intrinsic
<Intrinsic::bswap
>(Op0
);
1598 template <typename Opnd0
>
1599 inline typename m_Intrinsic_Ty
<Opnd0
>::Ty
m_FAbs(const Opnd0
&Op0
) {
1600 return m_Intrinsic
<Intrinsic::fabs
>(Op0
);
1603 template <typename Opnd0
>
1604 inline typename m_Intrinsic_Ty
<Opnd0
>::Ty
m_FCanonicalize(const Opnd0
&Op0
) {
1605 return m_Intrinsic
<Intrinsic::canonicalize
>(Op0
);
1608 template <typename Opnd0
, typename Opnd1
>
1609 inline typename m_Intrinsic_Ty
<Opnd0
, Opnd1
>::Ty
m_FMin(const Opnd0
&Op0
,
1611 return m_Intrinsic
<Intrinsic::minnum
>(Op0
, Op1
);
1614 template <typename Opnd0
, typename Opnd1
>
1615 inline typename m_Intrinsic_Ty
<Opnd0
, Opnd1
>::Ty
m_FMax(const Opnd0
&Op0
,
1617 return m_Intrinsic
<Intrinsic::maxnum
>(Op0
, Op1
);
1620 //===----------------------------------------------------------------------===//
1621 // Matchers for two-operands operators with the operators in either order
1624 /// Matches a BinaryOperator with LHS and RHS in either order.
1625 template <typename LHS
, typename RHS
>
1626 inline AnyBinaryOp_match
<LHS
, RHS
, true> m_c_BinOp(const LHS
&L
, const RHS
&R
) {
1627 return AnyBinaryOp_match
<LHS
, RHS
, true>(L
, R
);
1630 /// Matches an ICmp with a predicate over LHS and RHS in either order.
1631 /// Does not swap the predicate.
1632 template <typename LHS
, typename RHS
>
1633 inline CmpClass_match
<LHS
, RHS
, ICmpInst
, ICmpInst::Predicate
, true>
1634 m_c_ICmp(ICmpInst::Predicate
&Pred
, const LHS
&L
, const RHS
&R
) {
1635 return CmpClass_match
<LHS
, RHS
, ICmpInst
, ICmpInst::Predicate
, true>(Pred
, L
,
1639 /// Matches a Add with LHS and RHS in either order.
1640 template <typename LHS
, typename RHS
>
1641 inline BinaryOp_match
<LHS
, RHS
, Instruction::Add
, true> m_c_Add(const LHS
&L
,
1643 return BinaryOp_match
<LHS
, RHS
, Instruction::Add
, true>(L
, R
);
1646 /// Matches a Mul with LHS and RHS in either order.
1647 template <typename LHS
, typename RHS
>
1648 inline BinaryOp_match
<LHS
, RHS
, Instruction::Mul
, true> m_c_Mul(const LHS
&L
,
1650 return BinaryOp_match
<LHS
, RHS
, Instruction::Mul
, true>(L
, R
);
1653 /// Matches an And with LHS and RHS in either order.
1654 template <typename LHS
, typename RHS
>
1655 inline BinaryOp_match
<LHS
, RHS
, Instruction::And
, true> m_c_And(const LHS
&L
,
1657 return BinaryOp_match
<LHS
, RHS
, Instruction::And
, true>(L
, R
);
1660 /// Matches an Or with LHS and RHS in either order.
1661 template <typename LHS
, typename RHS
>
1662 inline BinaryOp_match
<LHS
, RHS
, Instruction::Or
, true> m_c_Or(const LHS
&L
,
1664 return BinaryOp_match
<LHS
, RHS
, Instruction::Or
, true>(L
, R
);
1667 /// Matches an Xor with LHS and RHS in either order.
1668 template <typename LHS
, typename RHS
>
1669 inline BinaryOp_match
<LHS
, RHS
, Instruction::Xor
, true> m_c_Xor(const LHS
&L
,
1671 return BinaryOp_match
<LHS
, RHS
, Instruction::Xor
, true>(L
, R
);
1674 /// Matches a 'Neg' as 'sub 0, V'.
1675 template <typename ValTy
>
1676 inline BinaryOp_match
<cst_pred_ty
<is_zero_int
>, ValTy
, Instruction::Sub
>
1677 m_Neg(const ValTy
&V
) {
1678 return m_Sub(m_ZeroInt(), V
);
1681 /// Matches a 'Not' as 'xor V, -1' or 'xor -1, V'.
1682 template <typename ValTy
>
1683 inline BinaryOp_match
<ValTy
, cst_pred_ty
<is_all_ones
>, Instruction::Xor
, true>
1684 m_Not(const ValTy
&V
) {
1685 return m_c_Xor(V
, m_AllOnes());
1688 /// Matches an SMin with LHS and RHS in either order.
1689 template <typename LHS
, typename RHS
>
1690 inline MaxMin_match
<ICmpInst
, LHS
, RHS
, smin_pred_ty
, true>
1691 m_c_SMin(const LHS
&L
, const RHS
&R
) {
1692 return MaxMin_match
<ICmpInst
, LHS
, RHS
, smin_pred_ty
, true>(L
, R
);
1694 /// Matches an SMax with LHS and RHS in either order.
1695 template <typename LHS
, typename RHS
>
1696 inline MaxMin_match
<ICmpInst
, LHS
, RHS
, smax_pred_ty
, true>
1697 m_c_SMax(const LHS
&L
, const RHS
&R
) {
1698 return MaxMin_match
<ICmpInst
, LHS
, RHS
, smax_pred_ty
, true>(L
, R
);
1700 /// Matches a UMin with LHS and RHS in either order.
1701 template <typename LHS
, typename RHS
>
1702 inline MaxMin_match
<ICmpInst
, LHS
, RHS
, umin_pred_ty
, true>
1703 m_c_UMin(const LHS
&L
, const RHS
&R
) {
1704 return MaxMin_match
<ICmpInst
, LHS
, RHS
, umin_pred_ty
, true>(L
, R
);
1706 /// Matches a UMax with LHS and RHS in either order.
1707 template <typename LHS
, typename RHS
>
1708 inline MaxMin_match
<ICmpInst
, LHS
, RHS
, umax_pred_ty
, true>
1709 m_c_UMax(const LHS
&L
, const RHS
&R
) {
1710 return MaxMin_match
<ICmpInst
, LHS
, RHS
, umax_pred_ty
, true>(L
, R
);
1713 /// Matches FAdd with LHS and RHS in either order.
1714 template <typename LHS
, typename RHS
>
1715 inline BinaryOp_match
<LHS
, RHS
, Instruction::FAdd
, true>
1716 m_c_FAdd(const LHS
&L
, const RHS
&R
) {
1717 return BinaryOp_match
<LHS
, RHS
, Instruction::FAdd
, true>(L
, R
);
1720 /// Matches FMul with LHS and RHS in either order.
1721 template <typename LHS
, typename RHS
>
1722 inline BinaryOp_match
<LHS
, RHS
, Instruction::FMul
, true>
1723 m_c_FMul(const LHS
&L
, const RHS
&R
) {
1724 return BinaryOp_match
<LHS
, RHS
, Instruction::FMul
, true>(L
, R
);
1727 template <typename Opnd_t
> struct Signum_match
{
1729 Signum_match(const Opnd_t
&V
) : Val(V
) {}
1731 template <typename OpTy
> bool match(OpTy
*V
) {
1732 unsigned TypeSize
= V
->getType()->getScalarSizeInBits();
1736 unsigned ShiftWidth
= TypeSize
- 1;
1737 Value
*OpL
= nullptr, *OpR
= nullptr;
1739 // This is the representation of signum we match:
1741 // signum(x) == (x >> 63) | (-x >>u 63)
1743 // An i1 value is its own signum, so it's correct to match
1745 // signum(x) == (x >> 0) | (-x >>u 0)
1749 auto LHS
= m_AShr(m_Value(OpL
), m_SpecificInt(ShiftWidth
));
1750 auto RHS
= m_LShr(m_Neg(m_Value(OpR
)), m_SpecificInt(ShiftWidth
));
1751 auto Signum
= m_Or(LHS
, RHS
);
1753 return Signum
.match(V
) && OpL
== OpR
&& Val
.match(OpL
);
1757 /// Matches a signum pattern.
1763 template <typename Val_t
> inline Signum_match
<Val_t
> m_Signum(const Val_t
&V
) {
1764 return Signum_match
<Val_t
>(V
);
1767 } // end namespace PatternMatch
1768 } // end namespace llvm
1770 #endif // LLVM_IR_PATTERNMATCH_H