1 //===- PatternMatch.h - Match on the LLVM IR --------------------*- C++ -*-===// 2 // 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 6 // 7 //===----------------------------------------------------------------------===// 8 // 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: 15 // 16 // Value *Exp = ... 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 ... 21 // } 22 // 23 // This is primarily useful to things like the instruction combiner, but can 24 // also be useful for static analysis tools or code generators. 25 // 26 //===----------------------------------------------------------------------===// 27 28 #ifndef LLVM_IR_PATTERNMATCH_H 29 #define LLVM_IR_PATTERNMATCH_H 30 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/IntrinsicInst.h" 39 #include "llvm/IR/Intrinsics.h" 40 #include "llvm/IR/Operator.h" 41 #include "llvm/IR/Value.h" 42 #include "llvm/Support/Casting.h" 43 #include <cstdint> 44 45 namespace llvm { 46 namespace PatternMatch { 47 48 template <typename Val, typename Pattern> bool match(Val *V, const Pattern &P) { 49 return const_cast<Pattern &>(P).match(V); 50 } 51 52 template <typename SubPattern_t> struct OneUse_match { 53 SubPattern_t SubPattern; 54 55 OneUse_match(const SubPattern_t &SP) : SubPattern(SP) {} 56 57 template <typename OpTy> bool match(OpTy *V) { 58 return V->hasOneUse() && SubPattern.match(V); 59 } 60 }; 61 62 template <typename T> inline OneUse_match<T> m_OneUse(const T &SubPattern) { 63 return SubPattern; 64 } 65 66 template <typename Class> struct class_match { 67 template <typename ITy> bool match(ITy *V) { return isa<Class>(V); } 68 }; 69 70 /// Match an arbitrary value and ignore it. 71 inline class_match<Value> m_Value() { return class_match<Value>(); } 72 73 /// Match an arbitrary binary operation and ignore it. 74 inline class_match<BinaryOperator> m_BinOp() { 75 return class_match<BinaryOperator>(); 76 } 77 78 /// Matches any compare instruction and ignore it. 79 inline class_match<CmpInst> m_Cmp() { return class_match<CmpInst>(); } 80 81 /// Match an arbitrary ConstantInt and ignore it. 82 inline class_match<ConstantInt> m_ConstantInt() { 83 return class_match<ConstantInt>(); 84 } 85 86 /// Match an arbitrary undef constant. 87 inline class_match<UndefValue> m_Undef() { return class_match<UndefValue>(); } 88 89 /// Match an arbitrary Constant and ignore it. 90 inline class_match<Constant> m_Constant() { return class_match<Constant>(); } 91 92 /// Match an arbitrary basic block value and ignore it. 93 inline class_match<BasicBlock> m_BasicBlock() { 94 return class_match<BasicBlock>(); 95 } 96 97 /// Inverting matcher 98 template <typename Ty> struct match_unless { 99 Ty M; 100 101 match_unless(const Ty &Matcher) : M(Matcher) {} 102 103 template <typename ITy> bool match(ITy *V) { return !M.match(V); } 104 }; 105 106 /// Match if the inner matcher does *NOT* match. 107 template <typename Ty> inline match_unless<Ty> m_Unless(const Ty &M) { 108 return match_unless<Ty>(M); 109 } 110 111 /// Matching combinators 112 template <typename LTy, typename RTy> struct match_combine_or { 113 LTy L; 114 RTy R; 115 116 match_combine_or(const LTy &Left, const RTy &Right) : L(Left), R(Right) {} 117 118 template <typename ITy> bool match(ITy *V) { 119 if (L.match(V)) 120 return true; 121 if (R.match(V)) 122 return true; 123 return false; 124 } 125 }; 126 127 template <typename LTy, typename RTy> struct match_combine_and { 128 LTy L; 129 RTy R; 130 131 match_combine_and(const LTy &Left, const RTy &Right) : L(Left), R(Right) {} 132 133 template <typename ITy> bool match(ITy *V) { 134 if (L.match(V)) 135 if (R.match(V)) 136 return true; 137 return false; 138 } 139 }; 140 141 /// Combine two pattern matchers matching L || R 142 template <typename LTy, typename RTy> 143 inline match_combine_or<LTy, RTy> m_CombineOr(const LTy &L, const RTy &R) { 144 return match_combine_or<LTy, RTy>(L, R); 145 } 146 147 /// Combine two pattern matchers matching L && R 148 template <typename LTy, typename RTy> 149 inline match_combine_and<LTy, RTy> m_CombineAnd(const LTy &L, const RTy &R) { 150 return match_combine_and<LTy, RTy>(L, R); 151 } 152 153 struct apint_match { 154 const APInt *&Res; 155 156 apint_match(const APInt *&R) : Res(R) {} 157 158 template <typename ITy> bool match(ITy *V) { 159 if (auto *CI = dyn_cast<ConstantInt>(V)) { 160 Res = &CI->getValue(); 161 return true; 162 } 163 if (V->getType()->isVectorTy()) 164 if (const auto *C = dyn_cast<Constant>(V)) 165 if (auto *CI = dyn_cast_or_null<ConstantInt>(C->getSplatValue())) { 166 Res = &CI->getValue(); 167 return true; 168 } 169 return false; 170 } 171 }; 172 // Either constexpr if or renaming ConstantFP::getValueAPF to 173 // ConstantFP::getValue is needed to do it via single template 174 // function for both apint/apfloat. 175 struct apfloat_match { 176 const APFloat *&Res; 177 apfloat_match(const APFloat *&R) : Res(R) {} 178 template <typename ITy> bool match(ITy *V) { 179 if (auto *CI = dyn_cast<ConstantFP>(V)) { 180 Res = &CI->getValueAPF(); 181 return true; 182 } 183 if (V->getType()->isVectorTy()) 184 if (const auto *C = dyn_cast<Constant>(V)) 185 if (auto *CI = dyn_cast_or_null<ConstantFP>(C->getSplatValue())) { 186 Res = &CI->getValueAPF(); 187 return true; 188 } 189 return false; 190 } 191 }; 192 193 /// Match a ConstantInt or splatted ConstantVector, binding the 194 /// specified pointer to the contained APInt. 195 inline apint_match m_APInt(const APInt *&Res) { return Res; } 196 197 /// Match a ConstantFP or splatted ConstantVector, binding the 198 /// specified pointer to the contained APFloat. 199 inline apfloat_match m_APFloat(const APFloat *&Res) { return Res; } 200 201 template <int64_t Val> struct constantint_match { 202 template <typename ITy> bool match(ITy *V) { 203 if (const auto *CI = dyn_cast<ConstantInt>(V)) { 204 const APInt &CIV = CI->getValue(); 205 if (Val >= 0) 206 return CIV == static_cast<uint64_t>(Val); 207 // If Val is negative, and CI is shorter than it, truncate to the right 208 // number of bits. If it is larger, then we have to sign extend. Just 209 // compare their negated values. 210 return -CIV == -Val; 211 } 212 return false; 213 } 214 }; 215 216 /// Match a ConstantInt with a specific value. 217 template <int64_t Val> inline constantint_match<Val> m_ConstantInt() { 218 return constantint_match<Val>(); 219 } 220 221 /// This helper class is used to match scalar and vector integer constants that 222 /// satisfy a specified predicate. 223 /// For vector constants, undefined elements are ignored. 224 template <typename Predicate> struct cst_pred_ty : public Predicate { 225 template <typename ITy> bool match(ITy *V) { 226 if (const auto *CI = dyn_cast<ConstantInt>(V)) 227 return this->isValue(CI->getValue()); 228 if (V->getType()->isVectorTy()) { 229 if (const auto *C = dyn_cast<Constant>(V)) { 230 if (const auto *CI = dyn_cast_or_null<ConstantInt>(C->getSplatValue())) 231 return this->isValue(CI->getValue()); 232 233 // Non-splat vector constant: check each element for a match. 234 unsigned NumElts = V->getType()->getVectorNumElements(); 235 assert(NumElts != 0 && "Constant vector with no elements?"); 236 bool HasNonUndefElements = false; 237 for (unsigned i = 0; i != NumElts; ++i) { 238 Constant *Elt = C->getAggregateElement(i); 239 if (!Elt) 240 return false; 241 if (isa<UndefValue>(Elt)) 242 continue; 243 auto *CI = dyn_cast<ConstantInt>(Elt); 244 if (!CI || !this->isValue(CI->getValue())) 245 return false; 246 HasNonUndefElements = true; 247 } 248 return HasNonUndefElements; 249 } 250 } 251 return false; 252 } 253 }; 254 255 /// This helper class is used to match scalar and vector constants that 256 /// satisfy a specified predicate, and bind them to an APInt. 257 template <typename Predicate> struct api_pred_ty : public Predicate { 258 const APInt *&Res; 259 260 api_pred_ty(const APInt *&R) : Res(R) {} 261 262 template <typename ITy> bool match(ITy *V) { 263 if (const auto *CI = dyn_cast<ConstantInt>(V)) 264 if (this->isValue(CI->getValue())) { 265 Res = &CI->getValue(); 266 return true; 267 } 268 if (V->getType()->isVectorTy()) 269 if (const auto *C = dyn_cast<Constant>(V)) 270 if (auto *CI = dyn_cast_or_null<ConstantInt>(C->getSplatValue())) 271 if (this->isValue(CI->getValue())) { 272 Res = &CI->getValue(); 273 return true; 274 } 275 276 return false; 277 } 278 }; 279 280 /// This helper class is used to match scalar and vector floating-point 281 /// constants that satisfy a specified predicate. 282 /// For vector constants, undefined elements are ignored. 283 template <typename Predicate> struct cstfp_pred_ty : public Predicate { 284 template <typename ITy> bool match(ITy *V) { 285 if (const auto *CF = dyn_cast<ConstantFP>(V)) 286 return this->isValue(CF->getValueAPF()); 287 if (V->getType()->isVectorTy()) { 288 if (const auto *C = dyn_cast<Constant>(V)) { 289 if (const auto *CF = dyn_cast_or_null<ConstantFP>(C->getSplatValue())) 290 return this->isValue(CF->getValueAPF()); 291 292 // Non-splat vector constant: check each element for a match. 293 unsigned NumElts = V->getType()->getVectorNumElements(); 294 assert(NumElts != 0 && "Constant vector with no elements?"); 295 bool HasNonUndefElements = false; 296 for (unsigned i = 0; i != NumElts; ++i) { 297 Constant *Elt = C->getAggregateElement(i); 298 if (!Elt) 299 return false; 300 if (isa<UndefValue>(Elt)) 301 continue; 302 auto *CF = dyn_cast<ConstantFP>(Elt); 303 if (!CF || !this->isValue(CF->getValueAPF())) 304 return false; 305 HasNonUndefElements = true; 306 } 307 return HasNonUndefElements; 308 } 309 } 310 return false; 311 } 312 }; 313 314 /////////////////////////////////////////////////////////////////////////////// 315 // 316 // Encapsulate constant value queries for use in templated predicate matchers. 317 // This allows checking if constants match using compound predicates and works 318 // with vector constants, possibly with relaxed constraints. For example, ignore 319 // undef values. 320 // 321 /////////////////////////////////////////////////////////////////////////////// 322 323 struct is_any_apint { 324 bool isValue(const APInt &C) { return true; } 325 }; 326 /// Match an integer or vector with any integral constant. 327 /// For vectors, this includes constants with undefined elements. 328 inline cst_pred_ty<is_any_apint> m_AnyIntegralConstant() { 329 return cst_pred_ty<is_any_apint>(); 330 } 331 332 struct is_all_ones { 333 bool isValue(const APInt &C) { return C.isAllOnesValue(); } 334 }; 335 /// Match an integer or vector with all bits set. 336 /// For vectors, this includes constants with undefined elements. 337 inline cst_pred_ty<is_all_ones> m_AllOnes() { 338 return cst_pred_ty<is_all_ones>(); 339 } 340 341 struct is_maxsignedvalue { 342 bool isValue(const APInt &C) { return C.isMaxSignedValue(); } 343 }; 344 /// Match an integer or vector with values having all bits except for the high 345 /// bit set (0x7f...). 346 /// For vectors, this includes constants with undefined elements. 347 inline cst_pred_ty<is_maxsignedvalue> m_MaxSignedValue() { 348 return cst_pred_ty<is_maxsignedvalue>(); 349 } 350 inline api_pred_ty<is_maxsignedvalue> m_MaxSignedValue(const APInt *&V) { 351 return V; 352 } 353 354 struct is_negative { 355 bool isValue(const APInt &C) { return C.isNegative(); } 356 }; 357 /// Match an integer or vector of negative values. 358 /// For vectors, this includes constants with undefined elements. 359 inline cst_pred_ty<is_negative> m_Negative() { 360 return cst_pred_ty<is_negative>(); 361 } 362 inline api_pred_ty<is_negative> m_Negative(const APInt *&V) { 363 return V; 364 } 365 366 struct is_nonnegative { 367 bool isValue(const APInt &C) { return C.isNonNegative(); } 368 }; 369 /// Match an integer or vector of non-negative values. 370 /// For vectors, this includes constants with undefined elements. 371 inline cst_pred_ty<is_nonnegative> m_NonNegative() { 372 return cst_pred_ty<is_nonnegative>(); 373 } 374 inline api_pred_ty<is_nonnegative> m_NonNegative(const APInt *&V) { 375 return V; 376 } 377 378 struct is_strictlypositive { 379 bool isValue(const APInt &C) { return C.isStrictlyPositive(); } 380 }; 381 /// Match an integer or vector of strictly positive values. 382 /// For vectors, this includes constants with undefined elements. 383 inline cst_pred_ty<is_strictlypositive> m_StrictlyPositive() { 384 return cst_pred_ty<is_strictlypositive>(); 385 } 386 inline api_pred_ty<is_strictlypositive> m_StrictlyPositive(const APInt *&V) { 387 return V; 388 } 389 390 struct is_nonpositive { 391 bool isValue(const APInt &C) { return C.isNonPositive(); } 392 }; 393 /// Match an integer or vector of non-positive values. 394 /// For vectors, this includes constants with undefined elements. 395 inline cst_pred_ty<is_nonpositive> m_NonPositive() { 396 return cst_pred_ty<is_nonpositive>(); 397 } 398 inline api_pred_ty<is_nonpositive> m_NonPositive(const APInt *&V) { return V; } 399 400 struct is_one { 401 bool isValue(const APInt &C) { return C.isOneValue(); } 402 }; 403 /// Match an integer 1 or a vector with all elements equal to 1. 404 /// For vectors, this includes constants with undefined elements. 405 inline cst_pred_ty<is_one> m_One() { 406 return cst_pred_ty<is_one>(); 407 } 408 409 struct is_zero_int { 410 bool isValue(const APInt &C) { return C.isNullValue(); } 411 }; 412 /// Match an integer 0 or a vector with all elements equal to 0. 413 /// For vectors, this includes constants with undefined elements. 414 inline cst_pred_ty<is_zero_int> m_ZeroInt() { 415 return cst_pred_ty<is_zero_int>(); 416 } 417 418 struct is_zero { 419 template <typename ITy> bool match(ITy *V) { 420 auto *C = dyn_cast<Constant>(V); 421 return C && (C->isNullValue() || cst_pred_ty<is_zero_int>().match(C)); 422 } 423 }; 424 /// Match any null constant or a vector with all elements equal to 0. 425 /// For vectors, this includes constants with undefined elements. 426 inline is_zero m_Zero() { 427 return is_zero(); 428 } 429 430 struct is_power2 { 431 bool isValue(const APInt &C) { return C.isPowerOf2(); } 432 }; 433 /// Match an integer or vector power-of-2. 434 /// For vectors, this includes constants with undefined elements. 435 inline cst_pred_ty<is_power2> m_Power2() { 436 return cst_pred_ty<is_power2>(); 437 } 438 inline api_pred_ty<is_power2> m_Power2(const APInt *&V) { 439 return V; 440 } 441 442 struct is_negated_power2 { 443 bool isValue(const APInt &C) { return (-C).isPowerOf2(); } 444 }; 445 /// Match a integer or vector negated power-of-2. 446 /// For vectors, this includes constants with undefined elements. 447 inline cst_pred_ty<is_negated_power2> m_NegatedPower2() { 448 return cst_pred_ty<is_negated_power2>(); 449 } 450 inline api_pred_ty<is_negated_power2> m_NegatedPower2(const APInt *&V) { 451 return V; 452 } 453 454 struct is_power2_or_zero { 455 bool isValue(const APInt &C) { return !C || C.isPowerOf2(); } 456 }; 457 /// Match an integer or vector of 0 or power-of-2 values. 458 /// For vectors, this includes constants with undefined elements. 459 inline cst_pred_ty<is_power2_or_zero> m_Power2OrZero() { 460 return cst_pred_ty<is_power2_or_zero>(); 461 } 462 inline api_pred_ty<is_power2_or_zero> m_Power2OrZero(const APInt *&V) { 463 return V; 464 } 465 466 struct is_sign_mask { 467 bool isValue(const APInt &C) { return C.isSignMask(); } 468 }; 469 /// Match an integer or vector with only the sign bit(s) set. 470 /// For vectors, this includes constants with undefined elements. 471 inline cst_pred_ty<is_sign_mask> m_SignMask() { 472 return cst_pred_ty<is_sign_mask>(); 473 } 474 475 struct is_lowbit_mask { 476 bool isValue(const APInt &C) { return C.isMask(); } 477 }; 478 /// Match an integer or vector with only the low bit(s) set. 479 /// For vectors, this includes constants with undefined elements. 480 inline cst_pred_ty<is_lowbit_mask> m_LowBitMask() { 481 return cst_pred_ty<is_lowbit_mask>(); 482 } 483 484 struct icmp_pred_with_threshold { 485 ICmpInst::Predicate Pred; 486 const APInt *Thr; 487 bool isValue(const APInt &C) { 488 switch (Pred) { 489 case ICmpInst::Predicate::ICMP_EQ: 490 return C.eq(*Thr); 491 case ICmpInst::Predicate::ICMP_NE: 492 return C.ne(*Thr); 493 case ICmpInst::Predicate::ICMP_UGT: 494 return C.ugt(*Thr); 495 case ICmpInst::Predicate::ICMP_UGE: 496 return C.uge(*Thr); 497 case ICmpInst::Predicate::ICMP_ULT: 498 return C.ult(*Thr); 499 case ICmpInst::Predicate::ICMP_ULE: 500 return C.ule(*Thr); 501 case ICmpInst::Predicate::ICMP_SGT: 502 return C.sgt(*Thr); 503 case ICmpInst::Predicate::ICMP_SGE: 504 return C.sge(*Thr); 505 case ICmpInst::Predicate::ICMP_SLT: 506 return C.slt(*Thr); 507 case ICmpInst::Predicate::ICMP_SLE: 508 return C.sle(*Thr); 509 default: 510 llvm_unreachable("Unhandled ICmp predicate"); 511 } 512 } 513 }; 514 /// Match an integer or vector with every element comparing 'pred' (eg/ne/...) 515 /// to Threshold. For vectors, this includes constants with undefined elements. 516 inline cst_pred_ty<icmp_pred_with_threshold> 517 m_SpecificInt_ICMP(ICmpInst::Predicate Predicate, const APInt &Threshold) { 518 cst_pred_ty<icmp_pred_with_threshold> P; 519 P.Pred = Predicate; 520 P.Thr = &Threshold; 521 return P; 522 } 523 524 struct is_nan { 525 bool isValue(const APFloat &C) { return C.isNaN(); } 526 }; 527 /// Match an arbitrary NaN constant. This includes quiet and signalling nans. 528 /// For vectors, this includes constants with undefined elements. 529 inline cstfp_pred_ty<is_nan> m_NaN() { 530 return cstfp_pred_ty<is_nan>(); 531 } 532 533 struct is_any_zero_fp { 534 bool isValue(const APFloat &C) { return C.isZero(); } 535 }; 536 /// Match a floating-point negative zero or positive zero. 537 /// For vectors, this includes constants with undefined elements. 538 inline cstfp_pred_ty<is_any_zero_fp> m_AnyZeroFP() { 539 return cstfp_pred_ty<is_any_zero_fp>(); 540 } 541 542 struct is_pos_zero_fp { 543 bool isValue(const APFloat &C) { return C.isPosZero(); } 544 }; 545 /// Match a floating-point positive zero. 546 /// For vectors, this includes constants with undefined elements. 547 inline cstfp_pred_ty<is_pos_zero_fp> m_PosZeroFP() { 548 return cstfp_pred_ty<is_pos_zero_fp>(); 549 } 550 551 struct is_neg_zero_fp { 552 bool isValue(const APFloat &C) { return C.isNegZero(); } 553 }; 554 /// Match a floating-point negative zero. 555 /// For vectors, this includes constants with undefined elements. 556 inline cstfp_pred_ty<is_neg_zero_fp> m_NegZeroFP() { 557 return cstfp_pred_ty<is_neg_zero_fp>(); 558 } 559 560 /////////////////////////////////////////////////////////////////////////////// 561 562 template <typename Class> struct bind_ty { 563 Class *&VR; 564 565 bind_ty(Class *&V) : VR(V) {} 566 567 template <typename ITy> bool match(ITy *V) { 568 if (auto *CV = dyn_cast<Class>(V)) { 569 VR = CV; 570 return true; 571 } 572 return false; 573 } 574 }; 575 576 /// Match a value, capturing it if we match. 577 inline bind_ty<Value> m_Value(Value *&V) { return V; } 578 inline bind_ty<const Value> m_Value(const Value *&V) { return V; } 579 580 /// Match an instruction, capturing it if we match. 581 inline bind_ty<Instruction> m_Instruction(Instruction *&I) { return I; } 582 /// Match a binary operator, capturing it if we match. 583 inline bind_ty<BinaryOperator> m_BinOp(BinaryOperator *&I) { return I; } 584 /// Match a with overflow intrinsic, capturing it if we match. 585 inline bind_ty<WithOverflowInst> m_WithOverflowInst(WithOverflowInst *&I) { return I; } 586 587 /// Match a ConstantInt, capturing the value if we match. 588 inline bind_ty<ConstantInt> m_ConstantInt(ConstantInt *&CI) { return CI; } 589 590 /// Match a Constant, capturing the value if we match. 591 inline bind_ty<Constant> m_Constant(Constant *&C) { return C; } 592 593 /// Match a ConstantFP, capturing the value if we match. 594 inline bind_ty<ConstantFP> m_ConstantFP(ConstantFP *&C) { return C; } 595 596 /// Match a basic block value, capturing it if we match. 597 inline bind_ty<BasicBlock> m_BasicBlock(BasicBlock *&V) { return V; } 598 inline bind_ty<const BasicBlock> m_BasicBlock(const BasicBlock *&V) { 599 return V; 600 } 601 602 /// Match a specified Value*. 603 struct specificval_ty { 604 const Value *Val; 605 606 specificval_ty(const Value *V) : Val(V) {} 607 608 template <typename ITy> bool match(ITy *V) { return V == Val; } 609 }; 610 611 /// Match if we have a specific specified value. 612 inline specificval_ty m_Specific(const Value *V) { return V; } 613 614 /// Stores a reference to the Value *, not the Value * itself, 615 /// thus can be used in commutative matchers. 616 template <typename Class> struct deferredval_ty { 617 Class *const &Val; 618 619 deferredval_ty(Class *const &V) : Val(V) {} 620 621 template <typename ITy> bool match(ITy *const V) { return V == Val; } 622 }; 623 624 /// A commutative-friendly version of m_Specific(). 625 inline deferredval_ty<Value> m_Deferred(Value *const &V) { return V; } 626 inline deferredval_ty<const Value> m_Deferred(const Value *const &V) { 627 return V; 628 } 629 630 /// Match a specified floating point value or vector of all elements of 631 /// that value. 632 struct specific_fpval { 633 double Val; 634 635 specific_fpval(double V) : Val(V) {} 636 637 template <typename ITy> bool match(ITy *V) { 638 if (const auto *CFP = dyn_cast<ConstantFP>(V)) 639 return CFP->isExactlyValue(Val); 640 if (V->getType()->isVectorTy()) 641 if (const auto *C = dyn_cast<Constant>(V)) 642 if (auto *CFP = dyn_cast_or_null<ConstantFP>(C->getSplatValue())) 643 return CFP->isExactlyValue(Val); 644 return false; 645 } 646 }; 647 648 /// Match a specific floating point value or vector with all elements 649 /// equal to the value. 650 inline specific_fpval m_SpecificFP(double V) { return specific_fpval(V); } 651 652 /// Match a float 1.0 or vector with all elements equal to 1.0. 653 inline specific_fpval m_FPOne() { return m_SpecificFP(1.0); } 654 655 struct bind_const_intval_ty { 656 uint64_t &VR; 657 658 bind_const_intval_ty(uint64_t &V) : VR(V) {} 659 660 template <typename ITy> bool match(ITy *V) { 661 if (const auto *CV = dyn_cast<ConstantInt>(V)) 662 if (CV->getValue().ule(UINT64_MAX)) { 663 VR = CV->getZExtValue(); 664 return true; 665 } 666 return false; 667 } 668 }; 669 670 /// Match a specified integer value or vector of all elements of that 671 /// value. 672 struct specific_intval { 673 APInt Val; 674 675 specific_intval(APInt V) : Val(std::move(V)) {} 676 677 template <typename ITy> bool match(ITy *V) { 678 const auto *CI = dyn_cast<ConstantInt>(V); 679 if (!CI && V->getType()->isVectorTy()) 680 if (const auto *C = dyn_cast<Constant>(V)) 681 CI = dyn_cast_or_null<ConstantInt>(C->getSplatValue()); 682 683 return CI && APInt::isSameValue(CI->getValue(), Val); 684 } 685 }; 686 687 /// Match a specific integer value or vector with all elements equal to 688 /// the value. 689 inline specific_intval m_SpecificInt(APInt V) { 690 return specific_intval(std::move(V)); 691 } 692 693 inline specific_intval m_SpecificInt(uint64_t V) { 694 return m_SpecificInt(APInt(64, V)); 695 } 696 697 /// Match a ConstantInt and bind to its value. This does not match 698 /// ConstantInts wider than 64-bits. 699 inline bind_const_intval_ty m_ConstantInt(uint64_t &V) { return V; } 700 701 /// Match a specified basic block value. 702 struct specific_bbval { 703 BasicBlock *Val; 704 705 specific_bbval(BasicBlock *Val) : Val(Val) {} 706 707 template <typename ITy> bool match(ITy *V) { 708 const auto *BB = dyn_cast<BasicBlock>(V); 709 return BB && BB == Val; 710 } 711 }; 712 713 /// Match a specific basic block value. 714 inline specific_bbval m_SpecificBB(BasicBlock *BB) { 715 return specific_bbval(BB); 716 } 717 718 /// A commutative-friendly version of m_Specific(). 719 inline deferredval_ty<BasicBlock> m_Deferred(BasicBlock *const &BB) { 720 return BB; 721 } 722 inline deferredval_ty<const BasicBlock> 723 m_Deferred(const BasicBlock *const &BB) { 724 return BB; 725 } 726 727 //===----------------------------------------------------------------------===// 728 // Matcher for any binary operator. 729 // 730 template <typename LHS_t, typename RHS_t, bool Commutable = false> 731 struct AnyBinaryOp_match { 732 LHS_t L; 733 RHS_t R; 734 735 // The evaluation order is always stable, regardless of Commutability. 736 // The LHS is always matched first. 737 AnyBinaryOp_match(const LHS_t &LHS, const RHS_t &RHS) : L(LHS), R(RHS) {} 738 739 template <typename OpTy> bool match(OpTy *V) { 740 if (auto *I = dyn_cast<BinaryOperator>(V)) 741 return (L.match(I->getOperand(0)) && R.match(I->getOperand(1))) || 742 (Commutable && L.match(I->getOperand(1)) && 743 R.match(I->getOperand(0))); 744 return false; 745 } 746 }; 747 748 template <typename LHS, typename RHS> 749 inline AnyBinaryOp_match<LHS, RHS> m_BinOp(const LHS &L, const RHS &R) { 750 return AnyBinaryOp_match<LHS, RHS>(L, R); 751 } 752 753 //===----------------------------------------------------------------------===// 754 // Matchers for specific binary operators. 755 // 756 757 template <typename LHS_t, typename RHS_t, unsigned Opcode, 758 bool Commutable = false> 759 struct BinaryOp_match { 760 LHS_t L; 761 RHS_t R; 762 763 // The evaluation order is always stable, regardless of Commutability. 764 // The LHS is always matched first. 765 BinaryOp_match(const LHS_t &LHS, const RHS_t &RHS) : L(LHS), R(RHS) {} 766 767 template <typename OpTy> bool match(OpTy *V) { 768 if (V->getValueID() == Value::InstructionVal + Opcode) { 769 auto *I = cast<BinaryOperator>(V); 770 return (L.match(I->getOperand(0)) && R.match(I->getOperand(1))) || 771 (Commutable && L.match(I->getOperand(1)) && 772 R.match(I->getOperand(0))); 773 } 774 if (auto *CE = dyn_cast<ConstantExpr>(V)) 775 return CE->getOpcode() == Opcode && 776 ((L.match(CE->getOperand(0)) && R.match(CE->getOperand(1))) || 777 (Commutable && L.match(CE->getOperand(1)) && 778 R.match(CE->getOperand(0)))); 779 return false; 780 } 781 }; 782 783 template <typename LHS, typename RHS> 784 inline BinaryOp_match<LHS, RHS, Instruction::Add> m_Add(const LHS &L, 785 const RHS &R) { 786 return BinaryOp_match<LHS, RHS, Instruction::Add>(L, R); 787 } 788 789 template <typename LHS, typename RHS> 790 inline BinaryOp_match<LHS, RHS, Instruction::FAdd> m_FAdd(const LHS &L, 791 const RHS &R) { 792 return BinaryOp_match<LHS, RHS, Instruction::FAdd>(L, R); 793 } 794 795 template <typename LHS, typename RHS> 796 inline BinaryOp_match<LHS, RHS, Instruction::Sub> m_Sub(const LHS &L, 797 const RHS &R) { 798 return BinaryOp_match<LHS, RHS, Instruction::Sub>(L, R); 799 } 800 801 template <typename LHS, typename RHS> 802 inline BinaryOp_match<LHS, RHS, Instruction::FSub> m_FSub(const LHS &L, 803 const RHS &R) { 804 return BinaryOp_match<LHS, RHS, Instruction::FSub>(L, R); 805 } 806 807 template <typename Op_t> struct FNeg_match { 808 Op_t X; 809 810 FNeg_match(const Op_t &Op) : X(Op) {} 811 template <typename OpTy> bool match(OpTy *V) { 812 auto *FPMO = dyn_cast<FPMathOperator>(V); 813 if (!FPMO) return false; 814 815 if (FPMO->getOpcode() == Instruction::FNeg) 816 return X.match(FPMO->getOperand(0)); 817 818 if (FPMO->getOpcode() == Instruction::FSub) { 819 if (FPMO->hasNoSignedZeros()) { 820 // With 'nsz', any zero goes. 821 if (!cstfp_pred_ty<is_any_zero_fp>().match(FPMO->getOperand(0))) 822 return false; 823 } else { 824 // Without 'nsz', we need fsub -0.0, X exactly. 825 if (!cstfp_pred_ty<is_neg_zero_fp>().match(FPMO->getOperand(0))) 826 return false; 827 } 828 829 return X.match(FPMO->getOperand(1)); 830 } 831 832 return false; 833 } 834 }; 835 836 /// Match 'fneg X' as 'fsub -0.0, X'. 837 template <typename OpTy> 838 inline FNeg_match<OpTy> 839 m_FNeg(const OpTy &X) { 840 return FNeg_match<OpTy>(X); 841 } 842 843 /// Match 'fneg X' as 'fsub +-0.0, X'. 844 template <typename RHS> 845 inline BinaryOp_match<cstfp_pred_ty<is_any_zero_fp>, RHS, Instruction::FSub> 846 m_FNegNSZ(const RHS &X) { 847 return m_FSub(m_AnyZeroFP(), X); 848 } 849 850 template <typename LHS, typename RHS> 851 inline BinaryOp_match<LHS, RHS, Instruction::Mul> m_Mul(const LHS &L, 852 const RHS &R) { 853 return BinaryOp_match<LHS, RHS, Instruction::Mul>(L, R); 854 } 855 856 template <typename LHS, typename RHS> 857 inline BinaryOp_match<LHS, RHS, Instruction::FMul> m_FMul(const LHS &L, 858 const RHS &R) { 859 return BinaryOp_match<LHS, RHS, Instruction::FMul>(L, R); 860 } 861 862 template <typename LHS, typename RHS> 863 inline BinaryOp_match<LHS, RHS, Instruction::UDiv> m_UDiv(const LHS &L, 864 const RHS &R) { 865 return BinaryOp_match<LHS, RHS, Instruction::UDiv>(L, R); 866 } 867 868 template <typename LHS, typename RHS> 869 inline BinaryOp_match<LHS, RHS, Instruction::SDiv> m_SDiv(const LHS &L, 870 const RHS &R) { 871 return BinaryOp_match<LHS, RHS, Instruction::SDiv>(L, R); 872 } 873 874 template <typename LHS, typename RHS> 875 inline BinaryOp_match<LHS, RHS, Instruction::FDiv> m_FDiv(const LHS &L, 876 const RHS &R) { 877 return BinaryOp_match<LHS, RHS, Instruction::FDiv>(L, R); 878 } 879 880 template <typename LHS, typename RHS> 881 inline BinaryOp_match<LHS, RHS, Instruction::URem> m_URem(const LHS &L, 882 const RHS &R) { 883 return BinaryOp_match<LHS, RHS, Instruction::URem>(L, R); 884 } 885 886 template <typename LHS, typename RHS> 887 inline BinaryOp_match<LHS, RHS, Instruction::SRem> m_SRem(const LHS &L, 888 const RHS &R) { 889 return BinaryOp_match<LHS, RHS, Instruction::SRem>(L, R); 890 } 891 892 template <typename LHS, typename RHS> 893 inline BinaryOp_match<LHS, RHS, Instruction::FRem> m_FRem(const LHS &L, 894 const RHS &R) { 895 return BinaryOp_match<LHS, RHS, Instruction::FRem>(L, R); 896 } 897 898 template <typename LHS, typename RHS> 899 inline BinaryOp_match<LHS, RHS, Instruction::And> m_And(const LHS &L, 900 const RHS &R) { 901 return BinaryOp_match<LHS, RHS, Instruction::And>(L, R); 902 } 903 904 template <typename LHS, typename RHS> 905 inline BinaryOp_match<LHS, RHS, Instruction::Or> m_Or(const LHS &L, 906 const RHS &R) { 907 return BinaryOp_match<LHS, RHS, Instruction::Or>(L, R); 908 } 909 910 template <typename LHS, typename RHS> 911 inline BinaryOp_match<LHS, RHS, Instruction::Xor> m_Xor(const LHS &L, 912 const RHS &R) { 913 return BinaryOp_match<LHS, RHS, Instruction::Xor>(L, R); 914 } 915 916 template <typename LHS, typename RHS> 917 inline BinaryOp_match<LHS, RHS, Instruction::Shl> m_Shl(const LHS &L, 918 const RHS &R) { 919 return BinaryOp_match<LHS, RHS, Instruction::Shl>(L, R); 920 } 921 922 template <typename LHS, typename RHS> 923 inline BinaryOp_match<LHS, RHS, Instruction::LShr> m_LShr(const LHS &L, 924 const RHS &R) { 925 return BinaryOp_match<LHS, RHS, Instruction::LShr>(L, R); 926 } 927 928 template <typename LHS, typename RHS> 929 inline BinaryOp_match<LHS, RHS, Instruction::AShr> m_AShr(const LHS &L, 930 const RHS &R) { 931 return BinaryOp_match<LHS, RHS, Instruction::AShr>(L, R); 932 } 933 934 template <typename LHS_t, typename RHS_t, unsigned Opcode, 935 unsigned WrapFlags = 0> 936 struct OverflowingBinaryOp_match { 937 LHS_t L; 938 RHS_t R; 939 940 OverflowingBinaryOp_match(const LHS_t &LHS, const RHS_t &RHS) 941 : L(LHS), R(RHS) {} 942 943 template <typename OpTy> bool match(OpTy *V) { 944 if (auto *Op = dyn_cast<OverflowingBinaryOperator>(V)) { 945 if (Op->getOpcode() != Opcode) 946 return false; 947 if (WrapFlags & OverflowingBinaryOperator::NoUnsignedWrap && 948 !Op->hasNoUnsignedWrap()) 949 return false; 950 if (WrapFlags & OverflowingBinaryOperator::NoSignedWrap && 951 !Op->hasNoSignedWrap()) 952 return false; 953 return L.match(Op->getOperand(0)) && R.match(Op->getOperand(1)); 954 } 955 return false; 956 } 957 }; 958 959 template <typename LHS, typename RHS> 960 inline OverflowingBinaryOp_match<LHS, RHS, Instruction::Add, 961 OverflowingBinaryOperator::NoSignedWrap> 962 m_NSWAdd(const LHS &L, const RHS &R) { 963 return OverflowingBinaryOp_match<LHS, RHS, Instruction::Add, 964 OverflowingBinaryOperator::NoSignedWrap>( 965 L, R); 966 } 967 template <typename LHS, typename RHS> 968 inline OverflowingBinaryOp_match<LHS, RHS, Instruction::Sub, 969 OverflowingBinaryOperator::NoSignedWrap> 970 m_NSWSub(const LHS &L, const RHS &R) { 971 return OverflowingBinaryOp_match<LHS, RHS, Instruction::Sub, 972 OverflowingBinaryOperator::NoSignedWrap>( 973 L, R); 974 } 975 template <typename LHS, typename RHS> 976 inline OverflowingBinaryOp_match<LHS, RHS, Instruction::Mul, 977 OverflowingBinaryOperator::NoSignedWrap> 978 m_NSWMul(const LHS &L, const RHS &R) { 979 return OverflowingBinaryOp_match<LHS, RHS, Instruction::Mul, 980 OverflowingBinaryOperator::NoSignedWrap>( 981 L, R); 982 } 983 template <typename LHS, typename RHS> 984 inline OverflowingBinaryOp_match<LHS, RHS, Instruction::Shl, 985 OverflowingBinaryOperator::NoSignedWrap> 986 m_NSWShl(const LHS &L, const RHS &R) { 987 return OverflowingBinaryOp_match<LHS, RHS, Instruction::Shl, 988 OverflowingBinaryOperator::NoSignedWrap>( 989 L, R); 990 } 991 992 template <typename LHS, typename RHS> 993 inline OverflowingBinaryOp_match<LHS, RHS, Instruction::Add, 994 OverflowingBinaryOperator::NoUnsignedWrap> 995 m_NUWAdd(const LHS &L, const RHS &R) { 996 return OverflowingBinaryOp_match<LHS, RHS, Instruction::Add, 997 OverflowingBinaryOperator::NoUnsignedWrap>( 998 L, R); 999 } 1000 template <typename LHS, typename RHS> 1001 inline OverflowingBinaryOp_match<LHS, RHS, Instruction::Sub, 1002 OverflowingBinaryOperator::NoUnsignedWrap> 1003 m_NUWSub(const LHS &L, const RHS &R) { 1004 return OverflowingBinaryOp_match<LHS, RHS, Instruction::Sub, 1005 OverflowingBinaryOperator::NoUnsignedWrap>( 1006 L, R); 1007 } 1008 template <typename LHS, typename RHS> 1009 inline OverflowingBinaryOp_match<LHS, RHS, Instruction::Mul, 1010 OverflowingBinaryOperator::NoUnsignedWrap> 1011 m_NUWMul(const LHS &L, const RHS &R) { 1012 return OverflowingBinaryOp_match<LHS, RHS, Instruction::Mul, 1013 OverflowingBinaryOperator::NoUnsignedWrap>( 1014 L, R); 1015 } 1016 template <typename LHS, typename RHS> 1017 inline OverflowingBinaryOp_match<LHS, RHS, Instruction::Shl, 1018 OverflowingBinaryOperator::NoUnsignedWrap> 1019 m_NUWShl(const LHS &L, const RHS &R) { 1020 return OverflowingBinaryOp_match<LHS, RHS, Instruction::Shl, 1021 OverflowingBinaryOperator::NoUnsignedWrap>( 1022 L, R); 1023 } 1024 1025 //===----------------------------------------------------------------------===// 1026 // Class that matches a group of binary opcodes. 1027 // 1028 template <typename LHS_t, typename RHS_t, typename Predicate> 1029 struct BinOpPred_match : Predicate { 1030 LHS_t L; 1031 RHS_t R; 1032 1033 BinOpPred_match(const LHS_t &LHS, const RHS_t &RHS) : L(LHS), R(RHS) {} 1034 1035 template <typename OpTy> bool match(OpTy *V) { 1036 if (auto *I = dyn_cast<Instruction>(V)) 1037 return this->isOpType(I->getOpcode()) && L.match(I->getOperand(0)) && 1038 R.match(I->getOperand(1)); 1039 if (auto *CE = dyn_cast<ConstantExpr>(V)) 1040 return this->isOpType(CE->getOpcode()) && L.match(CE->getOperand(0)) && 1041 R.match(CE->getOperand(1)); 1042 return false; 1043 } 1044 }; 1045 1046 struct is_shift_op { 1047 bool isOpType(unsigned Opcode) { return Instruction::isShift(Opcode); } 1048 }; 1049 1050 struct is_right_shift_op { 1051 bool isOpType(unsigned Opcode) { 1052 return Opcode == Instruction::LShr || Opcode == Instruction::AShr; 1053 } 1054 }; 1055 1056 struct is_logical_shift_op { 1057 bool isOpType(unsigned Opcode) { 1058 return Opcode == Instruction::LShr || Opcode == Instruction::Shl; 1059 } 1060 }; 1061 1062 struct is_bitwiselogic_op { 1063 bool isOpType(unsigned Opcode) { 1064 return Instruction::isBitwiseLogicOp(Opcode); 1065 } 1066 }; 1067 1068 struct is_idiv_op { 1069 bool isOpType(unsigned Opcode) { 1070 return Opcode == Instruction::SDiv || Opcode == Instruction::UDiv; 1071 } 1072 }; 1073 1074 struct is_irem_op { 1075 bool isOpType(unsigned Opcode) { 1076 return Opcode == Instruction::SRem || Opcode == Instruction::URem; 1077 } 1078 }; 1079 1080 /// Matches shift operations. 1081 template <typename LHS, typename RHS> 1082 inline BinOpPred_match<LHS, RHS, is_shift_op> m_Shift(const LHS &L, 1083 const RHS &R) { 1084 return BinOpPred_match<LHS, RHS, is_shift_op>(L, R); 1085 } 1086 1087 /// Matches logical shift operations. 1088 template <typename LHS, typename RHS> 1089 inline BinOpPred_match<LHS, RHS, is_right_shift_op> m_Shr(const LHS &L, 1090 const RHS &R) { 1091 return BinOpPred_match<LHS, RHS, is_right_shift_op>(L, R); 1092 } 1093 1094 /// Matches logical shift operations. 1095 template <typename LHS, typename RHS> 1096 inline BinOpPred_match<LHS, RHS, is_logical_shift_op> 1097 m_LogicalShift(const LHS &L, const RHS &R) { 1098 return BinOpPred_match<LHS, RHS, is_logical_shift_op>(L, R); 1099 } 1100 1101 /// Matches bitwise logic operations. 1102 template <typename LHS, typename RHS> 1103 inline BinOpPred_match<LHS, RHS, is_bitwiselogic_op> 1104 m_BitwiseLogic(const LHS &L, const RHS &R) { 1105 return BinOpPred_match<LHS, RHS, is_bitwiselogic_op>(L, R); 1106 } 1107 1108 /// Matches integer division operations. 1109 template <typename LHS, typename RHS> 1110 inline BinOpPred_match<LHS, RHS, is_idiv_op> m_IDiv(const LHS &L, 1111 const RHS &R) { 1112 return BinOpPred_match<LHS, RHS, is_idiv_op>(L, R); 1113 } 1114 1115 /// Matches integer remainder operations. 1116 template <typename LHS, typename RHS> 1117 inline BinOpPred_match<LHS, RHS, is_irem_op> m_IRem(const LHS &L, 1118 const RHS &R) { 1119 return BinOpPred_match<LHS, RHS, is_irem_op>(L, R); 1120 } 1121 1122 //===----------------------------------------------------------------------===// 1123 // Class that matches exact binary ops. 1124 // 1125 template <typename SubPattern_t> struct Exact_match { 1126 SubPattern_t SubPattern; 1127 1128 Exact_match(const SubPattern_t &SP) : SubPattern(SP) {} 1129 1130 template <typename OpTy> bool match(OpTy *V) { 1131 if (auto *PEO = dyn_cast<PossiblyExactOperator>(V)) 1132 return PEO->isExact() && SubPattern.match(V); 1133 return false; 1134 } 1135 }; 1136 1137 template <typename T> inline Exact_match<T> m_Exact(const T &SubPattern) { 1138 return SubPattern; 1139 } 1140 1141 //===----------------------------------------------------------------------===// 1142 // Matchers for CmpInst classes 1143 // 1144 1145 template <typename LHS_t, typename RHS_t, typename Class, typename PredicateTy, 1146 bool Commutable = false> 1147 struct CmpClass_match { 1148 PredicateTy &Predicate; 1149 LHS_t L; 1150 RHS_t R; 1151 1152 // The evaluation order is always stable, regardless of Commutability. 1153 // The LHS is always matched first. 1154 CmpClass_match(PredicateTy &Pred, const LHS_t &LHS, const RHS_t &RHS) 1155 : Predicate(Pred), L(LHS), R(RHS) {} 1156 1157 template <typename OpTy> bool match(OpTy *V) { 1158 if (auto *I = dyn_cast<Class>(V)) 1159 if ((L.match(I->getOperand(0)) && R.match(I->getOperand(1))) || 1160 (Commutable && L.match(I->getOperand(1)) && 1161 R.match(I->getOperand(0)))) { 1162 Predicate = I->getPredicate(); 1163 return true; 1164 } 1165 return false; 1166 } 1167 }; 1168 1169 template <typename LHS, typename RHS> 1170 inline CmpClass_match<LHS, RHS, CmpInst, CmpInst::Predicate> 1171 m_Cmp(CmpInst::Predicate &Pred, const LHS &L, const RHS &R) { 1172 return CmpClass_match<LHS, RHS, CmpInst, CmpInst::Predicate>(Pred, L, R); 1173 } 1174 1175 template <typename LHS, typename RHS> 1176 inline CmpClass_match<LHS, RHS, ICmpInst, ICmpInst::Predicate> 1177 m_ICmp(ICmpInst::Predicate &Pred, const LHS &L, const RHS &R) { 1178 return CmpClass_match<LHS, RHS, ICmpInst, ICmpInst::Predicate>(Pred, L, R); 1179 } 1180 1181 template <typename LHS, typename RHS> 1182 inline CmpClass_match<LHS, RHS, FCmpInst, FCmpInst::Predicate> 1183 m_FCmp(FCmpInst::Predicate &Pred, const LHS &L, const RHS &R) { 1184 return CmpClass_match<LHS, RHS, FCmpInst, FCmpInst::Predicate>(Pred, L, R); 1185 } 1186 1187 //===----------------------------------------------------------------------===// 1188 // Matchers for instructions with a given opcode and number of operands. 1189 // 1190 1191 /// Matches instructions with Opcode and three operands. 1192 template <typename T0, unsigned Opcode> struct OneOps_match { 1193 T0 Op1; 1194 1195 OneOps_match(const T0 &Op1) : Op1(Op1) {} 1196 1197 template <typename OpTy> bool match(OpTy *V) { 1198 if (V->getValueID() == Value::InstructionVal + Opcode) { 1199 auto *I = cast<Instruction>(V); 1200 return Op1.match(I->getOperand(0)); 1201 } 1202 return false; 1203 } 1204 }; 1205 1206 /// Matches instructions with Opcode and three operands. 1207 template <typename T0, typename T1, unsigned Opcode> struct TwoOps_match { 1208 T0 Op1; 1209 T1 Op2; 1210 1211 TwoOps_match(const T0 &Op1, const T1 &Op2) : Op1(Op1), Op2(Op2) {} 1212 1213 template <typename OpTy> bool match(OpTy *V) { 1214 if (V->getValueID() == Value::InstructionVal + Opcode) { 1215 auto *I = cast<Instruction>(V); 1216 return Op1.match(I->getOperand(0)) && Op2.match(I->getOperand(1)); 1217 } 1218 return false; 1219 } 1220 }; 1221 1222 /// Matches instructions with Opcode and three operands. 1223 template <typename T0, typename T1, typename T2, unsigned Opcode> 1224 struct ThreeOps_match { 1225 T0 Op1; 1226 T1 Op2; 1227 T2 Op3; 1228 1229 ThreeOps_match(const T0 &Op1, const T1 &Op2, const T2 &Op3) 1230 : Op1(Op1), Op2(Op2), Op3(Op3) {} 1231 1232 template <typename OpTy> bool match(OpTy *V) { 1233 if (V->getValueID() == Value::InstructionVal + Opcode) { 1234 auto *I = cast<Instruction>(V); 1235 return Op1.match(I->getOperand(0)) && Op2.match(I->getOperand(1)) && 1236 Op3.match(I->getOperand(2)); 1237 } 1238 return false; 1239 } 1240 }; 1241 1242 /// Matches SelectInst. 1243 template <typename Cond, typename LHS, typename RHS> 1244 inline ThreeOps_match<Cond, LHS, RHS, Instruction::Select> 1245 m_Select(const Cond &C, const LHS &L, const RHS &R) { 1246 return ThreeOps_match<Cond, LHS, RHS, Instruction::Select>(C, L, R); 1247 } 1248 1249 /// This matches a select of two constants, e.g.: 1250 /// m_SelectCst<-1, 0>(m_Value(V)) 1251 template <int64_t L, int64_t R, typename Cond> 1252 inline ThreeOps_match<Cond, constantint_match<L>, constantint_match<R>, 1253 Instruction::Select> 1254 m_SelectCst(const Cond &C) { 1255 return m_Select(C, m_ConstantInt<L>(), m_ConstantInt<R>()); 1256 } 1257 1258 /// Matches FreezeInst. 1259 template <typename OpTy> 1260 inline OneOps_match<OpTy, Instruction::Freeze> m_Freeze(const OpTy &Op) { 1261 return OneOps_match<OpTy, Instruction::Freeze>(Op); 1262 } 1263 1264 /// Matches InsertElementInst. 1265 template <typename Val_t, typename Elt_t, typename Idx_t> 1266 inline ThreeOps_match<Val_t, Elt_t, Idx_t, Instruction::InsertElement> 1267 m_InsertElement(const Val_t &Val, const Elt_t &Elt, const Idx_t &Idx) { 1268 return ThreeOps_match<Val_t, Elt_t, Idx_t, Instruction::InsertElement>( 1269 Val, Elt, Idx); 1270 } 1271 1272 /// Matches ExtractElementInst. 1273 template <typename Val_t, typename Idx_t> 1274 inline TwoOps_match<Val_t, Idx_t, Instruction::ExtractElement> 1275 m_ExtractElement(const Val_t &Val, const Idx_t &Idx) { 1276 return TwoOps_match<Val_t, Idx_t, Instruction::ExtractElement>(Val, Idx); 1277 } 1278 1279 /// Matches ShuffleVectorInst. 1280 template <typename V1_t, typename V2_t, typename Mask_t> 1281 inline ThreeOps_match<V1_t, V2_t, Mask_t, Instruction::ShuffleVector> 1282 m_ShuffleVector(const V1_t &v1, const V2_t &v2, const Mask_t &m) { 1283 return ThreeOps_match<V1_t, V2_t, Mask_t, Instruction::ShuffleVector>(v1, v2, 1284 m); 1285 } 1286 1287 /// Matches LoadInst. 1288 template <typename OpTy> 1289 inline OneOps_match<OpTy, Instruction::Load> m_Load(const OpTy &Op) { 1290 return OneOps_match<OpTy, Instruction::Load>(Op); 1291 } 1292 1293 /// Matches StoreInst. 1294 template <typename ValueOpTy, typename PointerOpTy> 1295 inline TwoOps_match<ValueOpTy, PointerOpTy, Instruction::Store> 1296 m_Store(const ValueOpTy &ValueOp, const PointerOpTy &PointerOp) { 1297 return TwoOps_match<ValueOpTy, PointerOpTy, Instruction::Store>(ValueOp, 1298 PointerOp); 1299 } 1300 1301 //===----------------------------------------------------------------------===// 1302 // Matchers for CastInst classes 1303 // 1304 1305 template <typename Op_t, unsigned Opcode> struct CastClass_match { 1306 Op_t Op; 1307 1308 CastClass_match(const Op_t &OpMatch) : Op(OpMatch) {} 1309 1310 template <typename OpTy> bool match(OpTy *V) { 1311 if (auto *O = dyn_cast<Operator>(V)) 1312 return O->getOpcode() == Opcode && Op.match(O->getOperand(0)); 1313 return false; 1314 } 1315 }; 1316 1317 /// Matches BitCast. 1318 template <typename OpTy> 1319 inline CastClass_match<OpTy, Instruction::BitCast> m_BitCast(const OpTy &Op) { 1320 return CastClass_match<OpTy, Instruction::BitCast>(Op); 1321 } 1322 1323 /// Matches PtrToInt. 1324 template <typename OpTy> 1325 inline CastClass_match<OpTy, Instruction::PtrToInt> m_PtrToInt(const OpTy &Op) { 1326 return CastClass_match<OpTy, Instruction::PtrToInt>(Op); 1327 } 1328 1329 /// Matches Trunc. 1330 template <typename OpTy> 1331 inline CastClass_match<OpTy, Instruction::Trunc> m_Trunc(const OpTy &Op) { 1332 return CastClass_match<OpTy, Instruction::Trunc>(Op); 1333 } 1334 1335 template <typename OpTy> 1336 inline match_combine_or<CastClass_match<OpTy, Instruction::Trunc>, OpTy> 1337 m_TruncOrSelf(const OpTy &Op) { 1338 return m_CombineOr(m_Trunc(Op), Op); 1339 } 1340 1341 /// Matches SExt. 1342 template <typename OpTy> 1343 inline CastClass_match<OpTy, Instruction::SExt> m_SExt(const OpTy &Op) { 1344 return CastClass_match<OpTy, Instruction::SExt>(Op); 1345 } 1346 1347 /// Matches ZExt. 1348 template <typename OpTy> 1349 inline CastClass_match<OpTy, Instruction::ZExt> m_ZExt(const OpTy &Op) { 1350 return CastClass_match<OpTy, Instruction::ZExt>(Op); 1351 } 1352 1353 template <typename OpTy> 1354 inline match_combine_or<CastClass_match<OpTy, Instruction::ZExt>, OpTy> 1355 m_ZExtOrSelf(const OpTy &Op) { 1356 return m_CombineOr(m_ZExt(Op), Op); 1357 } 1358 1359 template <typename OpTy> 1360 inline match_combine_or<CastClass_match<OpTy, Instruction::SExt>, OpTy> 1361 m_SExtOrSelf(const OpTy &Op) { 1362 return m_CombineOr(m_SExt(Op), Op); 1363 } 1364 1365 template <typename OpTy> 1366 inline match_combine_or<CastClass_match<OpTy, Instruction::ZExt>, 1367 CastClass_match<OpTy, Instruction::SExt>> 1368 m_ZExtOrSExt(const OpTy &Op) { 1369 return m_CombineOr(m_ZExt(Op), m_SExt(Op)); 1370 } 1371 1372 template <typename OpTy> 1373 inline match_combine_or< 1374 match_combine_or<CastClass_match<OpTy, Instruction::ZExt>, 1375 CastClass_match<OpTy, Instruction::SExt>>, 1376 OpTy> 1377 m_ZExtOrSExtOrSelf(const OpTy &Op) { 1378 return m_CombineOr(m_ZExtOrSExt(Op), Op); 1379 } 1380 1381 /// Matches UIToFP. 1382 template <typename OpTy> 1383 inline CastClass_match<OpTy, Instruction::UIToFP> m_UIToFP(const OpTy &Op) { 1384 return CastClass_match<OpTy, Instruction::UIToFP>(Op); 1385 } 1386 1387 /// Matches SIToFP. 1388 template <typename OpTy> 1389 inline CastClass_match<OpTy, Instruction::SIToFP> m_SIToFP(const OpTy &Op) { 1390 return CastClass_match<OpTy, Instruction::SIToFP>(Op); 1391 } 1392 1393 /// Matches FPTrunc 1394 template <typename OpTy> 1395 inline CastClass_match<OpTy, Instruction::FPTrunc> m_FPTrunc(const OpTy &Op) { 1396 return CastClass_match<OpTy, Instruction::FPTrunc>(Op); 1397 } 1398 1399 /// Matches FPExt 1400 template <typename OpTy> 1401 inline CastClass_match<OpTy, Instruction::FPExt> m_FPExt(const OpTy &Op) { 1402 return CastClass_match<OpTy, Instruction::FPExt>(Op); 1403 } 1404 1405 //===----------------------------------------------------------------------===// 1406 // Matchers for control flow. 1407 // 1408 1409 struct br_match { 1410 BasicBlock *&Succ; 1411 1412 br_match(BasicBlock *&Succ) : Succ(Succ) {} 1413 1414 template <typename OpTy> bool match(OpTy *V) { 1415 if (auto *BI = dyn_cast<BranchInst>(V)) 1416 if (BI->isUnconditional()) { 1417 Succ = BI->getSuccessor(0); 1418 return true; 1419 } 1420 return false; 1421 } 1422 }; 1423 1424 inline br_match m_UnconditionalBr(BasicBlock *&Succ) { return br_match(Succ); } 1425 1426 template <typename Cond_t, typename TrueBlock_t, typename FalseBlock_t> 1427 struct brc_match { 1428 Cond_t Cond; 1429 TrueBlock_t T; 1430 FalseBlock_t F; 1431 1432 brc_match(const Cond_t &C, const TrueBlock_t &t, const FalseBlock_t &f) 1433 : Cond(C), T(t), F(f) {} 1434 1435 template <typename OpTy> bool match(OpTy *V) { 1436 if (auto *BI = dyn_cast<BranchInst>(V)) 1437 if (BI->isConditional() && Cond.match(BI->getCondition())) 1438 return T.match(BI->getSuccessor(0)) && F.match(BI->getSuccessor(1)); 1439 return false; 1440 } 1441 }; 1442 1443 template <typename Cond_t> 1444 inline brc_match<Cond_t, bind_ty<BasicBlock>, bind_ty<BasicBlock>> 1445 m_Br(const Cond_t &C, BasicBlock *&T, BasicBlock *&F) { 1446 return brc_match<Cond_t, bind_ty<BasicBlock>, bind_ty<BasicBlock>>( 1447 C, m_BasicBlock(T), m_BasicBlock(F)); 1448 } 1449 1450 template <typename Cond_t, typename TrueBlock_t, typename FalseBlock_t> 1451 inline brc_match<Cond_t, TrueBlock_t, FalseBlock_t> 1452 m_Br(const Cond_t &C, const TrueBlock_t &T, const FalseBlock_t &F) { 1453 return brc_match<Cond_t, TrueBlock_t, FalseBlock_t>(C, T, F); 1454 } 1455 1456 //===----------------------------------------------------------------------===// 1457 // Matchers for max/min idioms, eg: "select (sgt x, y), x, y" -> smax(x,y). 1458 // 1459 1460 template <typename CmpInst_t, typename LHS_t, typename RHS_t, typename Pred_t, 1461 bool Commutable = false> 1462 struct MaxMin_match { 1463 LHS_t L; 1464 RHS_t R; 1465 1466 // The evaluation order is always stable, regardless of Commutability. 1467 // The LHS is always matched first. 1468 MaxMin_match(const LHS_t &LHS, const RHS_t &RHS) : L(LHS), R(RHS) {} 1469 1470 template <typename OpTy> bool match(OpTy *V) { 1471 // Look for "(x pred y) ? x : y" or "(x pred y) ? y : x". 1472 auto *SI = dyn_cast<SelectInst>(V); 1473 if (!SI) 1474 return false; 1475 auto *Cmp = dyn_cast<CmpInst_t>(SI->getCondition()); 1476 if (!Cmp) 1477 return false; 1478 // At this point we have a select conditioned on a comparison. Check that 1479 // it is the values returned by the select that are being compared. 1480 Value *TrueVal = SI->getTrueValue(); 1481 Value *FalseVal = SI->getFalseValue(); 1482 Value *LHS = Cmp->getOperand(0); 1483 Value *RHS = Cmp->getOperand(1); 1484 if ((TrueVal != LHS || FalseVal != RHS) && 1485 (TrueVal != RHS || FalseVal != LHS)) 1486 return false; 1487 typename CmpInst_t::Predicate Pred = 1488 LHS == TrueVal ? Cmp->getPredicate() : Cmp->getInversePredicate(); 1489 // Does "(x pred y) ? x : y" represent the desired max/min operation? 1490 if (!Pred_t::match(Pred)) 1491 return false; 1492 // It does! Bind the operands. 1493 return (L.match(LHS) && R.match(RHS)) || 1494 (Commutable && L.match(RHS) && R.match(LHS)); 1495 } 1496 }; 1497 1498 /// Helper class for identifying signed max predicates. 1499 struct smax_pred_ty { 1500 static bool match(ICmpInst::Predicate Pred) { 1501 return Pred == CmpInst::ICMP_SGT || Pred == CmpInst::ICMP_SGE; 1502 } 1503 }; 1504 1505 /// Helper class for identifying signed min predicates. 1506 struct smin_pred_ty { 1507 static bool match(ICmpInst::Predicate Pred) { 1508 return Pred == CmpInst::ICMP_SLT || Pred == CmpInst::ICMP_SLE; 1509 } 1510 }; 1511 1512 /// Helper class for identifying unsigned max predicates. 1513 struct umax_pred_ty { 1514 static bool match(ICmpInst::Predicate Pred) { 1515 return Pred == CmpInst::ICMP_UGT || Pred == CmpInst::ICMP_UGE; 1516 } 1517 }; 1518 1519 /// Helper class for identifying unsigned min predicates. 1520 struct umin_pred_ty { 1521 static bool match(ICmpInst::Predicate Pred) { 1522 return Pred == CmpInst::ICMP_ULT || Pred == CmpInst::ICMP_ULE; 1523 } 1524 }; 1525 1526 /// Helper class for identifying ordered max predicates. 1527 struct ofmax_pred_ty { 1528 static bool match(FCmpInst::Predicate Pred) { 1529 return Pred == CmpInst::FCMP_OGT || Pred == CmpInst::FCMP_OGE; 1530 } 1531 }; 1532 1533 /// Helper class for identifying ordered min predicates. 1534 struct ofmin_pred_ty { 1535 static bool match(FCmpInst::Predicate Pred) { 1536 return Pred == CmpInst::FCMP_OLT || Pred == CmpInst::FCMP_OLE; 1537 } 1538 }; 1539 1540 /// Helper class for identifying unordered max predicates. 1541 struct ufmax_pred_ty { 1542 static bool match(FCmpInst::Predicate Pred) { 1543 return Pred == CmpInst::FCMP_UGT || Pred == CmpInst::FCMP_UGE; 1544 } 1545 }; 1546 1547 /// Helper class for identifying unordered min predicates. 1548 struct ufmin_pred_ty { 1549 static bool match(FCmpInst::Predicate Pred) { 1550 return Pred == CmpInst::FCMP_ULT || Pred == CmpInst::FCMP_ULE; 1551 } 1552 }; 1553 1554 template <typename LHS, typename RHS> 1555 inline MaxMin_match<ICmpInst, LHS, RHS, smax_pred_ty> m_SMax(const LHS &L, 1556 const RHS &R) { 1557 return MaxMin_match<ICmpInst, LHS, RHS, smax_pred_ty>(L, R); 1558 } 1559 1560 template <typename LHS, typename RHS> 1561 inline MaxMin_match<ICmpInst, LHS, RHS, smin_pred_ty> m_SMin(const LHS &L, 1562 const RHS &R) { 1563 return MaxMin_match<ICmpInst, LHS, RHS, smin_pred_ty>(L, R); 1564 } 1565 1566 template <typename LHS, typename RHS> 1567 inline MaxMin_match<ICmpInst, LHS, RHS, umax_pred_ty> m_UMax(const LHS &L, 1568 const RHS &R) { 1569 return MaxMin_match<ICmpInst, LHS, RHS, umax_pred_ty>(L, R); 1570 } 1571 1572 template <typename LHS, typename RHS> 1573 inline MaxMin_match<ICmpInst, LHS, RHS, umin_pred_ty> m_UMin(const LHS &L, 1574 const RHS &R) { 1575 return MaxMin_match<ICmpInst, LHS, RHS, umin_pred_ty>(L, R); 1576 } 1577 1578 /// Match an 'ordered' floating point maximum function. 1579 /// Floating point has one special value 'NaN'. Therefore, there is no total 1580 /// order. However, if we can ignore the 'NaN' value (for example, because of a 1581 /// 'no-nans-float-math' flag) a combination of a fcmp and select has 'maximum' 1582 /// semantics. In the presence of 'NaN' we have to preserve the original 1583 /// select(fcmp(ogt/ge, L, R), L, R) semantics matched by this predicate. 1584 /// 1585 /// max(L, R) iff L and R are not NaN 1586 /// m_OrdFMax(L, R) = R iff L or R are NaN 1587 template <typename LHS, typename RHS> 1588 inline MaxMin_match<FCmpInst, LHS, RHS, ofmax_pred_ty> m_OrdFMax(const LHS &L, 1589 const RHS &R) { 1590 return MaxMin_match<FCmpInst, LHS, RHS, ofmax_pred_ty>(L, R); 1591 } 1592 1593 /// Match an 'ordered' floating point minimum function. 1594 /// Floating point has one special value 'NaN'. Therefore, there is no total 1595 /// order. However, if we can ignore the 'NaN' value (for example, because of a 1596 /// 'no-nans-float-math' flag) a combination of a fcmp and select has 'minimum' 1597 /// semantics. In the presence of 'NaN' we have to preserve the original 1598 /// select(fcmp(olt/le, L, R), L, R) semantics matched by this predicate. 1599 /// 1600 /// min(L, R) iff L and R are not NaN 1601 /// m_OrdFMin(L, R) = R iff L or R are NaN 1602 template <typename LHS, typename RHS> 1603 inline MaxMin_match<FCmpInst, LHS, RHS, ofmin_pred_ty> m_OrdFMin(const LHS &L, 1604 const RHS &R) { 1605 return MaxMin_match<FCmpInst, LHS, RHS, ofmin_pred_ty>(L, R); 1606 } 1607 1608 /// Match an 'unordered' floating point maximum function. 1609 /// Floating point has one special value 'NaN'. Therefore, there is no total 1610 /// order. However, if we can ignore the 'NaN' value (for example, because of a 1611 /// 'no-nans-float-math' flag) a combination of a fcmp and select has 'maximum' 1612 /// semantics. In the presence of 'NaN' we have to preserve the original 1613 /// select(fcmp(ugt/ge, L, R), L, R) semantics matched by this predicate. 1614 /// 1615 /// max(L, R) iff L and R are not NaN 1616 /// m_UnordFMax(L, R) = L iff L or R are NaN 1617 template <typename LHS, typename RHS> 1618 inline MaxMin_match<FCmpInst, LHS, RHS, ufmax_pred_ty> 1619 m_UnordFMax(const LHS &L, const RHS &R) { 1620 return MaxMin_match<FCmpInst, LHS, RHS, ufmax_pred_ty>(L, R); 1621 } 1622 1623 /// Match an 'unordered' floating point minimum function. 1624 /// Floating point has one special value 'NaN'. Therefore, there is no total 1625 /// order. However, if we can ignore the 'NaN' value (for example, because of a 1626 /// 'no-nans-float-math' flag) a combination of a fcmp and select has 'minimum' 1627 /// semantics. In the presence of 'NaN' we have to preserve the original 1628 /// select(fcmp(ult/le, L, R), L, R) semantics matched by this predicate. 1629 /// 1630 /// min(L, R) iff L and R are not NaN 1631 /// m_UnordFMin(L, R) = L iff L or R are NaN 1632 template <typename LHS, typename RHS> 1633 inline MaxMin_match<FCmpInst, LHS, RHS, ufmin_pred_ty> 1634 m_UnordFMin(const LHS &L, const RHS &R) { 1635 return MaxMin_match<FCmpInst, LHS, RHS, ufmin_pred_ty>(L, R); 1636 } 1637 1638 //===----------------------------------------------------------------------===// 1639 // Matchers for overflow check patterns: e.g. (a + b) u< a 1640 // 1641 1642 template <typename LHS_t, typename RHS_t, typename Sum_t> 1643 struct UAddWithOverflow_match { 1644 LHS_t L; 1645 RHS_t R; 1646 Sum_t S; 1647 1648 UAddWithOverflow_match(const LHS_t &L, const RHS_t &R, const Sum_t &S) 1649 : L(L), R(R), S(S) {} 1650 1651 template <typename OpTy> bool match(OpTy *V) { 1652 Value *ICmpLHS, *ICmpRHS; 1653 ICmpInst::Predicate Pred; 1654 if (!m_ICmp(Pred, m_Value(ICmpLHS), m_Value(ICmpRHS)).match(V)) 1655 return false; 1656 1657 Value *AddLHS, *AddRHS; 1658 auto AddExpr = m_Add(m_Value(AddLHS), m_Value(AddRHS)); 1659 1660 // (a + b) u< a, (a + b) u< b 1661 if (Pred == ICmpInst::ICMP_ULT) 1662 if (AddExpr.match(ICmpLHS) && (ICmpRHS == AddLHS || ICmpRHS == AddRHS)) 1663 return L.match(AddLHS) && R.match(AddRHS) && S.match(ICmpLHS); 1664 1665 // a >u (a + b), b >u (a + b) 1666 if (Pred == ICmpInst::ICMP_UGT) 1667 if (AddExpr.match(ICmpRHS) && (ICmpLHS == AddLHS || ICmpLHS == AddRHS)) 1668 return L.match(AddLHS) && R.match(AddRHS) && S.match(ICmpRHS); 1669 1670 // Match special-case for increment-by-1. 1671 if (Pred == ICmpInst::ICMP_EQ) { 1672 // (a + 1) == 0 1673 // (1 + a) == 0 1674 if (AddExpr.match(ICmpLHS) && m_ZeroInt().match(ICmpRHS) && 1675 (m_One().match(AddLHS) || m_One().match(AddRHS))) 1676 return L.match(AddLHS) && R.match(AddRHS) && S.match(ICmpLHS); 1677 // 0 == (a + 1) 1678 // 0 == (1 + a) 1679 if (m_ZeroInt().match(ICmpLHS) && AddExpr.match(ICmpRHS) && 1680 (m_One().match(AddLHS) || m_One().match(AddRHS))) 1681 return L.match(AddLHS) && R.match(AddRHS) && S.match(ICmpRHS); 1682 } 1683 1684 return false; 1685 } 1686 }; 1687 1688 /// Match an icmp instruction checking for unsigned overflow on addition. 1689 /// 1690 /// S is matched to the addition whose result is being checked for overflow, and 1691 /// L and R are matched to the LHS and RHS of S. 1692 template <typename LHS_t, typename RHS_t, typename Sum_t> 1693 UAddWithOverflow_match<LHS_t, RHS_t, Sum_t> 1694 m_UAddWithOverflow(const LHS_t &L, const RHS_t &R, const Sum_t &S) { 1695 return UAddWithOverflow_match<LHS_t, RHS_t, Sum_t>(L, R, S); 1696 } 1697 1698 template <typename Opnd_t> struct Argument_match { 1699 unsigned OpI; 1700 Opnd_t Val; 1701 1702 Argument_match(unsigned OpIdx, const Opnd_t &V) : OpI(OpIdx), Val(V) {} 1703 1704 template <typename OpTy> bool match(OpTy *V) { 1705 // FIXME: Should likely be switched to use `CallBase`. 1706 if (const auto *CI = dyn_cast<CallInst>(V)) 1707 return Val.match(CI->getArgOperand(OpI)); 1708 return false; 1709 } 1710 }; 1711 1712 /// Match an argument. 1713 template <unsigned OpI, typename Opnd_t> 1714 inline Argument_match<Opnd_t> m_Argument(const Opnd_t &Op) { 1715 return Argument_match<Opnd_t>(OpI, Op); 1716 } 1717 1718 /// Intrinsic matchers. 1719 struct IntrinsicID_match { 1720 unsigned ID; 1721 1722 IntrinsicID_match(Intrinsic::ID IntrID) : ID(IntrID) {} 1723 1724 template <typename OpTy> bool match(OpTy *V) { 1725 if (const auto *CI = dyn_cast<CallInst>(V)) 1726 if (const auto *F = CI->getCalledFunction()) 1727 return F->getIntrinsicID() == ID; 1728 return false; 1729 } 1730 }; 1731 1732 /// Intrinsic matches are combinations of ID matchers, and argument 1733 /// matchers. Higher arity matcher are defined recursively in terms of and-ing 1734 /// them with lower arity matchers. Here's some convenient typedefs for up to 1735 /// several arguments, and more can be added as needed 1736 template <typename T0 = void, typename T1 = void, typename T2 = void, 1737 typename T3 = void, typename T4 = void, typename T5 = void, 1738 typename T6 = void, typename T7 = void, typename T8 = void, 1739 typename T9 = void, typename T10 = void> 1740 struct m_Intrinsic_Ty; 1741 template <typename T0> struct m_Intrinsic_Ty<T0> { 1742 using Ty = match_combine_and<IntrinsicID_match, Argument_match<T0>>; 1743 }; 1744 template <typename T0, typename T1> struct m_Intrinsic_Ty<T0, T1> { 1745 using Ty = 1746 match_combine_and<typename m_Intrinsic_Ty<T0>::Ty, Argument_match<T1>>; 1747 }; 1748 template <typename T0, typename T1, typename T2> 1749 struct m_Intrinsic_Ty<T0, T1, T2> { 1750 using Ty = 1751 match_combine_and<typename m_Intrinsic_Ty<T0, T1>::Ty, 1752 Argument_match<T2>>; 1753 }; 1754 template <typename T0, typename T1, typename T2, typename T3> 1755 struct m_Intrinsic_Ty<T0, T1, T2, T3> { 1756 using Ty = 1757 match_combine_and<typename m_Intrinsic_Ty<T0, T1, T2>::Ty, 1758 Argument_match<T3>>; 1759 }; 1760 1761 template <typename T0, typename T1, typename T2, typename T3, typename T4> 1762 struct m_Intrinsic_Ty<T0, T1, T2, T3, T4> { 1763 using Ty = match_combine_and<typename m_Intrinsic_Ty<T0, T1, T2, T3>::Ty, 1764 Argument_match<T4>>; 1765 }; 1766 1767 /// Match intrinsic calls like this: 1768 /// m_Intrinsic<Intrinsic::fabs>(m_Value(X)) 1769 template <Intrinsic::ID IntrID> inline IntrinsicID_match m_Intrinsic() { 1770 return IntrinsicID_match(IntrID); 1771 } 1772 1773 template <Intrinsic::ID IntrID, typename T0> 1774 inline typename m_Intrinsic_Ty<T0>::Ty m_Intrinsic(const T0 &Op0) { 1775 return m_CombineAnd(m_Intrinsic<IntrID>(), m_Argument<0>(Op0)); 1776 } 1777 1778 template <Intrinsic::ID IntrID, typename T0, typename T1> 1779 inline typename m_Intrinsic_Ty<T0, T1>::Ty m_Intrinsic(const T0 &Op0, 1780 const T1 &Op1) { 1781 return m_CombineAnd(m_Intrinsic<IntrID>(Op0), m_Argument<1>(Op1)); 1782 } 1783 1784 template <Intrinsic::ID IntrID, typename T0, typename T1, typename T2> 1785 inline typename m_Intrinsic_Ty<T0, T1, T2>::Ty 1786 m_Intrinsic(const T0 &Op0, const T1 &Op1, const T2 &Op2) { 1787 return m_CombineAnd(m_Intrinsic<IntrID>(Op0, Op1), m_Argument<2>(Op2)); 1788 } 1789 1790 template <Intrinsic::ID IntrID, typename T0, typename T1, typename T2, 1791 typename T3> 1792 inline typename m_Intrinsic_Ty<T0, T1, T2, T3>::Ty 1793 m_Intrinsic(const T0 &Op0, const T1 &Op1, const T2 &Op2, const T3 &Op3) { 1794 return m_CombineAnd(m_Intrinsic<IntrID>(Op0, Op1, Op2), m_Argument<3>(Op3)); 1795 } 1796 1797 template <Intrinsic::ID IntrID, typename T0, typename T1, typename T2, 1798 typename T3, typename T4> 1799 inline typename m_Intrinsic_Ty<T0, T1, T2, T3, T4>::Ty 1800 m_Intrinsic(const T0 &Op0, const T1 &Op1, const T2 &Op2, const T3 &Op3, 1801 const T4 &Op4) { 1802 return m_CombineAnd(m_Intrinsic<IntrID>(Op0, Op1, Op2, Op3), 1803 m_Argument<4>(Op4)); 1804 } 1805 1806 // Helper intrinsic matching specializations. 1807 template <typename Opnd0> 1808 inline typename m_Intrinsic_Ty<Opnd0>::Ty m_BitReverse(const Opnd0 &Op0) { 1809 return m_Intrinsic<Intrinsic::bitreverse>(Op0); 1810 } 1811 1812 template <typename Opnd0> 1813 inline typename m_Intrinsic_Ty<Opnd0>::Ty m_BSwap(const Opnd0 &Op0) { 1814 return m_Intrinsic<Intrinsic::bswap>(Op0); 1815 } 1816 1817 template <typename Opnd0> 1818 inline typename m_Intrinsic_Ty<Opnd0>::Ty m_FAbs(const Opnd0 &Op0) { 1819 return m_Intrinsic<Intrinsic::fabs>(Op0); 1820 } 1821 1822 template <typename Opnd0> 1823 inline typename m_Intrinsic_Ty<Opnd0>::Ty m_FCanonicalize(const Opnd0 &Op0) { 1824 return m_Intrinsic<Intrinsic::canonicalize>(Op0); 1825 } 1826 1827 template <typename Opnd0, typename Opnd1> 1828 inline typename m_Intrinsic_Ty<Opnd0, Opnd1>::Ty m_FMin(const Opnd0 &Op0, 1829 const Opnd1 &Op1) { 1830 return m_Intrinsic<Intrinsic::minnum>(Op0, Op1); 1831 } 1832 1833 template <typename Opnd0, typename Opnd1> 1834 inline typename m_Intrinsic_Ty<Opnd0, Opnd1>::Ty m_FMax(const Opnd0 &Op0, 1835 const Opnd1 &Op1) { 1836 return m_Intrinsic<Intrinsic::maxnum>(Op0, Op1); 1837 } 1838 1839 //===----------------------------------------------------------------------===// 1840 // Matchers for two-operands operators with the operators in either order 1841 // 1842 1843 /// Matches a BinaryOperator with LHS and RHS in either order. 1844 template <typename LHS, typename RHS> 1845 inline AnyBinaryOp_match<LHS, RHS, true> m_c_BinOp(const LHS &L, const RHS &R) { 1846 return AnyBinaryOp_match<LHS, RHS, true>(L, R); 1847 } 1848 1849 /// Matches an ICmp with a predicate over LHS and RHS in either order. 1850 /// Does not swap the predicate. 1851 template <typename LHS, typename RHS> 1852 inline CmpClass_match<LHS, RHS, ICmpInst, ICmpInst::Predicate, true> 1853 m_c_ICmp(ICmpInst::Predicate &Pred, const LHS &L, const RHS &R) { 1854 return CmpClass_match<LHS, RHS, ICmpInst, ICmpInst::Predicate, true>(Pred, L, 1855 R); 1856 } 1857 1858 /// Matches a Add with LHS and RHS in either order. 1859 template <typename LHS, typename RHS> 1860 inline BinaryOp_match<LHS, RHS, Instruction::Add, true> m_c_Add(const LHS &L, 1861 const RHS &R) { 1862 return BinaryOp_match<LHS, RHS, Instruction::Add, true>(L, R); 1863 } 1864 1865 /// Matches a Mul with LHS and RHS in either order. 1866 template <typename LHS, typename RHS> 1867 inline BinaryOp_match<LHS, RHS, Instruction::Mul, true> m_c_Mul(const LHS &L, 1868 const RHS &R) { 1869 return BinaryOp_match<LHS, RHS, Instruction::Mul, true>(L, R); 1870 } 1871 1872 /// Matches an And with LHS and RHS in either order. 1873 template <typename LHS, typename RHS> 1874 inline BinaryOp_match<LHS, RHS, Instruction::And, true> m_c_And(const LHS &L, 1875 const RHS &R) { 1876 return BinaryOp_match<LHS, RHS, Instruction::And, true>(L, R); 1877 } 1878 1879 /// Matches an Or with LHS and RHS in either order. 1880 template <typename LHS, typename RHS> 1881 inline BinaryOp_match<LHS, RHS, Instruction::Or, true> m_c_Or(const LHS &L, 1882 const RHS &R) { 1883 return BinaryOp_match<LHS, RHS, Instruction::Or, true>(L, R); 1884 } 1885 1886 /// Matches an Xor with LHS and RHS in either order. 1887 template <typename LHS, typename RHS> 1888 inline BinaryOp_match<LHS, RHS, Instruction::Xor, true> m_c_Xor(const LHS &L, 1889 const RHS &R) { 1890 return BinaryOp_match<LHS, RHS, Instruction::Xor, true>(L, R); 1891 } 1892 1893 /// Matches a 'Neg' as 'sub 0, V'. 1894 template <typename ValTy> 1895 inline BinaryOp_match<cst_pred_ty<is_zero_int>, ValTy, Instruction::Sub> 1896 m_Neg(const ValTy &V) { 1897 return m_Sub(m_ZeroInt(), V); 1898 } 1899 1900 /// Matches a 'Not' as 'xor V, -1' or 'xor -1, V'. 1901 template <typename ValTy> 1902 inline BinaryOp_match<ValTy, cst_pred_ty<is_all_ones>, Instruction::Xor, true> 1903 m_Not(const ValTy &V) { 1904 return m_c_Xor(V, m_AllOnes()); 1905 } 1906 1907 /// Matches an SMin with LHS and RHS in either order. 1908 template <typename LHS, typename RHS> 1909 inline MaxMin_match<ICmpInst, LHS, RHS, smin_pred_ty, true> 1910 m_c_SMin(const LHS &L, const RHS &R) { 1911 return MaxMin_match<ICmpInst, LHS, RHS, smin_pred_ty, true>(L, R); 1912 } 1913 /// Matches an SMax with LHS and RHS in either order. 1914 template <typename LHS, typename RHS> 1915 inline MaxMin_match<ICmpInst, LHS, RHS, smax_pred_ty, true> 1916 m_c_SMax(const LHS &L, const RHS &R) { 1917 return MaxMin_match<ICmpInst, LHS, RHS, smax_pred_ty, true>(L, R); 1918 } 1919 /// Matches a UMin with LHS and RHS in either order. 1920 template <typename LHS, typename RHS> 1921 inline MaxMin_match<ICmpInst, LHS, RHS, umin_pred_ty, true> 1922 m_c_UMin(const LHS &L, const RHS &R) { 1923 return MaxMin_match<ICmpInst, LHS, RHS, umin_pred_ty, true>(L, R); 1924 } 1925 /// Matches a UMax with LHS and RHS in either order. 1926 template <typename LHS, typename RHS> 1927 inline MaxMin_match<ICmpInst, LHS, RHS, umax_pred_ty, true> 1928 m_c_UMax(const LHS &L, const RHS &R) { 1929 return MaxMin_match<ICmpInst, LHS, RHS, umax_pred_ty, true>(L, R); 1930 } 1931 1932 /// Matches FAdd with LHS and RHS in either order. 1933 template <typename LHS, typename RHS> 1934 inline BinaryOp_match<LHS, RHS, Instruction::FAdd, true> 1935 m_c_FAdd(const LHS &L, const RHS &R) { 1936 return BinaryOp_match<LHS, RHS, Instruction::FAdd, true>(L, R); 1937 } 1938 1939 /// Matches FMul with LHS and RHS in either order. 1940 template <typename LHS, typename RHS> 1941 inline BinaryOp_match<LHS, RHS, Instruction::FMul, true> 1942 m_c_FMul(const LHS &L, const RHS &R) { 1943 return BinaryOp_match<LHS, RHS, Instruction::FMul, true>(L, R); 1944 } 1945 1946 template <typename Opnd_t> struct Signum_match { 1947 Opnd_t Val; 1948 Signum_match(const Opnd_t &V) : Val(V) {} 1949 1950 template <typename OpTy> bool match(OpTy *V) { 1951 unsigned TypeSize = V->getType()->getScalarSizeInBits(); 1952 if (TypeSize == 0) 1953 return false; 1954 1955 unsigned ShiftWidth = TypeSize - 1; 1956 Value *OpL = nullptr, *OpR = nullptr; 1957 1958 // This is the representation of signum we match: 1959 // 1960 // signum(x) == (x >> 63) | (-x >>u 63) 1961 // 1962 // An i1 value is its own signum, so it's correct to match 1963 // 1964 // signum(x) == (x >> 0) | (-x >>u 0) 1965 // 1966 // for i1 values. 1967 1968 auto LHS = m_AShr(m_Value(OpL), m_SpecificInt(ShiftWidth)); 1969 auto RHS = m_LShr(m_Neg(m_Value(OpR)), m_SpecificInt(ShiftWidth)); 1970 auto Signum = m_Or(LHS, RHS); 1971 1972 return Signum.match(V) && OpL == OpR && Val.match(OpL); 1973 } 1974 }; 1975 1976 /// Matches a signum pattern. 1977 /// 1978 /// signum(x) = 1979 /// x > 0 -> 1 1980 /// x == 0 -> 0 1981 /// x < 0 -> -1 1982 template <typename Val_t> inline Signum_match<Val_t> m_Signum(const Val_t &V) { 1983 return Signum_match<Val_t>(V); 1984 } 1985 1986 template <int Ind, typename Opnd_t> struct ExtractValue_match { 1987 Opnd_t Val; 1988 ExtractValue_match(const Opnd_t &V) : Val(V) {} 1989 1990 template <typename OpTy> bool match(OpTy *V) { 1991 if (auto *I = dyn_cast<ExtractValueInst>(V)) 1992 return I->getNumIndices() == 1 && I->getIndices()[0] == Ind && 1993 Val.match(I->getAggregateOperand()); 1994 return false; 1995 } 1996 }; 1997 1998 /// Match a single index ExtractValue instruction. 1999 /// For example m_ExtractValue<1>(...) 2000 template <int Ind, typename Val_t> 2001 inline ExtractValue_match<Ind, Val_t> m_ExtractValue(const Val_t &V) { 2002 return ExtractValue_match<Ind, Val_t>(V); 2003 } 2004 2005 } // end namespace PatternMatch 2006 } // end namespace llvm 2007 2008 #endif // LLVM_IR_PATTERNMATCH_H 2009