1 //===- DAGISelMatcher.h - Representation of DAG pattern matcher -*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #ifndef LLVM_UTILS_TABLEGEN_DAGISELMATCHER_H 11 #define LLVM_UTILS_TABLEGEN_DAGISELMATCHER_H 12 13 #include "llvm/ADT/ArrayRef.h" 14 #include "llvm/ADT/SmallVector.h" 15 #include "llvm/ADT/StringRef.h" 16 #include "llvm/Support/Casting.h" 17 #include "llvm/Support/MachineValueType.h" 18 19 namespace llvm { 20 struct CodeGenRegister; 21 class CodeGenDAGPatterns; 22 class Matcher; 23 class PatternToMatch; 24 class raw_ostream; 25 class ComplexPattern; 26 class Record; 27 class SDNodeInfo; 28 class TreePredicateFn; 29 class TreePattern; 30 31 Matcher *ConvertPatternToMatcher(const PatternToMatch &Pattern,unsigned Variant, 32 const CodeGenDAGPatterns &CGP); 33 void OptimizeMatcher(std::unique_ptr<Matcher> &Matcher, 34 const CodeGenDAGPatterns &CGP); 35 void EmitMatcherTable(const Matcher *Matcher, const CodeGenDAGPatterns &CGP, 36 raw_ostream &OS); 37 38 39 /// Matcher - Base class for all the DAG ISel Matcher representation 40 /// nodes. 41 class Matcher { 42 // The next matcher node that is executed after this one. Null if this is the 43 // last stage of a match. 44 std::unique_ptr<Matcher> Next; 45 virtual void anchor(); 46 public: 47 enum KindTy { 48 // Matcher state manipulation. 49 Scope, // Push a checking scope. 50 RecordNode, // Record the current node. 51 RecordChild, // Record a child of the current node. 52 RecordMemRef, // Record the memref in the current node. 53 CaptureGlueInput, // If the current node has an input glue, save it. 54 MoveChild, // Move current node to specified child. 55 MoveParent, // Move current node to parent. 56 57 // Predicate checking. 58 CheckSame, // Fail if not same as prev match. 59 CheckChildSame, // Fail if child not same as prev match. 60 CheckPatternPredicate, 61 CheckPredicate, // Fail if node predicate fails. 62 CheckOpcode, // Fail if not opcode. 63 SwitchOpcode, // Dispatch based on opcode. 64 CheckType, // Fail if not correct type. 65 SwitchType, // Dispatch based on type. 66 CheckChildType, // Fail if child has wrong type. 67 CheckInteger, // Fail if wrong val. 68 CheckChildInteger, // Fail if child is wrong val. 69 CheckCondCode, // Fail if not condcode. 70 CheckValueType, 71 CheckComplexPat, 72 CheckAndImm, 73 CheckOrImm, 74 CheckFoldableChainNode, 75 76 // Node creation/emisssion. 77 EmitInteger, // Create a TargetConstant 78 EmitStringInteger, // Create a TargetConstant from a string. 79 EmitRegister, // Create a register. 80 EmitConvertToTarget, // Convert a imm/fpimm to target imm/fpimm 81 EmitMergeInputChains, // Merge together a chains for an input. 82 EmitCopyToReg, // Emit a copytoreg into a physreg. 83 EmitNode, // Create a DAG node 84 EmitNodeXForm, // Run a SDNodeXForm 85 CompleteMatch, // Finish a match and update the results. 86 MorphNodeTo // Build a node, finish a match and update results. 87 }; 88 const KindTy Kind; 89 90 protected: Matcher(KindTy K)91 Matcher(KindTy K) : Kind(K) {} 92 public: ~Matcher()93 virtual ~Matcher() {} 94 getKind()95 KindTy getKind() const { return Kind; } 96 getNext()97 Matcher *getNext() { return Next.get(); } getNext()98 const Matcher *getNext() const { return Next.get(); } setNext(Matcher * C)99 void setNext(Matcher *C) { Next.reset(C); } takeNext()100 Matcher *takeNext() { return Next.release(); } 101 getNextPtr()102 std::unique_ptr<Matcher> &getNextPtr() { return Next; } 103 isEqual(const Matcher * M)104 bool isEqual(const Matcher *M) const { 105 if (getKind() != M->getKind()) return false; 106 return isEqualImpl(M); 107 } 108 109 /// isSimplePredicateNode - Return true if this is a simple predicate that 110 /// operates on the node or its children without potential side effects or a 111 /// change of the current node. isSimplePredicateNode()112 bool isSimplePredicateNode() const { 113 switch (getKind()) { 114 default: return false; 115 case CheckSame: 116 case CheckChildSame: 117 case CheckPatternPredicate: 118 case CheckPredicate: 119 case CheckOpcode: 120 case CheckType: 121 case CheckChildType: 122 case CheckInteger: 123 case CheckChildInteger: 124 case CheckCondCode: 125 case CheckValueType: 126 case CheckAndImm: 127 case CheckOrImm: 128 case CheckFoldableChainNode: 129 return true; 130 } 131 } 132 133 /// isSimplePredicateOrRecordNode - Return true if this is a record node or 134 /// a simple predicate. isSimplePredicateOrRecordNode()135 bool isSimplePredicateOrRecordNode() const { 136 return isSimplePredicateNode() || 137 getKind() == RecordNode || getKind() == RecordChild; 138 } 139 140 /// unlinkNode - Unlink the specified node from this chain. If Other == this, 141 /// we unlink the next pointer and return it. Otherwise we unlink Other from 142 /// the list and return this. 143 Matcher *unlinkNode(Matcher *Other); 144 145 /// canMoveBefore - Return true if this matcher is the same as Other, or if 146 /// we can move this matcher past all of the nodes in-between Other and this 147 /// node. Other must be equal to or before this. 148 bool canMoveBefore(const Matcher *Other) const; 149 150 /// canMoveBeforeNode - Return true if it is safe to move the current matcher 151 /// across the specified one. 152 bool canMoveBeforeNode(const Matcher *Other) const; 153 154 /// isContradictory - Return true of these two matchers could never match on 155 /// the same node. isContradictory(const Matcher * Other)156 bool isContradictory(const Matcher *Other) const { 157 // Since this predicate is reflexive, we canonicalize the ordering so that 158 // we always match a node against nodes with kinds that are greater or equal 159 // to them. For example, we'll pass in a CheckType node as an argument to 160 // the CheckOpcode method, not the other way around. 161 if (getKind() < Other->getKind()) 162 return isContradictoryImpl(Other); 163 return Other->isContradictoryImpl(this); 164 } 165 166 void print(raw_ostream &OS, unsigned indent = 0) const; 167 void printOne(raw_ostream &OS) const; 168 void dump() const; 169 protected: 170 virtual void printImpl(raw_ostream &OS, unsigned indent) const = 0; 171 virtual bool isEqualImpl(const Matcher *M) const = 0; isContradictoryImpl(const Matcher * M)172 virtual bool isContradictoryImpl(const Matcher *M) const { return false; } 173 }; 174 175 /// ScopeMatcher - This attempts to match each of its children to find the first 176 /// one that successfully matches. If one child fails, it tries the next child. 177 /// If none of the children match then this check fails. It never has a 'next'. 178 class ScopeMatcher : public Matcher { 179 SmallVector<Matcher*, 4> Children; 180 public: ScopeMatcher(ArrayRef<Matcher * > children)181 ScopeMatcher(ArrayRef<Matcher *> children) 182 : Matcher(Scope), Children(children.begin(), children.end()) { 183 } 184 ~ScopeMatcher() override; 185 getNumChildren()186 unsigned getNumChildren() const { return Children.size(); } 187 getChild(unsigned i)188 Matcher *getChild(unsigned i) { return Children[i]; } getChild(unsigned i)189 const Matcher *getChild(unsigned i) const { return Children[i]; } 190 resetChild(unsigned i,Matcher * N)191 void resetChild(unsigned i, Matcher *N) { 192 delete Children[i]; 193 Children[i] = N; 194 } 195 takeChild(unsigned i)196 Matcher *takeChild(unsigned i) { 197 Matcher *Res = Children[i]; 198 Children[i] = nullptr; 199 return Res; 200 } 201 setNumChildren(unsigned NC)202 void setNumChildren(unsigned NC) { 203 if (NC < Children.size()) { 204 // delete any children we're about to lose pointers to. 205 for (unsigned i = NC, e = Children.size(); i != e; ++i) 206 delete Children[i]; 207 } 208 Children.resize(NC); 209 } 210 classof(const Matcher * N)211 static bool classof(const Matcher *N) { 212 return N->getKind() == Scope; 213 } 214 215 private: 216 void printImpl(raw_ostream &OS, unsigned indent) const override; isEqualImpl(const Matcher * M)217 bool isEqualImpl(const Matcher *M) const override { return false; } 218 }; 219 220 /// RecordMatcher - Save the current node in the operand list. 221 class RecordMatcher : public Matcher { 222 /// WhatFor - This is a string indicating why we're recording this. This 223 /// should only be used for comment generation not anything semantic. 224 std::string WhatFor; 225 226 /// ResultNo - The slot number in the RecordedNodes vector that this will be, 227 /// just printed as a comment. 228 unsigned ResultNo; 229 public: RecordMatcher(const std::string & whatfor,unsigned resultNo)230 RecordMatcher(const std::string &whatfor, unsigned resultNo) 231 : Matcher(RecordNode), WhatFor(whatfor), ResultNo(resultNo) {} 232 getWhatFor()233 const std::string &getWhatFor() const { return WhatFor; } getResultNo()234 unsigned getResultNo() const { return ResultNo; } 235 classof(const Matcher * N)236 static bool classof(const Matcher *N) { 237 return N->getKind() == RecordNode; 238 } 239 240 private: 241 void printImpl(raw_ostream &OS, unsigned indent) const override; isEqualImpl(const Matcher * M)242 bool isEqualImpl(const Matcher *M) const override { return true; } 243 }; 244 245 /// RecordChildMatcher - Save a numbered child of the current node, or fail 246 /// the match if it doesn't exist. This is logically equivalent to: 247 /// MoveChild N + RecordNode + MoveParent. 248 class RecordChildMatcher : public Matcher { 249 unsigned ChildNo; 250 251 /// WhatFor - This is a string indicating why we're recording this. This 252 /// should only be used for comment generation not anything semantic. 253 std::string WhatFor; 254 255 /// ResultNo - The slot number in the RecordedNodes vector that this will be, 256 /// just printed as a comment. 257 unsigned ResultNo; 258 public: RecordChildMatcher(unsigned childno,const std::string & whatfor,unsigned resultNo)259 RecordChildMatcher(unsigned childno, const std::string &whatfor, 260 unsigned resultNo) 261 : Matcher(RecordChild), ChildNo(childno), WhatFor(whatfor), 262 ResultNo(resultNo) {} 263 getChildNo()264 unsigned getChildNo() const { return ChildNo; } getWhatFor()265 const std::string &getWhatFor() const { return WhatFor; } getResultNo()266 unsigned getResultNo() const { return ResultNo; } 267 classof(const Matcher * N)268 static bool classof(const Matcher *N) { 269 return N->getKind() == RecordChild; 270 } 271 272 private: 273 void printImpl(raw_ostream &OS, unsigned indent) const override; isEqualImpl(const Matcher * M)274 bool isEqualImpl(const Matcher *M) const override { 275 return cast<RecordChildMatcher>(M)->getChildNo() == getChildNo(); 276 } 277 }; 278 279 /// RecordMemRefMatcher - Save the current node's memref. 280 class RecordMemRefMatcher : public Matcher { 281 public: RecordMemRefMatcher()282 RecordMemRefMatcher() : Matcher(RecordMemRef) {} 283 classof(const Matcher * N)284 static bool classof(const Matcher *N) { 285 return N->getKind() == RecordMemRef; 286 } 287 288 private: 289 void printImpl(raw_ostream &OS, unsigned indent) const override; isEqualImpl(const Matcher * M)290 bool isEqualImpl(const Matcher *M) const override { return true; } 291 }; 292 293 294 /// CaptureGlueInputMatcher - If the current record has a glue input, record 295 /// it so that it is used as an input to the generated code. 296 class CaptureGlueInputMatcher : public Matcher { 297 public: CaptureGlueInputMatcher()298 CaptureGlueInputMatcher() : Matcher(CaptureGlueInput) {} 299 classof(const Matcher * N)300 static bool classof(const Matcher *N) { 301 return N->getKind() == CaptureGlueInput; 302 } 303 304 private: 305 void printImpl(raw_ostream &OS, unsigned indent) const override; isEqualImpl(const Matcher * M)306 bool isEqualImpl(const Matcher *M) const override { return true; } 307 }; 308 309 /// MoveChildMatcher - This tells the interpreter to move into the 310 /// specified child node. 311 class MoveChildMatcher : public Matcher { 312 unsigned ChildNo; 313 public: MoveChildMatcher(unsigned childNo)314 MoveChildMatcher(unsigned childNo) : Matcher(MoveChild), ChildNo(childNo) {} 315 getChildNo()316 unsigned getChildNo() const { return ChildNo; } 317 classof(const Matcher * N)318 static bool classof(const Matcher *N) { 319 return N->getKind() == MoveChild; 320 } 321 322 private: 323 void printImpl(raw_ostream &OS, unsigned indent) const override; isEqualImpl(const Matcher * M)324 bool isEqualImpl(const Matcher *M) const override { 325 return cast<MoveChildMatcher>(M)->getChildNo() == getChildNo(); 326 } 327 }; 328 329 /// MoveParentMatcher - This tells the interpreter to move to the parent 330 /// of the current node. 331 class MoveParentMatcher : public Matcher { 332 public: MoveParentMatcher()333 MoveParentMatcher() : Matcher(MoveParent) {} 334 classof(const Matcher * N)335 static bool classof(const Matcher *N) { 336 return N->getKind() == MoveParent; 337 } 338 339 private: 340 void printImpl(raw_ostream &OS, unsigned indent) const override; isEqualImpl(const Matcher * M)341 bool isEqualImpl(const Matcher *M) const override { return true; } 342 }; 343 344 /// CheckSameMatcher - This checks to see if this node is exactly the same 345 /// node as the specified match that was recorded with 'Record'. This is used 346 /// when patterns have the same name in them, like '(mul GPR:$in, GPR:$in)'. 347 class CheckSameMatcher : public Matcher { 348 unsigned MatchNumber; 349 public: CheckSameMatcher(unsigned matchnumber)350 CheckSameMatcher(unsigned matchnumber) 351 : Matcher(CheckSame), MatchNumber(matchnumber) {} 352 getMatchNumber()353 unsigned getMatchNumber() const { return MatchNumber; } 354 classof(const Matcher * N)355 static bool classof(const Matcher *N) { 356 return N->getKind() == CheckSame; 357 } 358 359 private: 360 void printImpl(raw_ostream &OS, unsigned indent) const override; isEqualImpl(const Matcher * M)361 bool isEqualImpl(const Matcher *M) const override { 362 return cast<CheckSameMatcher>(M)->getMatchNumber() == getMatchNumber(); 363 } 364 }; 365 366 /// CheckChildSameMatcher - This checks to see if child node is exactly the same 367 /// node as the specified match that was recorded with 'Record'. This is used 368 /// when patterns have the same name in them, like '(mul GPR:$in, GPR:$in)'. 369 class CheckChildSameMatcher : public Matcher { 370 unsigned ChildNo; 371 unsigned MatchNumber; 372 public: CheckChildSameMatcher(unsigned childno,unsigned matchnumber)373 CheckChildSameMatcher(unsigned childno, unsigned matchnumber) 374 : Matcher(CheckChildSame), ChildNo(childno), MatchNumber(matchnumber) {} 375 getChildNo()376 unsigned getChildNo() const { return ChildNo; } getMatchNumber()377 unsigned getMatchNumber() const { return MatchNumber; } 378 classof(const Matcher * N)379 static bool classof(const Matcher *N) { 380 return N->getKind() == CheckChildSame; 381 } 382 383 private: 384 void printImpl(raw_ostream &OS, unsigned indent) const override; isEqualImpl(const Matcher * M)385 bool isEqualImpl(const Matcher *M) const override { 386 return cast<CheckChildSameMatcher>(M)->ChildNo == ChildNo && 387 cast<CheckChildSameMatcher>(M)->MatchNumber == MatchNumber; 388 } 389 }; 390 391 /// CheckPatternPredicateMatcher - This checks the target-specific predicate 392 /// to see if the entire pattern is capable of matching. This predicate does 393 /// not take a node as input. This is used for subtarget feature checks etc. 394 class CheckPatternPredicateMatcher : public Matcher { 395 std::string Predicate; 396 public: CheckPatternPredicateMatcher(StringRef predicate)397 CheckPatternPredicateMatcher(StringRef predicate) 398 : Matcher(CheckPatternPredicate), Predicate(predicate) {} 399 getPredicate()400 StringRef getPredicate() const { return Predicate; } 401 classof(const Matcher * N)402 static bool classof(const Matcher *N) { 403 return N->getKind() == CheckPatternPredicate; 404 } 405 406 private: 407 void printImpl(raw_ostream &OS, unsigned indent) const override; isEqualImpl(const Matcher * M)408 bool isEqualImpl(const Matcher *M) const override { 409 return cast<CheckPatternPredicateMatcher>(M)->getPredicate() == Predicate; 410 } 411 }; 412 413 /// CheckPredicateMatcher - This checks the target-specific predicate to 414 /// see if the node is acceptable. 415 class CheckPredicateMatcher : public Matcher { 416 TreePattern *Pred; 417 const SmallVector<unsigned, 4> Operands; 418 public: 419 CheckPredicateMatcher(const TreePredicateFn &pred, 420 const SmallVectorImpl<unsigned> &Operands); 421 422 TreePredicateFn getPredicate() const; 423 unsigned getNumOperands() const; 424 unsigned getOperandNo(unsigned i) const; 425 classof(const Matcher * N)426 static bool classof(const Matcher *N) { 427 return N->getKind() == CheckPredicate; 428 } 429 430 private: 431 void printImpl(raw_ostream &OS, unsigned indent) const override; isEqualImpl(const Matcher * M)432 bool isEqualImpl(const Matcher *M) const override { 433 return cast<CheckPredicateMatcher>(M)->Pred == Pred; 434 } 435 }; 436 437 438 /// CheckOpcodeMatcher - This checks to see if the current node has the 439 /// specified opcode, if not it fails to match. 440 class CheckOpcodeMatcher : public Matcher { 441 const SDNodeInfo &Opcode; 442 public: CheckOpcodeMatcher(const SDNodeInfo & opcode)443 CheckOpcodeMatcher(const SDNodeInfo &opcode) 444 : Matcher(CheckOpcode), Opcode(opcode) {} 445 getOpcode()446 const SDNodeInfo &getOpcode() const { return Opcode; } 447 classof(const Matcher * N)448 static bool classof(const Matcher *N) { 449 return N->getKind() == CheckOpcode; 450 } 451 452 private: 453 void printImpl(raw_ostream &OS, unsigned indent) const override; 454 bool isEqualImpl(const Matcher *M) const override; 455 bool isContradictoryImpl(const Matcher *M) const override; 456 }; 457 458 /// SwitchOpcodeMatcher - Switch based on the current node's opcode, dispatching 459 /// to one matcher per opcode. If the opcode doesn't match any of the cases, 460 /// then the match fails. This is semantically equivalent to a Scope node where 461 /// every child does a CheckOpcode, but is much faster. 462 class SwitchOpcodeMatcher : public Matcher { 463 SmallVector<std::pair<const SDNodeInfo*, Matcher*>, 8> Cases; 464 public: SwitchOpcodeMatcher(ArrayRef<std::pair<const SDNodeInfo *,Matcher * >> cases)465 SwitchOpcodeMatcher(ArrayRef<std::pair<const SDNodeInfo*, Matcher*> > cases) 466 : Matcher(SwitchOpcode), Cases(cases.begin(), cases.end()) {} 467 ~SwitchOpcodeMatcher() override; 468 classof(const Matcher * N)469 static bool classof(const Matcher *N) { 470 return N->getKind() == SwitchOpcode; 471 } 472 getNumCases()473 unsigned getNumCases() const { return Cases.size(); } 474 getCaseOpcode(unsigned i)475 const SDNodeInfo &getCaseOpcode(unsigned i) const { return *Cases[i].first; } getCaseMatcher(unsigned i)476 Matcher *getCaseMatcher(unsigned i) { return Cases[i].second; } getCaseMatcher(unsigned i)477 const Matcher *getCaseMatcher(unsigned i) const { return Cases[i].second; } 478 479 private: 480 void printImpl(raw_ostream &OS, unsigned indent) const override; isEqualImpl(const Matcher * M)481 bool isEqualImpl(const Matcher *M) const override { return false; } 482 }; 483 484 /// CheckTypeMatcher - This checks to see if the current node has the 485 /// specified type at the specified result, if not it fails to match. 486 class CheckTypeMatcher : public Matcher { 487 MVT::SimpleValueType Type; 488 unsigned ResNo; 489 public: CheckTypeMatcher(MVT::SimpleValueType type,unsigned resno)490 CheckTypeMatcher(MVT::SimpleValueType type, unsigned resno) 491 : Matcher(CheckType), Type(type), ResNo(resno) {} 492 getType()493 MVT::SimpleValueType getType() const { return Type; } getResNo()494 unsigned getResNo() const { return ResNo; } 495 classof(const Matcher * N)496 static bool classof(const Matcher *N) { 497 return N->getKind() == CheckType; 498 } 499 500 private: 501 void printImpl(raw_ostream &OS, unsigned indent) const override; isEqualImpl(const Matcher * M)502 bool isEqualImpl(const Matcher *M) const override { 503 return cast<CheckTypeMatcher>(M)->Type == Type; 504 } 505 bool isContradictoryImpl(const Matcher *M) const override; 506 }; 507 508 /// SwitchTypeMatcher - Switch based on the current node's type, dispatching 509 /// to one matcher per case. If the type doesn't match any of the cases, 510 /// then the match fails. This is semantically equivalent to a Scope node where 511 /// every child does a CheckType, but is much faster. 512 class SwitchTypeMatcher : public Matcher { 513 SmallVector<std::pair<MVT::SimpleValueType, Matcher*>, 8> Cases; 514 public: SwitchTypeMatcher(ArrayRef<std::pair<MVT::SimpleValueType,Matcher * >> cases)515 SwitchTypeMatcher(ArrayRef<std::pair<MVT::SimpleValueType, Matcher*> > cases) 516 : Matcher(SwitchType), Cases(cases.begin(), cases.end()) {} 517 ~SwitchTypeMatcher() override; 518 classof(const Matcher * N)519 static bool classof(const Matcher *N) { 520 return N->getKind() == SwitchType; 521 } 522 getNumCases()523 unsigned getNumCases() const { return Cases.size(); } 524 getCaseType(unsigned i)525 MVT::SimpleValueType getCaseType(unsigned i) const { return Cases[i].first; } getCaseMatcher(unsigned i)526 Matcher *getCaseMatcher(unsigned i) { return Cases[i].second; } getCaseMatcher(unsigned i)527 const Matcher *getCaseMatcher(unsigned i) const { return Cases[i].second; } 528 529 private: 530 void printImpl(raw_ostream &OS, unsigned indent) const override; isEqualImpl(const Matcher * M)531 bool isEqualImpl(const Matcher *M) const override { return false; } 532 }; 533 534 535 /// CheckChildTypeMatcher - This checks to see if a child node has the 536 /// specified type, if not it fails to match. 537 class CheckChildTypeMatcher : public Matcher { 538 unsigned ChildNo; 539 MVT::SimpleValueType Type; 540 public: CheckChildTypeMatcher(unsigned childno,MVT::SimpleValueType type)541 CheckChildTypeMatcher(unsigned childno, MVT::SimpleValueType type) 542 : Matcher(CheckChildType), ChildNo(childno), Type(type) {} 543 getChildNo()544 unsigned getChildNo() const { return ChildNo; } getType()545 MVT::SimpleValueType getType() const { return Type; } 546 classof(const Matcher * N)547 static bool classof(const Matcher *N) { 548 return N->getKind() == CheckChildType; 549 } 550 551 private: 552 void printImpl(raw_ostream &OS, unsigned indent) const override; isEqualImpl(const Matcher * M)553 bool isEqualImpl(const Matcher *M) const override { 554 return cast<CheckChildTypeMatcher>(M)->ChildNo == ChildNo && 555 cast<CheckChildTypeMatcher>(M)->Type == Type; 556 } 557 bool isContradictoryImpl(const Matcher *M) const override; 558 }; 559 560 561 /// CheckIntegerMatcher - This checks to see if the current node is a 562 /// ConstantSDNode with the specified integer value, if not it fails to match. 563 class CheckIntegerMatcher : public Matcher { 564 int64_t Value; 565 public: CheckIntegerMatcher(int64_t value)566 CheckIntegerMatcher(int64_t value) 567 : Matcher(CheckInteger), Value(value) {} 568 getValue()569 int64_t getValue() const { return Value; } 570 classof(const Matcher * N)571 static bool classof(const Matcher *N) { 572 return N->getKind() == CheckInteger; 573 } 574 575 private: 576 void printImpl(raw_ostream &OS, unsigned indent) const override; isEqualImpl(const Matcher * M)577 bool isEqualImpl(const Matcher *M) const override { 578 return cast<CheckIntegerMatcher>(M)->Value == Value; 579 } 580 bool isContradictoryImpl(const Matcher *M) const override; 581 }; 582 583 /// CheckChildIntegerMatcher - This checks to see if the child node is a 584 /// ConstantSDNode with a specified integer value, if not it fails to match. 585 class CheckChildIntegerMatcher : public Matcher { 586 unsigned ChildNo; 587 int64_t Value; 588 public: CheckChildIntegerMatcher(unsigned childno,int64_t value)589 CheckChildIntegerMatcher(unsigned childno, int64_t value) 590 : Matcher(CheckChildInteger), ChildNo(childno), Value(value) {} 591 getChildNo()592 unsigned getChildNo() const { return ChildNo; } getValue()593 int64_t getValue() const { return Value; } 594 classof(const Matcher * N)595 static bool classof(const Matcher *N) { 596 return N->getKind() == CheckChildInteger; 597 } 598 599 private: 600 void printImpl(raw_ostream &OS, unsigned indent) const override; isEqualImpl(const Matcher * M)601 bool isEqualImpl(const Matcher *M) const override { 602 return cast<CheckChildIntegerMatcher>(M)->ChildNo == ChildNo && 603 cast<CheckChildIntegerMatcher>(M)->Value == Value; 604 } 605 bool isContradictoryImpl(const Matcher *M) const override; 606 }; 607 608 /// CheckCondCodeMatcher - This checks to see if the current node is a 609 /// CondCodeSDNode with the specified condition, if not it fails to match. 610 class CheckCondCodeMatcher : public Matcher { 611 StringRef CondCodeName; 612 public: CheckCondCodeMatcher(StringRef condcodename)613 CheckCondCodeMatcher(StringRef condcodename) 614 : Matcher(CheckCondCode), CondCodeName(condcodename) {} 615 getCondCodeName()616 StringRef getCondCodeName() const { return CondCodeName; } 617 classof(const Matcher * N)618 static bool classof(const Matcher *N) { 619 return N->getKind() == CheckCondCode; 620 } 621 622 private: 623 void printImpl(raw_ostream &OS, unsigned indent) const override; isEqualImpl(const Matcher * M)624 bool isEqualImpl(const Matcher *M) const override { 625 return cast<CheckCondCodeMatcher>(M)->CondCodeName == CondCodeName; 626 } 627 }; 628 629 /// CheckValueTypeMatcher - This checks to see if the current node is a 630 /// VTSDNode with the specified type, if not it fails to match. 631 class CheckValueTypeMatcher : public Matcher { 632 StringRef TypeName; 633 public: CheckValueTypeMatcher(StringRef type_name)634 CheckValueTypeMatcher(StringRef type_name) 635 : Matcher(CheckValueType), TypeName(type_name) {} 636 getTypeName()637 StringRef getTypeName() const { return TypeName; } 638 classof(const Matcher * N)639 static bool classof(const Matcher *N) { 640 return N->getKind() == CheckValueType; 641 } 642 643 private: 644 void printImpl(raw_ostream &OS, unsigned indent) const override; isEqualImpl(const Matcher * M)645 bool isEqualImpl(const Matcher *M) const override { 646 return cast<CheckValueTypeMatcher>(M)->TypeName == TypeName; 647 } 648 bool isContradictoryImpl(const Matcher *M) const override; 649 }; 650 651 652 653 /// CheckComplexPatMatcher - This node runs the specified ComplexPattern on 654 /// the current node. 655 class CheckComplexPatMatcher : public Matcher { 656 const ComplexPattern &Pattern; 657 658 /// MatchNumber - This is the recorded nodes slot that contains the node we 659 /// want to match against. 660 unsigned MatchNumber; 661 662 /// Name - The name of the node we're matching, for comment emission. 663 std::string Name; 664 665 /// FirstResult - This is the first slot in the RecordedNodes list that the 666 /// result of the match populates. 667 unsigned FirstResult; 668 public: CheckComplexPatMatcher(const ComplexPattern & pattern,unsigned matchnumber,const std::string & name,unsigned firstresult)669 CheckComplexPatMatcher(const ComplexPattern &pattern, unsigned matchnumber, 670 const std::string &name, unsigned firstresult) 671 : Matcher(CheckComplexPat), Pattern(pattern), MatchNumber(matchnumber), 672 Name(name), FirstResult(firstresult) {} 673 getPattern()674 const ComplexPattern &getPattern() const { return Pattern; } getMatchNumber()675 unsigned getMatchNumber() const { return MatchNumber; } 676 getName()677 const std::string getName() const { return Name; } getFirstResult()678 unsigned getFirstResult() const { return FirstResult; } 679 classof(const Matcher * N)680 static bool classof(const Matcher *N) { 681 return N->getKind() == CheckComplexPat; 682 } 683 684 private: 685 void printImpl(raw_ostream &OS, unsigned indent) const override; isEqualImpl(const Matcher * M)686 bool isEqualImpl(const Matcher *M) const override { 687 return &cast<CheckComplexPatMatcher>(M)->Pattern == &Pattern && 688 cast<CheckComplexPatMatcher>(M)->MatchNumber == MatchNumber; 689 } 690 }; 691 692 /// CheckAndImmMatcher - This checks to see if the current node is an 'and' 693 /// with something equivalent to the specified immediate. 694 class CheckAndImmMatcher : public Matcher { 695 int64_t Value; 696 public: CheckAndImmMatcher(int64_t value)697 CheckAndImmMatcher(int64_t value) 698 : Matcher(CheckAndImm), Value(value) {} 699 getValue()700 int64_t getValue() const { return Value; } 701 classof(const Matcher * N)702 static bool classof(const Matcher *N) { 703 return N->getKind() == CheckAndImm; 704 } 705 706 private: 707 void printImpl(raw_ostream &OS, unsigned indent) const override; isEqualImpl(const Matcher * M)708 bool isEqualImpl(const Matcher *M) const override { 709 return cast<CheckAndImmMatcher>(M)->Value == Value; 710 } 711 }; 712 713 /// CheckOrImmMatcher - This checks to see if the current node is an 'and' 714 /// with something equivalent to the specified immediate. 715 class CheckOrImmMatcher : public Matcher { 716 int64_t Value; 717 public: CheckOrImmMatcher(int64_t value)718 CheckOrImmMatcher(int64_t value) 719 : Matcher(CheckOrImm), Value(value) {} 720 getValue()721 int64_t getValue() const { return Value; } 722 classof(const Matcher * N)723 static bool classof(const Matcher *N) { 724 return N->getKind() == CheckOrImm; 725 } 726 727 private: 728 void printImpl(raw_ostream &OS, unsigned indent) const override; isEqualImpl(const Matcher * M)729 bool isEqualImpl(const Matcher *M) const override { 730 return cast<CheckOrImmMatcher>(M)->Value == Value; 731 } 732 }; 733 734 /// CheckFoldableChainNodeMatcher - This checks to see if the current node 735 /// (which defines a chain operand) is safe to fold into a larger pattern. 736 class CheckFoldableChainNodeMatcher : public Matcher { 737 public: CheckFoldableChainNodeMatcher()738 CheckFoldableChainNodeMatcher() 739 : Matcher(CheckFoldableChainNode) {} 740 classof(const Matcher * N)741 static bool classof(const Matcher *N) { 742 return N->getKind() == CheckFoldableChainNode; 743 } 744 745 private: 746 void printImpl(raw_ostream &OS, unsigned indent) const override; isEqualImpl(const Matcher * M)747 bool isEqualImpl(const Matcher *M) const override { return true; } 748 }; 749 750 /// EmitIntegerMatcher - This creates a new TargetConstant. 751 class EmitIntegerMatcher : public Matcher { 752 int64_t Val; 753 MVT::SimpleValueType VT; 754 public: EmitIntegerMatcher(int64_t val,MVT::SimpleValueType vt)755 EmitIntegerMatcher(int64_t val, MVT::SimpleValueType vt) 756 : Matcher(EmitInteger), Val(val), VT(vt) {} 757 getValue()758 int64_t getValue() const { return Val; } getVT()759 MVT::SimpleValueType getVT() const { return VT; } 760 classof(const Matcher * N)761 static bool classof(const Matcher *N) { 762 return N->getKind() == EmitInteger; 763 } 764 765 private: 766 void printImpl(raw_ostream &OS, unsigned indent) const override; isEqualImpl(const Matcher * M)767 bool isEqualImpl(const Matcher *M) const override { 768 return cast<EmitIntegerMatcher>(M)->Val == Val && 769 cast<EmitIntegerMatcher>(M)->VT == VT; 770 } 771 }; 772 773 /// EmitStringIntegerMatcher - A target constant whose value is represented 774 /// by a string. 775 class EmitStringIntegerMatcher : public Matcher { 776 std::string Val; 777 MVT::SimpleValueType VT; 778 public: EmitStringIntegerMatcher(const std::string & val,MVT::SimpleValueType vt)779 EmitStringIntegerMatcher(const std::string &val, MVT::SimpleValueType vt) 780 : Matcher(EmitStringInteger), Val(val), VT(vt) {} 781 getValue()782 const std::string &getValue() const { return Val; } getVT()783 MVT::SimpleValueType getVT() const { return VT; } 784 classof(const Matcher * N)785 static bool classof(const Matcher *N) { 786 return N->getKind() == EmitStringInteger; 787 } 788 789 private: 790 void printImpl(raw_ostream &OS, unsigned indent) const override; isEqualImpl(const Matcher * M)791 bool isEqualImpl(const Matcher *M) const override { 792 return cast<EmitStringIntegerMatcher>(M)->Val == Val && 793 cast<EmitStringIntegerMatcher>(M)->VT == VT; 794 } 795 }; 796 797 /// EmitRegisterMatcher - This creates a new TargetConstant. 798 class EmitRegisterMatcher : public Matcher { 799 /// Reg - The def for the register that we're emitting. If this is null, then 800 /// this is a reference to zero_reg. 801 const CodeGenRegister *Reg; 802 MVT::SimpleValueType VT; 803 public: EmitRegisterMatcher(const CodeGenRegister * reg,MVT::SimpleValueType vt)804 EmitRegisterMatcher(const CodeGenRegister *reg, MVT::SimpleValueType vt) 805 : Matcher(EmitRegister), Reg(reg), VT(vt) {} 806 getReg()807 const CodeGenRegister *getReg() const { return Reg; } getVT()808 MVT::SimpleValueType getVT() const { return VT; } 809 classof(const Matcher * N)810 static bool classof(const Matcher *N) { 811 return N->getKind() == EmitRegister; 812 } 813 814 private: 815 void printImpl(raw_ostream &OS, unsigned indent) const override; isEqualImpl(const Matcher * M)816 bool isEqualImpl(const Matcher *M) const override { 817 return cast<EmitRegisterMatcher>(M)->Reg == Reg && 818 cast<EmitRegisterMatcher>(M)->VT == VT; 819 } 820 }; 821 822 /// EmitConvertToTargetMatcher - Emit an operation that reads a specified 823 /// recorded node and converts it from being a ISD::Constant to 824 /// ISD::TargetConstant, likewise for ConstantFP. 825 class EmitConvertToTargetMatcher : public Matcher { 826 unsigned Slot; 827 public: EmitConvertToTargetMatcher(unsigned slot)828 EmitConvertToTargetMatcher(unsigned slot) 829 : Matcher(EmitConvertToTarget), Slot(slot) {} 830 getSlot()831 unsigned getSlot() const { return Slot; } 832 classof(const Matcher * N)833 static bool classof(const Matcher *N) { 834 return N->getKind() == EmitConvertToTarget; 835 } 836 837 private: 838 void printImpl(raw_ostream &OS, unsigned indent) const override; isEqualImpl(const Matcher * M)839 bool isEqualImpl(const Matcher *M) const override { 840 return cast<EmitConvertToTargetMatcher>(M)->Slot == Slot; 841 } 842 }; 843 844 /// EmitMergeInputChainsMatcher - Emit a node that merges a list of input 845 /// chains together with a token factor. The list of nodes are the nodes in the 846 /// matched pattern that have chain input/outputs. This node adds all input 847 /// chains of these nodes if they are not themselves a node in the pattern. 848 class EmitMergeInputChainsMatcher : public Matcher { 849 SmallVector<unsigned, 3> ChainNodes; 850 public: EmitMergeInputChainsMatcher(ArrayRef<unsigned> nodes)851 EmitMergeInputChainsMatcher(ArrayRef<unsigned> nodes) 852 : Matcher(EmitMergeInputChains), ChainNodes(nodes.begin(), nodes.end()) {} 853 getNumNodes()854 unsigned getNumNodes() const { return ChainNodes.size(); } 855 getNode(unsigned i)856 unsigned getNode(unsigned i) const { 857 assert(i < ChainNodes.size()); 858 return ChainNodes[i]; 859 } 860 classof(const Matcher * N)861 static bool classof(const Matcher *N) { 862 return N->getKind() == EmitMergeInputChains; 863 } 864 865 private: 866 void printImpl(raw_ostream &OS, unsigned indent) const override; isEqualImpl(const Matcher * M)867 bool isEqualImpl(const Matcher *M) const override { 868 return cast<EmitMergeInputChainsMatcher>(M)->ChainNodes == ChainNodes; 869 } 870 }; 871 872 /// EmitCopyToRegMatcher - Emit a CopyToReg node from a value to a physreg, 873 /// pushing the chain and glue results. 874 /// 875 class EmitCopyToRegMatcher : public Matcher { 876 unsigned SrcSlot; // Value to copy into the physreg. 877 Record *DestPhysReg; 878 public: EmitCopyToRegMatcher(unsigned srcSlot,Record * destPhysReg)879 EmitCopyToRegMatcher(unsigned srcSlot, Record *destPhysReg) 880 : Matcher(EmitCopyToReg), SrcSlot(srcSlot), DestPhysReg(destPhysReg) {} 881 getSrcSlot()882 unsigned getSrcSlot() const { return SrcSlot; } getDestPhysReg()883 Record *getDestPhysReg() const { return DestPhysReg; } 884 classof(const Matcher * N)885 static bool classof(const Matcher *N) { 886 return N->getKind() == EmitCopyToReg; 887 } 888 889 private: 890 void printImpl(raw_ostream &OS, unsigned indent) const override; isEqualImpl(const Matcher * M)891 bool isEqualImpl(const Matcher *M) const override { 892 return cast<EmitCopyToRegMatcher>(M)->SrcSlot == SrcSlot && 893 cast<EmitCopyToRegMatcher>(M)->DestPhysReg == DestPhysReg; 894 } 895 }; 896 897 898 899 /// EmitNodeXFormMatcher - Emit an operation that runs an SDNodeXForm on a 900 /// recorded node and records the result. 901 class EmitNodeXFormMatcher : public Matcher { 902 unsigned Slot; 903 Record *NodeXForm; 904 public: EmitNodeXFormMatcher(unsigned slot,Record * nodeXForm)905 EmitNodeXFormMatcher(unsigned slot, Record *nodeXForm) 906 : Matcher(EmitNodeXForm), Slot(slot), NodeXForm(nodeXForm) {} 907 getSlot()908 unsigned getSlot() const { return Slot; } getNodeXForm()909 Record *getNodeXForm() const { return NodeXForm; } 910 classof(const Matcher * N)911 static bool classof(const Matcher *N) { 912 return N->getKind() == EmitNodeXForm; 913 } 914 915 private: 916 void printImpl(raw_ostream &OS, unsigned indent) const override; isEqualImpl(const Matcher * M)917 bool isEqualImpl(const Matcher *M) const override { 918 return cast<EmitNodeXFormMatcher>(M)->Slot == Slot && 919 cast<EmitNodeXFormMatcher>(M)->NodeXForm == NodeXForm; 920 } 921 }; 922 923 /// EmitNodeMatcherCommon - Common class shared between EmitNode and 924 /// MorphNodeTo. 925 class EmitNodeMatcherCommon : public Matcher { 926 std::string OpcodeName; 927 const SmallVector<MVT::SimpleValueType, 3> VTs; 928 const SmallVector<unsigned, 6> Operands; 929 bool HasChain, HasInGlue, HasOutGlue, HasMemRefs; 930 931 /// NumFixedArityOperands - If this is a fixed arity node, this is set to -1. 932 /// If this is a varidic node, this is set to the number of fixed arity 933 /// operands in the root of the pattern. The rest are appended to this node. 934 int NumFixedArityOperands; 935 public: EmitNodeMatcherCommon(const std::string & opcodeName,ArrayRef<MVT::SimpleValueType> vts,ArrayRef<unsigned> operands,bool hasChain,bool hasInGlue,bool hasOutGlue,bool hasmemrefs,int numfixedarityoperands,bool isMorphNodeTo)936 EmitNodeMatcherCommon(const std::string &opcodeName, 937 ArrayRef<MVT::SimpleValueType> vts, 938 ArrayRef<unsigned> operands, 939 bool hasChain, bool hasInGlue, bool hasOutGlue, 940 bool hasmemrefs, 941 int numfixedarityoperands, bool isMorphNodeTo) 942 : Matcher(isMorphNodeTo ? MorphNodeTo : EmitNode), OpcodeName(opcodeName), 943 VTs(vts.begin(), vts.end()), Operands(operands.begin(), operands.end()), 944 HasChain(hasChain), HasInGlue(hasInGlue), HasOutGlue(hasOutGlue), 945 HasMemRefs(hasmemrefs), NumFixedArityOperands(numfixedarityoperands) {} 946 getOpcodeName()947 const std::string &getOpcodeName() const { return OpcodeName; } 948 getNumVTs()949 unsigned getNumVTs() const { return VTs.size(); } getVT(unsigned i)950 MVT::SimpleValueType getVT(unsigned i) const { 951 assert(i < VTs.size()); 952 return VTs[i]; 953 } 954 getNumOperands()955 unsigned getNumOperands() const { return Operands.size(); } getOperand(unsigned i)956 unsigned getOperand(unsigned i) const { 957 assert(i < Operands.size()); 958 return Operands[i]; 959 } 960 getVTList()961 const SmallVectorImpl<MVT::SimpleValueType> &getVTList() const { return VTs; } getOperandList()962 const SmallVectorImpl<unsigned> &getOperandList() const { return Operands; } 963 964 hasChain()965 bool hasChain() const { return HasChain; } hasInFlag()966 bool hasInFlag() const { return HasInGlue; } hasOutFlag()967 bool hasOutFlag() const { return HasOutGlue; } hasMemRefs()968 bool hasMemRefs() const { return HasMemRefs; } getNumFixedArityOperands()969 int getNumFixedArityOperands() const { return NumFixedArityOperands; } 970 classof(const Matcher * N)971 static bool classof(const Matcher *N) { 972 return N->getKind() == EmitNode || N->getKind() == MorphNodeTo; 973 } 974 975 private: 976 void printImpl(raw_ostream &OS, unsigned indent) const override; 977 bool isEqualImpl(const Matcher *M) const override; 978 }; 979 980 /// EmitNodeMatcher - This signals a successful match and generates a node. 981 class EmitNodeMatcher : public EmitNodeMatcherCommon { 982 void anchor() override; 983 unsigned FirstResultSlot; 984 public: EmitNodeMatcher(const std::string & opcodeName,ArrayRef<MVT::SimpleValueType> vts,ArrayRef<unsigned> operands,bool hasChain,bool hasInFlag,bool hasOutFlag,bool hasmemrefs,int numfixedarityoperands,unsigned firstresultslot)985 EmitNodeMatcher(const std::string &opcodeName, 986 ArrayRef<MVT::SimpleValueType> vts, 987 ArrayRef<unsigned> operands, 988 bool hasChain, bool hasInFlag, bool hasOutFlag, 989 bool hasmemrefs, 990 int numfixedarityoperands, unsigned firstresultslot) 991 : EmitNodeMatcherCommon(opcodeName, vts, operands, hasChain, 992 hasInFlag, hasOutFlag, hasmemrefs, 993 numfixedarityoperands, false), 994 FirstResultSlot(firstresultslot) {} 995 getFirstResultSlot()996 unsigned getFirstResultSlot() const { return FirstResultSlot; } 997 classof(const Matcher * N)998 static bool classof(const Matcher *N) { 999 return N->getKind() == EmitNode; 1000 } 1001 1002 }; 1003 1004 class MorphNodeToMatcher : public EmitNodeMatcherCommon { 1005 void anchor() override; 1006 const PatternToMatch &Pattern; 1007 public: MorphNodeToMatcher(const std::string & opcodeName,ArrayRef<MVT::SimpleValueType> vts,ArrayRef<unsigned> operands,bool hasChain,bool hasInFlag,bool hasOutFlag,bool hasmemrefs,int numfixedarityoperands,const PatternToMatch & pattern)1008 MorphNodeToMatcher(const std::string &opcodeName, 1009 ArrayRef<MVT::SimpleValueType> vts, 1010 ArrayRef<unsigned> operands, 1011 bool hasChain, bool hasInFlag, bool hasOutFlag, 1012 bool hasmemrefs, 1013 int numfixedarityoperands, const PatternToMatch &pattern) 1014 : EmitNodeMatcherCommon(opcodeName, vts, operands, hasChain, 1015 hasInFlag, hasOutFlag, hasmemrefs, 1016 numfixedarityoperands, true), 1017 Pattern(pattern) { 1018 } 1019 getPattern()1020 const PatternToMatch &getPattern() const { return Pattern; } 1021 classof(const Matcher * N)1022 static bool classof(const Matcher *N) { 1023 return N->getKind() == MorphNodeTo; 1024 } 1025 }; 1026 1027 /// CompleteMatchMatcher - Complete a match by replacing the results of the 1028 /// pattern with the newly generated nodes. This also prints a comment 1029 /// indicating the source and dest patterns. 1030 class CompleteMatchMatcher : public Matcher { 1031 SmallVector<unsigned, 2> Results; 1032 const PatternToMatch &Pattern; 1033 public: CompleteMatchMatcher(ArrayRef<unsigned> results,const PatternToMatch & pattern)1034 CompleteMatchMatcher(ArrayRef<unsigned> results, 1035 const PatternToMatch &pattern) 1036 : Matcher(CompleteMatch), Results(results.begin(), results.end()), 1037 Pattern(pattern) {} 1038 getNumResults()1039 unsigned getNumResults() const { return Results.size(); } getResult(unsigned R)1040 unsigned getResult(unsigned R) const { return Results[R]; } getPattern()1041 const PatternToMatch &getPattern() const { return Pattern; } 1042 classof(const Matcher * N)1043 static bool classof(const Matcher *N) { 1044 return N->getKind() == CompleteMatch; 1045 } 1046 1047 private: 1048 void printImpl(raw_ostream &OS, unsigned indent) const override; isEqualImpl(const Matcher * M)1049 bool isEqualImpl(const Matcher *M) const override { 1050 return cast<CompleteMatchMatcher>(M)->Results == Results && 1051 &cast<CompleteMatchMatcher>(M)->Pattern == &Pattern; 1052 } 1053 }; 1054 1055 } // end namespace llvm 1056 1057 #endif 1058