1 //===- CodeGenDAGPatterns.h - Read DAG patterns from .td file ---*- 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 // This file declares the CodeGenDAGPatterns class, which is used to read and 11 // represent the patterns present in a .td file for instructions. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #ifndef LLVM_UTILS_TABLEGEN_CODEGENDAGPATTERNS_H 16 #define LLVM_UTILS_TABLEGEN_CODEGENDAGPATTERNS_H 17 18 #include "CodeGenHwModes.h" 19 #include "CodeGenIntrinsics.h" 20 #include "CodeGenTarget.h" 21 #include "SDNodeProperties.h" 22 #include "llvm/ADT/SmallVector.h" 23 #include "llvm/ADT/StringMap.h" 24 #include "llvm/ADT/StringSet.h" 25 #include "llvm/Support/ErrorHandling.h" 26 #include "llvm/Support/MathExtras.h" 27 #include <algorithm> 28 #include <array> 29 #include <functional> 30 #include <map> 31 #include <set> 32 #include <vector> 33 34 namespace llvm { 35 36 class Record; 37 class Init; 38 class ListInit; 39 class DagInit; 40 class SDNodeInfo; 41 class TreePattern; 42 class TreePatternNode; 43 class CodeGenDAGPatterns; 44 class ComplexPattern; 45 46 /// Shared pointer for TreePatternNode. 47 using TreePatternNodePtr = std::shared_ptr<TreePatternNode>; 48 49 /// This represents a set of MVTs. Since the underlying type for the MVT 50 /// is uint8_t, there are at most 256 values. To reduce the number of memory 51 /// allocations and deallocations, represent the set as a sequence of bits. 52 /// To reduce the allocations even further, make MachineValueTypeSet own 53 /// the storage and use std::array as the bit container. 54 struct MachineValueTypeSet { 55 static_assert(std::is_same<std::underlying_type<MVT::SimpleValueType>::type, 56 uint8_t>::value, 57 "Change uint8_t here to the SimpleValueType's type"); 58 static unsigned constexpr Capacity = std::numeric_limits<uint8_t>::max()+1; 59 using WordType = uint64_t; 60 static unsigned constexpr WordWidth = CHAR_BIT*sizeof(WordType); 61 static unsigned constexpr NumWords = Capacity/WordWidth; 62 static_assert(NumWords*WordWidth == Capacity, 63 "Capacity should be a multiple of WordWidth"); 64 65 LLVM_ATTRIBUTE_ALWAYS_INLINE 66 MachineValueTypeSet() { 67 clear(); 68 } 69 70 LLVM_ATTRIBUTE_ALWAYS_INLINE 71 unsigned size() const { 72 unsigned Count = 0; 73 for (WordType W : Words) 74 Count += countPopulation(W); 75 return Count; 76 } 77 LLVM_ATTRIBUTE_ALWAYS_INLINE 78 void clear() { 79 std::memset(Words.data(), 0, NumWords*sizeof(WordType)); 80 } 81 LLVM_ATTRIBUTE_ALWAYS_INLINE 82 bool empty() const { 83 for (WordType W : Words) 84 if (W != 0) 85 return false; 86 return true; 87 } 88 LLVM_ATTRIBUTE_ALWAYS_INLINE 89 unsigned count(MVT T) const { 90 return (Words[T.SimpleTy / WordWidth] >> (T.SimpleTy % WordWidth)) & 1; 91 } 92 std::pair<MachineValueTypeSet&,bool> insert(MVT T) { 93 bool V = count(T.SimpleTy); 94 Words[T.SimpleTy / WordWidth] |= WordType(1) << (T.SimpleTy % WordWidth); 95 return {*this, V}; 96 } 97 MachineValueTypeSet &insert(const MachineValueTypeSet &S) { 98 for (unsigned i = 0; i != NumWords; ++i) 99 Words[i] |= S.Words[i]; 100 return *this; 101 } 102 LLVM_ATTRIBUTE_ALWAYS_INLINE 103 void erase(MVT T) { 104 Words[T.SimpleTy / WordWidth] &= ~(WordType(1) << (T.SimpleTy % WordWidth)); 105 } 106 107 struct const_iterator { 108 // Some implementations of the C++ library require these traits to be 109 // defined. 110 using iterator_category = std::forward_iterator_tag; 111 using value_type = MVT; 112 using difference_type = ptrdiff_t; 113 using pointer = const MVT*; 114 using reference = const MVT&; 115 116 LLVM_ATTRIBUTE_ALWAYS_INLINE 117 MVT operator*() const { 118 assert(Pos != Capacity); 119 return MVT::SimpleValueType(Pos); 120 } 121 LLVM_ATTRIBUTE_ALWAYS_INLINE 122 const_iterator(const MachineValueTypeSet *S, bool End) : Set(S) { 123 Pos = End ? Capacity : find_from_pos(0); 124 } 125 LLVM_ATTRIBUTE_ALWAYS_INLINE 126 const_iterator &operator++() { 127 assert(Pos != Capacity); 128 Pos = find_from_pos(Pos+1); 129 return *this; 130 } 131 132 LLVM_ATTRIBUTE_ALWAYS_INLINE 133 bool operator==(const const_iterator &It) const { 134 return Set == It.Set && Pos == It.Pos; 135 } 136 LLVM_ATTRIBUTE_ALWAYS_INLINE 137 bool operator!=(const const_iterator &It) const { 138 return !operator==(It); 139 } 140 141 private: 142 unsigned find_from_pos(unsigned P) const { 143 unsigned SkipWords = P / WordWidth; 144 unsigned SkipBits = P % WordWidth; 145 unsigned Count = SkipWords * WordWidth; 146 147 // If P is in the middle of a word, process it manually here, because 148 // the trailing bits need to be masked off to use findFirstSet. 149 if (SkipBits != 0) { 150 WordType W = Set->Words[SkipWords]; 151 W &= maskLeadingOnes<WordType>(WordWidth-SkipBits); 152 if (W != 0) 153 return Count + findFirstSet(W); 154 Count += WordWidth; 155 SkipWords++; 156 } 157 158 for (unsigned i = SkipWords; i != NumWords; ++i) { 159 WordType W = Set->Words[i]; 160 if (W != 0) 161 return Count + findFirstSet(W); 162 Count += WordWidth; 163 } 164 return Capacity; 165 } 166 167 const MachineValueTypeSet *Set; 168 unsigned Pos; 169 }; 170 171 LLVM_ATTRIBUTE_ALWAYS_INLINE 172 const_iterator begin() const { return const_iterator(this, false); } 173 LLVM_ATTRIBUTE_ALWAYS_INLINE 174 const_iterator end() const { return const_iterator(this, true); } 175 176 LLVM_ATTRIBUTE_ALWAYS_INLINE 177 bool operator==(const MachineValueTypeSet &S) const { 178 return Words == S.Words; 179 } 180 LLVM_ATTRIBUTE_ALWAYS_INLINE 181 bool operator!=(const MachineValueTypeSet &S) const { 182 return !operator==(S); 183 } 184 185 private: 186 friend struct const_iterator; 187 std::array<WordType,NumWords> Words; 188 }; 189 190 struct TypeSetByHwMode : public InfoByHwMode<MachineValueTypeSet> { 191 using SetType = MachineValueTypeSet; 192 193 TypeSetByHwMode() = default; 194 TypeSetByHwMode(const TypeSetByHwMode &VTS) = default; 195 TypeSetByHwMode(MVT::SimpleValueType VT) 196 : TypeSetByHwMode(ValueTypeByHwMode(VT)) {} 197 TypeSetByHwMode(ValueTypeByHwMode VT) 198 : TypeSetByHwMode(ArrayRef<ValueTypeByHwMode>(&VT, 1)) {} 199 TypeSetByHwMode(ArrayRef<ValueTypeByHwMode> VTList); 200 201 SetType &getOrCreate(unsigned Mode) { 202 if (hasMode(Mode)) 203 return get(Mode); 204 return Map.insert({Mode,SetType()}).first->second; 205 } 206 207 bool isValueTypeByHwMode(bool AllowEmpty) const; 208 ValueTypeByHwMode getValueTypeByHwMode() const; 209 210 LLVM_ATTRIBUTE_ALWAYS_INLINE 211 bool isMachineValueType() const { 212 return isDefaultOnly() && Map.begin()->second.size() == 1; 213 } 214 215 LLVM_ATTRIBUTE_ALWAYS_INLINE 216 MVT getMachineValueType() const { 217 assert(isMachineValueType()); 218 return *Map.begin()->second.begin(); 219 } 220 221 bool isPossible() const; 222 223 LLVM_ATTRIBUTE_ALWAYS_INLINE 224 bool isDefaultOnly() const { 225 return Map.size() == 1 && Map.begin()->first == DefaultMode; 226 } 227 228 bool insert(const ValueTypeByHwMode &VVT); 229 bool constrain(const TypeSetByHwMode &VTS); 230 template <typename Predicate> bool constrain(Predicate P); 231 template <typename Predicate> 232 bool assign_if(const TypeSetByHwMode &VTS, Predicate P); 233 234 void writeToStream(raw_ostream &OS) const; 235 static void writeToStream(const SetType &S, raw_ostream &OS); 236 237 bool operator==(const TypeSetByHwMode &VTS) const; 238 bool operator!=(const TypeSetByHwMode &VTS) const { return !(*this == VTS); } 239 240 void dump() const; 241 bool validate() const; 242 243 private: 244 /// Intersect two sets. Return true if anything has changed. 245 bool intersect(SetType &Out, const SetType &In); 246 }; 247 248 raw_ostream &operator<<(raw_ostream &OS, const TypeSetByHwMode &T); 249 250 struct TypeInfer { 251 TypeInfer(TreePattern &T) : TP(T), ForceMode(0) {} 252 253 bool isConcrete(const TypeSetByHwMode &VTS, bool AllowEmpty) const { 254 return VTS.isValueTypeByHwMode(AllowEmpty); 255 } 256 ValueTypeByHwMode getConcrete(const TypeSetByHwMode &VTS, 257 bool AllowEmpty) const { 258 assert(VTS.isValueTypeByHwMode(AllowEmpty)); 259 return VTS.getValueTypeByHwMode(); 260 } 261 262 /// The protocol in the following functions (Merge*, force*, Enforce*, 263 /// expand*) is to return "true" if a change has been made, "false" 264 /// otherwise. 265 266 bool MergeInTypeInfo(TypeSetByHwMode &Out, const TypeSetByHwMode &In); 267 bool MergeInTypeInfo(TypeSetByHwMode &Out, MVT::SimpleValueType InVT) { 268 return MergeInTypeInfo(Out, TypeSetByHwMode(InVT)); 269 } 270 bool MergeInTypeInfo(TypeSetByHwMode &Out, ValueTypeByHwMode InVT) { 271 return MergeInTypeInfo(Out, TypeSetByHwMode(InVT)); 272 } 273 274 /// Reduce the set \p Out to have at most one element for each mode. 275 bool forceArbitrary(TypeSetByHwMode &Out); 276 277 /// The following four functions ensure that upon return the set \p Out 278 /// will only contain types of the specified kind: integer, floating-point, 279 /// scalar, or vector. 280 /// If \p Out is empty, all legal types of the specified kind will be added 281 /// to it. Otherwise, all types that are not of the specified kind will be 282 /// removed from \p Out. 283 bool EnforceInteger(TypeSetByHwMode &Out); 284 bool EnforceFloatingPoint(TypeSetByHwMode &Out); 285 bool EnforceScalar(TypeSetByHwMode &Out); 286 bool EnforceVector(TypeSetByHwMode &Out); 287 288 /// If \p Out is empty, fill it with all legal types. Otherwise, leave it 289 /// unchanged. 290 bool EnforceAny(TypeSetByHwMode &Out); 291 /// Make sure that for each type in \p Small, there exists a larger type 292 /// in \p Big. 293 bool EnforceSmallerThan(TypeSetByHwMode &Small, TypeSetByHwMode &Big); 294 /// 1. Ensure that for each type T in \p Vec, T is a vector type, and that 295 /// for each type U in \p Elem, U is a scalar type. 296 /// 2. Ensure that for each (scalar) type U in \p Elem, there exists a 297 /// (vector) type T in \p Vec, such that U is the element type of T. 298 bool EnforceVectorEltTypeIs(TypeSetByHwMode &Vec, TypeSetByHwMode &Elem); 299 bool EnforceVectorEltTypeIs(TypeSetByHwMode &Vec, 300 const ValueTypeByHwMode &VVT); 301 /// Ensure that for each type T in \p Sub, T is a vector type, and there 302 /// exists a type U in \p Vec such that U is a vector type with the same 303 /// element type as T and at least as many elements as T. 304 bool EnforceVectorSubVectorTypeIs(TypeSetByHwMode &Vec, 305 TypeSetByHwMode &Sub); 306 /// 1. Ensure that \p V has a scalar type iff \p W has a scalar type. 307 /// 2. Ensure that for each vector type T in \p V, there exists a vector 308 /// type U in \p W, such that T and U have the same number of elements. 309 /// 3. Ensure that for each vector type U in \p W, there exists a vector 310 /// type T in \p V, such that T and U have the same number of elements 311 /// (reverse of 2). 312 bool EnforceSameNumElts(TypeSetByHwMode &V, TypeSetByHwMode &W); 313 /// 1. Ensure that for each type T in \p A, there exists a type U in \p B, 314 /// such that T and U have equal size in bits. 315 /// 2. Ensure that for each type U in \p B, there exists a type T in \p A 316 /// such that T and U have equal size in bits (reverse of 1). 317 bool EnforceSameSize(TypeSetByHwMode &A, TypeSetByHwMode &B); 318 319 /// For each overloaded type (i.e. of form *Any), replace it with the 320 /// corresponding subset of legal, specific types. 321 void expandOverloads(TypeSetByHwMode &VTS); 322 void expandOverloads(TypeSetByHwMode::SetType &Out, 323 const TypeSetByHwMode::SetType &Legal); 324 325 struct ValidateOnExit { 326 ValidateOnExit(TypeSetByHwMode &T, TypeInfer &TI) : Infer(TI), VTS(T) {} 327 #ifndef NDEBUG 328 ~ValidateOnExit(); 329 #else 330 ~ValidateOnExit() {} // Empty destructor with NDEBUG. 331 #endif 332 TypeInfer &Infer; 333 TypeSetByHwMode &VTS; 334 }; 335 336 TreePattern &TP; 337 unsigned ForceMode; // Mode to use when set. 338 bool CodeGen = false; // Set during generation of matcher code. 339 340 private: 341 TypeSetByHwMode getLegalTypes(); 342 343 /// Cached legal types. 344 bool LegalTypesCached = false; 345 TypeSetByHwMode::SetType LegalCache = {}; 346 }; 347 348 /// Set type used to track multiply used variables in patterns 349 typedef StringSet<> MultipleUseVarSet; 350 351 /// SDTypeConstraint - This is a discriminated union of constraints, 352 /// corresponding to the SDTypeConstraint tablegen class in Target.td. 353 struct SDTypeConstraint { 354 SDTypeConstraint(Record *R, const CodeGenHwModes &CGH); 355 356 unsigned OperandNo; // The operand # this constraint applies to. 357 enum { 358 SDTCisVT, SDTCisPtrTy, SDTCisInt, SDTCisFP, SDTCisVec, SDTCisSameAs, 359 SDTCisVTSmallerThanOp, SDTCisOpSmallerThanOp, SDTCisEltOfVec, 360 SDTCisSubVecOfVec, SDTCVecEltisVT, SDTCisSameNumEltsAs, SDTCisSameSizeAs 361 } ConstraintType; 362 363 union { // The discriminated union. 364 struct { 365 unsigned OtherOperandNum; 366 } SDTCisSameAs_Info; 367 struct { 368 unsigned OtherOperandNum; 369 } SDTCisVTSmallerThanOp_Info; 370 struct { 371 unsigned BigOperandNum; 372 } SDTCisOpSmallerThanOp_Info; 373 struct { 374 unsigned OtherOperandNum; 375 } SDTCisEltOfVec_Info; 376 struct { 377 unsigned OtherOperandNum; 378 } SDTCisSubVecOfVec_Info; 379 struct { 380 unsigned OtherOperandNum; 381 } SDTCisSameNumEltsAs_Info; 382 struct { 383 unsigned OtherOperandNum; 384 } SDTCisSameSizeAs_Info; 385 } x; 386 387 // The VT for SDTCisVT and SDTCVecEltisVT. 388 // Must not be in the union because it has a non-trivial destructor. 389 ValueTypeByHwMode VVT; 390 391 /// ApplyTypeConstraint - Given a node in a pattern, apply this type 392 /// constraint to the nodes operands. This returns true if it makes a 393 /// change, false otherwise. If a type contradiction is found, an error 394 /// is flagged. 395 bool ApplyTypeConstraint(TreePatternNode *N, const SDNodeInfo &NodeInfo, 396 TreePattern &TP) const; 397 }; 398 399 /// SDNodeInfo - One of these records is created for each SDNode instance in 400 /// the target .td file. This represents the various dag nodes we will be 401 /// processing. 402 class SDNodeInfo { 403 Record *Def; 404 StringRef EnumName; 405 StringRef SDClassName; 406 unsigned Properties; 407 unsigned NumResults; 408 int NumOperands; 409 std::vector<SDTypeConstraint> TypeConstraints; 410 public: 411 // Parse the specified record. 412 SDNodeInfo(Record *R, const CodeGenHwModes &CGH); 413 414 unsigned getNumResults() const { return NumResults; } 415 416 /// getNumOperands - This is the number of operands required or -1 if 417 /// variadic. 418 int getNumOperands() const { return NumOperands; } 419 Record *getRecord() const { return Def; } 420 StringRef getEnumName() const { return EnumName; } 421 StringRef getSDClassName() const { return SDClassName; } 422 423 const std::vector<SDTypeConstraint> &getTypeConstraints() const { 424 return TypeConstraints; 425 } 426 427 /// getKnownType - If the type constraints on this node imply a fixed type 428 /// (e.g. all stores return void, etc), then return it as an 429 /// MVT::SimpleValueType. Otherwise, return MVT::Other. 430 MVT::SimpleValueType getKnownType(unsigned ResNo) const; 431 432 /// hasProperty - Return true if this node has the specified property. 433 /// 434 bool hasProperty(enum SDNP Prop) const { return Properties & (1 << Prop); } 435 436 /// ApplyTypeConstraints - Given a node in a pattern, apply the type 437 /// constraints for this node to the operands of the node. This returns 438 /// true if it makes a change, false otherwise. If a type contradiction is 439 /// found, an error is flagged. 440 bool ApplyTypeConstraints(TreePatternNode *N, TreePattern &TP) const; 441 }; 442 443 /// TreePredicateFn - This is an abstraction that represents the predicates on 444 /// a PatFrag node. This is a simple one-word wrapper around a pointer to 445 /// provide nice accessors. 446 class TreePredicateFn { 447 /// PatFragRec - This is the TreePattern for the PatFrag that we 448 /// originally came from. 449 TreePattern *PatFragRec; 450 public: 451 /// TreePredicateFn constructor. Here 'N' is a subclass of PatFrag. 452 TreePredicateFn(TreePattern *N); 453 454 455 TreePattern *getOrigPatFragRecord() const { return PatFragRec; } 456 457 /// isAlwaysTrue - Return true if this is a noop predicate. 458 bool isAlwaysTrue() const; 459 460 bool isImmediatePattern() const { return hasImmCode(); } 461 462 /// getImmediatePredicateCode - Return the code that evaluates this pattern if 463 /// this is an immediate predicate. It is an error to call this on a 464 /// non-immediate pattern. 465 std::string getImmediatePredicateCode() const { 466 std::string Result = getImmCode(); 467 assert(!Result.empty() && "Isn't an immediate pattern!"); 468 return Result; 469 } 470 471 bool operator==(const TreePredicateFn &RHS) const { 472 return PatFragRec == RHS.PatFragRec; 473 } 474 475 bool operator!=(const TreePredicateFn &RHS) const { return !(*this == RHS); } 476 477 /// Return the name to use in the generated code to reference this, this is 478 /// "Predicate_foo" if from a pattern fragment "foo". 479 std::string getFnName() const; 480 481 /// getCodeToRunOnSDNode - Return the code for the function body that 482 /// evaluates this predicate. The argument is expected to be in "Node", 483 /// not N. This handles casting and conversion to a concrete node type as 484 /// appropriate. 485 std::string getCodeToRunOnSDNode() const; 486 487 /// Get the data type of the argument to getImmediatePredicateCode(). 488 StringRef getImmType() const; 489 490 /// Get a string that describes the type returned by getImmType() but is 491 /// usable as part of an identifier. 492 StringRef getImmTypeIdentifier() const; 493 494 // Is the desired predefined predicate for a load? 495 bool isLoad() const; 496 // Is the desired predefined predicate for a store? 497 bool isStore() const; 498 // Is the desired predefined predicate for an atomic? 499 bool isAtomic() const; 500 501 /// Is this predicate the predefined unindexed load predicate? 502 /// Is this predicate the predefined unindexed store predicate? 503 bool isUnindexed() const; 504 /// Is this predicate the predefined non-extending load predicate? 505 bool isNonExtLoad() const; 506 /// Is this predicate the predefined any-extend load predicate? 507 bool isAnyExtLoad() const; 508 /// Is this predicate the predefined sign-extend load predicate? 509 bool isSignExtLoad() const; 510 /// Is this predicate the predefined zero-extend load predicate? 511 bool isZeroExtLoad() const; 512 /// Is this predicate the predefined non-truncating store predicate? 513 bool isNonTruncStore() const; 514 /// Is this predicate the predefined truncating store predicate? 515 bool isTruncStore() const; 516 517 /// Is this predicate the predefined monotonic atomic predicate? 518 bool isAtomicOrderingMonotonic() const; 519 /// Is this predicate the predefined acquire atomic predicate? 520 bool isAtomicOrderingAcquire() const; 521 /// Is this predicate the predefined release atomic predicate? 522 bool isAtomicOrderingRelease() const; 523 /// Is this predicate the predefined acquire-release atomic predicate? 524 bool isAtomicOrderingAcquireRelease() const; 525 /// Is this predicate the predefined sequentially consistent atomic predicate? 526 bool isAtomicOrderingSequentiallyConsistent() const; 527 528 /// Is this predicate the predefined acquire-or-stronger atomic predicate? 529 bool isAtomicOrderingAcquireOrStronger() const; 530 /// Is this predicate the predefined weaker-than-acquire atomic predicate? 531 bool isAtomicOrderingWeakerThanAcquire() const; 532 533 /// Is this predicate the predefined release-or-stronger atomic predicate? 534 bool isAtomicOrderingReleaseOrStronger() const; 535 /// Is this predicate the predefined weaker-than-release atomic predicate? 536 bool isAtomicOrderingWeakerThanRelease() const; 537 538 /// If non-null, indicates that this predicate is a predefined memory VT 539 /// predicate for a load/store and returns the ValueType record for the memory VT. 540 Record *getMemoryVT() const; 541 /// If non-null, indicates that this predicate is a predefined memory VT 542 /// predicate (checking only the scalar type) for load/store and returns the 543 /// ValueType record for the memory VT. 544 Record *getScalarMemoryVT() const; 545 546 // If true, indicates that GlobalISel-based C++ code was supplied. 547 bool hasGISelPredicateCode() const; 548 std::string getGISelPredicateCode() const; 549 550 private: 551 bool hasPredCode() const; 552 bool hasImmCode() const; 553 std::string getPredCode() const; 554 std::string getImmCode() const; 555 bool immCodeUsesAPInt() const; 556 bool immCodeUsesAPFloat() const; 557 558 bool isPredefinedPredicateEqualTo(StringRef Field, bool Value) const; 559 }; 560 561 562 class TreePatternNode { 563 /// The type of each node result. Before and during type inference, each 564 /// result may be a set of possible types. After (successful) type inference, 565 /// each is a single concrete type. 566 std::vector<TypeSetByHwMode> Types; 567 568 /// Operator - The Record for the operator if this is an interior node (not 569 /// a leaf). 570 Record *Operator; 571 572 /// Val - The init value (e.g. the "GPRC" record, or "7") for a leaf. 573 /// 574 Init *Val; 575 576 /// Name - The name given to this node with the :$foo notation. 577 /// 578 std::string Name; 579 580 /// PredicateFns - The predicate functions to execute on this node to check 581 /// for a match. If this list is empty, no predicate is involved. 582 std::vector<TreePredicateFn> PredicateFns; 583 584 /// TransformFn - The transformation function to execute on this node before 585 /// it can be substituted into the resulting instruction on a pattern match. 586 Record *TransformFn; 587 588 std::vector<TreePatternNodePtr> Children; 589 590 public: 591 TreePatternNode(Record *Op, std::vector<TreePatternNodePtr> &Ch, 592 unsigned NumResults) 593 : Operator(Op), Val(nullptr), TransformFn(nullptr), Children(Ch) { 594 Types.resize(NumResults); 595 } 596 TreePatternNode(Init *val, unsigned NumResults) // leaf ctor 597 : Operator(nullptr), Val(val), TransformFn(nullptr) { 598 Types.resize(NumResults); 599 } 600 601 bool hasName() const { return !Name.empty(); } 602 const std::string &getName() const { return Name; } 603 void setName(StringRef N) { Name.assign(N.begin(), N.end()); } 604 605 bool isLeaf() const { return Val != nullptr; } 606 607 // Type accessors. 608 unsigned getNumTypes() const { return Types.size(); } 609 ValueTypeByHwMode getType(unsigned ResNo) const { 610 return Types[ResNo].getValueTypeByHwMode(); 611 } 612 const std::vector<TypeSetByHwMode> &getExtTypes() const { return Types; } 613 const TypeSetByHwMode &getExtType(unsigned ResNo) const { 614 return Types[ResNo]; 615 } 616 TypeSetByHwMode &getExtType(unsigned ResNo) { return Types[ResNo]; } 617 void setType(unsigned ResNo, const TypeSetByHwMode &T) { Types[ResNo] = T; } 618 MVT::SimpleValueType getSimpleType(unsigned ResNo) const { 619 return Types[ResNo].getMachineValueType().SimpleTy; 620 } 621 622 bool hasConcreteType(unsigned ResNo) const { 623 return Types[ResNo].isValueTypeByHwMode(false); 624 } 625 bool isTypeCompletelyUnknown(unsigned ResNo, TreePattern &TP) const { 626 return Types[ResNo].empty(); 627 } 628 629 Init *getLeafValue() const { assert(isLeaf()); return Val; } 630 Record *getOperator() const { assert(!isLeaf()); return Operator; } 631 632 unsigned getNumChildren() const { return Children.size(); } 633 TreePatternNode *getChild(unsigned N) const { return Children[N].get(); } 634 const TreePatternNodePtr &getChildShared(unsigned N) const { 635 return Children[N]; 636 } 637 void setChild(unsigned i, TreePatternNodePtr N) { Children[i] = N; } 638 639 /// hasChild - Return true if N is any of our children. 640 bool hasChild(const TreePatternNode *N) const { 641 for (unsigned i = 0, e = Children.size(); i != e; ++i) 642 if (Children[i].get() == N) 643 return true; 644 return false; 645 } 646 647 bool hasProperTypeByHwMode() const; 648 bool hasPossibleType() const; 649 bool setDefaultMode(unsigned Mode); 650 651 bool hasAnyPredicate() const { return !PredicateFns.empty(); } 652 653 const std::vector<TreePredicateFn> &getPredicateFns() const { 654 return PredicateFns; 655 } 656 void clearPredicateFns() { PredicateFns.clear(); } 657 void setPredicateFns(const std::vector<TreePredicateFn> &Fns) { 658 assert(PredicateFns.empty() && "Overwriting non-empty predicate list!"); 659 PredicateFns = Fns; 660 } 661 void addPredicateFn(const TreePredicateFn &Fn) { 662 assert(!Fn.isAlwaysTrue() && "Empty predicate string!"); 663 if (!is_contained(PredicateFns, Fn)) 664 PredicateFns.push_back(Fn); 665 } 666 667 Record *getTransformFn() const { return TransformFn; } 668 void setTransformFn(Record *Fn) { TransformFn = Fn; } 669 670 /// getIntrinsicInfo - If this node corresponds to an intrinsic, return the 671 /// CodeGenIntrinsic information for it, otherwise return a null pointer. 672 const CodeGenIntrinsic *getIntrinsicInfo(const CodeGenDAGPatterns &CDP) const; 673 674 /// getComplexPatternInfo - If this node corresponds to a ComplexPattern, 675 /// return the ComplexPattern information, otherwise return null. 676 const ComplexPattern * 677 getComplexPatternInfo(const CodeGenDAGPatterns &CGP) const; 678 679 /// Returns the number of MachineInstr operands that would be produced by this 680 /// node if it mapped directly to an output Instruction's 681 /// operand. ComplexPattern specifies this explicitly; MIOperandInfo gives it 682 /// for Operands; otherwise 1. 683 unsigned getNumMIResults(const CodeGenDAGPatterns &CGP) const; 684 685 /// NodeHasProperty - Return true if this node has the specified property. 686 bool NodeHasProperty(SDNP Property, const CodeGenDAGPatterns &CGP) const; 687 688 /// TreeHasProperty - Return true if any node in this tree has the specified 689 /// property. 690 bool TreeHasProperty(SDNP Property, const CodeGenDAGPatterns &CGP) const; 691 692 /// isCommutativeIntrinsic - Return true if the node is an intrinsic which is 693 /// marked isCommutative. 694 bool isCommutativeIntrinsic(const CodeGenDAGPatterns &CDP) const; 695 696 void print(raw_ostream &OS) const; 697 void dump() const; 698 699 public: // Higher level manipulation routines. 700 701 /// clone - Return a new copy of this tree. 702 /// 703 TreePatternNodePtr clone() const; 704 705 /// RemoveAllTypes - Recursively strip all the types of this tree. 706 void RemoveAllTypes(); 707 708 /// isIsomorphicTo - Return true if this node is recursively isomorphic to 709 /// the specified node. For this comparison, all of the state of the node 710 /// is considered, except for the assigned name. Nodes with differing names 711 /// that are otherwise identical are considered isomorphic. 712 bool isIsomorphicTo(const TreePatternNode *N, 713 const MultipleUseVarSet &DepVars) const; 714 715 /// SubstituteFormalArguments - Replace the formal arguments in this tree 716 /// with actual values specified by ArgMap. 717 void 718 SubstituteFormalArguments(std::map<std::string, TreePatternNodePtr> &ArgMap); 719 720 /// InlinePatternFragments - If this pattern refers to any pattern 721 /// fragments, inline them into place, giving us a pattern without any 722 /// PatFrag references. 723 TreePatternNodePtr InlinePatternFragments(TreePatternNodePtr T, 724 TreePattern &TP); 725 726 /// ApplyTypeConstraints - Apply all of the type constraints relevant to 727 /// this node and its children in the tree. This returns true if it makes a 728 /// change, false otherwise. If a type contradiction is found, flag an error. 729 bool ApplyTypeConstraints(TreePattern &TP, bool NotRegisters); 730 731 /// UpdateNodeType - Set the node type of N to VT if VT contains 732 /// information. If N already contains a conflicting type, then flag an 733 /// error. This returns true if any information was updated. 734 /// 735 bool UpdateNodeType(unsigned ResNo, const TypeSetByHwMode &InTy, 736 TreePattern &TP); 737 bool UpdateNodeType(unsigned ResNo, MVT::SimpleValueType InTy, 738 TreePattern &TP); 739 bool UpdateNodeType(unsigned ResNo, ValueTypeByHwMode InTy, 740 TreePattern &TP); 741 742 // Update node type with types inferred from an instruction operand or result 743 // def from the ins/outs lists. 744 // Return true if the type changed. 745 bool UpdateNodeTypeFromInst(unsigned ResNo, Record *Operand, TreePattern &TP); 746 747 /// ContainsUnresolvedType - Return true if this tree contains any 748 /// unresolved types. 749 bool ContainsUnresolvedType(TreePattern &TP) const; 750 751 /// canPatternMatch - If it is impossible for this pattern to match on this 752 /// target, fill in Reason and return false. Otherwise, return true. 753 bool canPatternMatch(std::string &Reason, const CodeGenDAGPatterns &CDP); 754 }; 755 756 inline raw_ostream &operator<<(raw_ostream &OS, const TreePatternNode &TPN) { 757 TPN.print(OS); 758 return OS; 759 } 760 761 762 /// TreePattern - Represent a pattern, used for instructions, pattern 763 /// fragments, etc. 764 /// 765 class TreePattern { 766 /// Trees - The list of pattern trees which corresponds to this pattern. 767 /// Note that PatFrag's only have a single tree. 768 /// 769 std::vector<TreePatternNodePtr> Trees; 770 771 /// NamedNodes - This is all of the nodes that have names in the trees in this 772 /// pattern. 773 StringMap<SmallVector<TreePatternNode *, 1>> NamedNodes; 774 775 /// TheRecord - The actual TableGen record corresponding to this pattern. 776 /// 777 Record *TheRecord; 778 779 /// Args - This is a list of all of the arguments to this pattern (for 780 /// PatFrag patterns), which are the 'node' markers in this pattern. 781 std::vector<std::string> Args; 782 783 /// CDP - the top-level object coordinating this madness. 784 /// 785 CodeGenDAGPatterns &CDP; 786 787 /// isInputPattern - True if this is an input pattern, something to match. 788 /// False if this is an output pattern, something to emit. 789 bool isInputPattern; 790 791 /// hasError - True if the currently processed nodes have unresolvable types 792 /// or other non-fatal errors 793 bool HasError; 794 795 /// It's important that the usage of operands in ComplexPatterns is 796 /// consistent: each named operand can be defined by at most one 797 /// ComplexPattern. This records the ComplexPattern instance and the operand 798 /// number for each operand encountered in a ComplexPattern to aid in that 799 /// check. 800 StringMap<std::pair<Record *, unsigned>> ComplexPatternOperands; 801 802 TypeInfer Infer; 803 804 public: 805 806 /// TreePattern constructor - Parse the specified DagInits into the 807 /// current record. 808 TreePattern(Record *TheRec, ListInit *RawPat, bool isInput, 809 CodeGenDAGPatterns &ise); 810 TreePattern(Record *TheRec, DagInit *Pat, bool isInput, 811 CodeGenDAGPatterns &ise); 812 TreePattern(Record *TheRec, TreePatternNodePtr Pat, bool isInput, 813 CodeGenDAGPatterns &ise); 814 815 /// getTrees - Return the tree patterns which corresponds to this pattern. 816 /// 817 const std::vector<TreePatternNodePtr> &getTrees() const { return Trees; } 818 unsigned getNumTrees() const { return Trees.size(); } 819 const TreePatternNodePtr &getTree(unsigned i) const { return Trees[i]; } 820 void setTree(unsigned i, TreePatternNodePtr Tree) { Trees[i] = Tree; } 821 const TreePatternNodePtr &getOnlyTree() const { 822 assert(Trees.size() == 1 && "Doesn't have exactly one pattern!"); 823 return Trees[0]; 824 } 825 826 const StringMap<SmallVector<TreePatternNode *, 1>> &getNamedNodesMap() { 827 if (NamedNodes.empty()) 828 ComputeNamedNodes(); 829 return NamedNodes; 830 } 831 832 /// getRecord - Return the actual TableGen record corresponding to this 833 /// pattern. 834 /// 835 Record *getRecord() const { return TheRecord; } 836 837 unsigned getNumArgs() const { return Args.size(); } 838 const std::string &getArgName(unsigned i) const { 839 assert(i < Args.size() && "Argument reference out of range!"); 840 return Args[i]; 841 } 842 std::vector<std::string> &getArgList() { return Args; } 843 844 CodeGenDAGPatterns &getDAGPatterns() const { return CDP; } 845 846 /// InlinePatternFragments - If this pattern refers to any pattern 847 /// fragments, inline them into place, giving us a pattern without any 848 /// PatFrag references. 849 void InlinePatternFragments() { 850 for (unsigned i = 0, e = Trees.size(); i != e; ++i) 851 Trees[i] = Trees[i]->InlinePatternFragments(Trees[i], *this); 852 } 853 854 /// InferAllTypes - Infer/propagate as many types throughout the expression 855 /// patterns as possible. Return true if all types are inferred, false 856 /// otherwise. Bail out if a type contradiction is found. 857 bool InferAllTypes( 858 const StringMap<SmallVector<TreePatternNode *, 1>> *NamedTypes = nullptr); 859 860 /// error - If this is the first error in the current resolution step, 861 /// print it and set the error flag. Otherwise, continue silently. 862 void error(const Twine &Msg); 863 bool hasError() const { 864 return HasError; 865 } 866 void resetError() { 867 HasError = false; 868 } 869 870 TypeInfer &getInfer() { return Infer; } 871 872 void print(raw_ostream &OS) const; 873 void dump() const; 874 875 private: 876 TreePatternNodePtr ParseTreePattern(Init *DI, StringRef OpName); 877 void ComputeNamedNodes(); 878 void ComputeNamedNodes(TreePatternNode *N); 879 }; 880 881 882 inline bool TreePatternNode::UpdateNodeType(unsigned ResNo, 883 const TypeSetByHwMode &InTy, 884 TreePattern &TP) { 885 TypeSetByHwMode VTS(InTy); 886 TP.getInfer().expandOverloads(VTS); 887 return TP.getInfer().MergeInTypeInfo(Types[ResNo], VTS); 888 } 889 890 inline bool TreePatternNode::UpdateNodeType(unsigned ResNo, 891 MVT::SimpleValueType InTy, 892 TreePattern &TP) { 893 TypeSetByHwMode VTS(InTy); 894 TP.getInfer().expandOverloads(VTS); 895 return TP.getInfer().MergeInTypeInfo(Types[ResNo], VTS); 896 } 897 898 inline bool TreePatternNode::UpdateNodeType(unsigned ResNo, 899 ValueTypeByHwMode InTy, 900 TreePattern &TP) { 901 TypeSetByHwMode VTS(InTy); 902 TP.getInfer().expandOverloads(VTS); 903 return TP.getInfer().MergeInTypeInfo(Types[ResNo], VTS); 904 } 905 906 907 /// DAGDefaultOperand - One of these is created for each OperandWithDefaultOps 908 /// that has a set ExecuteAlways / DefaultOps field. 909 struct DAGDefaultOperand { 910 std::vector<TreePatternNodePtr> DefaultOps; 911 }; 912 913 class DAGInstruction { 914 std::unique_ptr<TreePattern> Pattern; 915 std::vector<Record*> Results; 916 std::vector<Record*> Operands; 917 std::vector<Record*> ImpResults; 918 TreePatternNodePtr ResultPattern; 919 920 public: 921 DAGInstruction(std::unique_ptr<TreePattern> &&TP, 922 const std::vector<Record*> &results, 923 const std::vector<Record*> &operands, 924 const std::vector<Record*> &impresults) 925 : Pattern(std::move(TP)), Results(results), Operands(operands), 926 ImpResults(impresults), ResultPattern(nullptr) {} 927 928 TreePattern *getPattern() const { return Pattern.get(); } 929 unsigned getNumResults() const { return Results.size(); } 930 unsigned getNumOperands() const { return Operands.size(); } 931 unsigned getNumImpResults() const { return ImpResults.size(); } 932 const std::vector<Record*>& getImpResults() const { return ImpResults; } 933 934 void setResultPattern(TreePatternNodePtr R) { ResultPattern = R; } 935 936 Record *getResult(unsigned RN) const { 937 assert(RN < Results.size()); 938 return Results[RN]; 939 } 940 941 Record *getOperand(unsigned ON) const { 942 assert(ON < Operands.size()); 943 return Operands[ON]; 944 } 945 946 Record *getImpResult(unsigned RN) const { 947 assert(RN < ImpResults.size()); 948 return ImpResults[RN]; 949 } 950 951 TreePatternNodePtr getResultPattern() const { return ResultPattern; } 952 }; 953 954 /// This class represents a condition that has to be satisfied for a pattern 955 /// to be tried. It is a generalization of a class "Pattern" from Target.td: 956 /// in addition to the Target.td's predicates, this class can also represent 957 /// conditions associated with HW modes. Both types will eventually become 958 /// strings containing C++ code to be executed, the difference is in how 959 /// these strings are generated. 960 class Predicate { 961 public: 962 Predicate(Record *R, bool C = true) : Def(R), IfCond(C), IsHwMode(false) { 963 assert(R->isSubClassOf("Predicate") && 964 "Predicate objects should only be created for records derived" 965 "from Predicate class"); 966 } 967 Predicate(StringRef FS, bool C = true) : Def(nullptr), Features(FS.str()), 968 IfCond(C), IsHwMode(true) {} 969 970 /// Return a string which contains the C++ condition code that will serve 971 /// as a predicate during instruction selection. 972 std::string getCondString() const { 973 // The string will excute in a subclass of SelectionDAGISel. 974 // Cast to std::string explicitly to avoid ambiguity with StringRef. 975 std::string C = IsHwMode 976 ? std::string("MF->getSubtarget().checkFeatures(\"" + Features + "\")") 977 : std::string(Def->getValueAsString("CondString")); 978 return IfCond ? C : "!("+C+')'; 979 } 980 bool operator==(const Predicate &P) const { 981 return IfCond == P.IfCond && IsHwMode == P.IsHwMode && Def == P.Def; 982 } 983 bool operator<(const Predicate &P) const { 984 if (IsHwMode != P.IsHwMode) 985 return IsHwMode < P.IsHwMode; 986 assert(!Def == !P.Def && "Inconsistency between Def and IsHwMode"); 987 if (IfCond != P.IfCond) 988 return IfCond < P.IfCond; 989 if (Def) 990 return LessRecord()(Def, P.Def); 991 return Features < P.Features; 992 } 993 Record *Def; ///< Predicate definition from .td file, null for 994 ///< HW modes. 995 std::string Features; ///< Feature string for HW mode. 996 bool IfCond; ///< The boolean value that the condition has to 997 ///< evaluate to for this predicate to be true. 998 bool IsHwMode; ///< Does this predicate correspond to a HW mode? 999 }; 1000 1001 /// PatternToMatch - Used by CodeGenDAGPatterns to keep tab of patterns 1002 /// processed to produce isel. 1003 class PatternToMatch { 1004 public: 1005 PatternToMatch(Record *srcrecord, std::vector<Predicate> preds, 1006 TreePatternNodePtr src, TreePatternNodePtr dst, 1007 std::vector<Record *> dstregs, int complexity, 1008 unsigned uid, unsigned setmode = 0) 1009 : SrcRecord(srcrecord), SrcPattern(src), DstPattern(dst), 1010 Predicates(std::move(preds)), Dstregs(std::move(dstregs)), 1011 AddedComplexity(complexity), ID(uid), ForceMode(setmode) {} 1012 1013 Record *SrcRecord; // Originating Record for the pattern. 1014 TreePatternNodePtr SrcPattern; // Source pattern to match. 1015 TreePatternNodePtr DstPattern; // Resulting pattern. 1016 std::vector<Predicate> Predicates; // Top level predicate conditions 1017 // to match. 1018 std::vector<Record*> Dstregs; // Physical register defs being matched. 1019 int AddedComplexity; // Add to matching pattern complexity. 1020 unsigned ID; // Unique ID for the record. 1021 unsigned ForceMode; // Force this mode in type inference when set. 1022 1023 Record *getSrcRecord() const { return SrcRecord; } 1024 TreePatternNode *getSrcPattern() const { return SrcPattern.get(); } 1025 TreePatternNodePtr getSrcPatternShared() const { return SrcPattern; } 1026 TreePatternNode *getDstPattern() const { return DstPattern.get(); } 1027 TreePatternNodePtr getDstPatternShared() const { return DstPattern; } 1028 const std::vector<Record*> &getDstRegs() const { return Dstregs; } 1029 int getAddedComplexity() const { return AddedComplexity; } 1030 const std::vector<Predicate> &getPredicates() const { return Predicates; } 1031 1032 std::string getPredicateCheck() const; 1033 1034 /// Compute the complexity metric for the input pattern. This roughly 1035 /// corresponds to the number of nodes that are covered. 1036 int getPatternComplexity(const CodeGenDAGPatterns &CGP) const; 1037 }; 1038 1039 class CodeGenDAGPatterns { 1040 RecordKeeper &Records; 1041 CodeGenTarget Target; 1042 CodeGenIntrinsicTable Intrinsics; 1043 CodeGenIntrinsicTable TgtIntrinsics; 1044 1045 std::map<Record*, SDNodeInfo, LessRecordByID> SDNodes; 1046 std::map<Record*, std::pair<Record*, std::string>, LessRecordByID> 1047 SDNodeXForms; 1048 std::map<Record*, ComplexPattern, LessRecordByID> ComplexPatterns; 1049 std::map<Record *, std::unique_ptr<TreePattern>, LessRecordByID> 1050 PatternFragments; 1051 std::map<Record*, DAGDefaultOperand, LessRecordByID> DefaultOperands; 1052 std::map<Record*, DAGInstruction, LessRecordByID> Instructions; 1053 1054 // Specific SDNode definitions: 1055 Record *intrinsic_void_sdnode; 1056 Record *intrinsic_w_chain_sdnode, *intrinsic_wo_chain_sdnode; 1057 1058 /// PatternsToMatch - All of the things we are matching on the DAG. The first 1059 /// value is the pattern to match, the second pattern is the result to 1060 /// emit. 1061 std::vector<PatternToMatch> PatternsToMatch; 1062 1063 TypeSetByHwMode LegalVTS; 1064 1065 using PatternRewriterFn = std::function<void (TreePattern *)>; 1066 PatternRewriterFn PatternRewriter; 1067 1068 public: 1069 CodeGenDAGPatterns(RecordKeeper &R, 1070 PatternRewriterFn PatternRewriter = nullptr); 1071 1072 CodeGenTarget &getTargetInfo() { return Target; } 1073 const CodeGenTarget &getTargetInfo() const { return Target; } 1074 const TypeSetByHwMode &getLegalTypes() const { return LegalVTS; } 1075 1076 Record *getSDNodeNamed(const std::string &Name) const; 1077 1078 const SDNodeInfo &getSDNodeInfo(Record *R) const { 1079 auto F = SDNodes.find(R); 1080 assert(F != SDNodes.end() && "Unknown node!"); 1081 return F->second; 1082 } 1083 1084 // Node transformation lookups. 1085 typedef std::pair<Record*, std::string> NodeXForm; 1086 const NodeXForm &getSDNodeTransform(Record *R) const { 1087 auto F = SDNodeXForms.find(R); 1088 assert(F != SDNodeXForms.end() && "Invalid transform!"); 1089 return F->second; 1090 } 1091 1092 typedef std::map<Record*, NodeXForm, LessRecordByID>::const_iterator 1093 nx_iterator; 1094 nx_iterator nx_begin() const { return SDNodeXForms.begin(); } 1095 nx_iterator nx_end() const { return SDNodeXForms.end(); } 1096 1097 1098 const ComplexPattern &getComplexPattern(Record *R) const { 1099 auto F = ComplexPatterns.find(R); 1100 assert(F != ComplexPatterns.end() && "Unknown addressing mode!"); 1101 return F->second; 1102 } 1103 1104 const CodeGenIntrinsic &getIntrinsic(Record *R) const { 1105 for (unsigned i = 0, e = Intrinsics.size(); i != e; ++i) 1106 if (Intrinsics[i].TheDef == R) return Intrinsics[i]; 1107 for (unsigned i = 0, e = TgtIntrinsics.size(); i != e; ++i) 1108 if (TgtIntrinsics[i].TheDef == R) return TgtIntrinsics[i]; 1109 llvm_unreachable("Unknown intrinsic!"); 1110 } 1111 1112 const CodeGenIntrinsic &getIntrinsicInfo(unsigned IID) const { 1113 if (IID-1 < Intrinsics.size()) 1114 return Intrinsics[IID-1]; 1115 if (IID-Intrinsics.size()-1 < TgtIntrinsics.size()) 1116 return TgtIntrinsics[IID-Intrinsics.size()-1]; 1117 llvm_unreachable("Bad intrinsic ID!"); 1118 } 1119 1120 unsigned getIntrinsicID(Record *R) const { 1121 for (unsigned i = 0, e = Intrinsics.size(); i != e; ++i) 1122 if (Intrinsics[i].TheDef == R) return i; 1123 for (unsigned i = 0, e = TgtIntrinsics.size(); i != e; ++i) 1124 if (TgtIntrinsics[i].TheDef == R) return i + Intrinsics.size(); 1125 llvm_unreachable("Unknown intrinsic!"); 1126 } 1127 1128 const DAGDefaultOperand &getDefaultOperand(Record *R) const { 1129 auto F = DefaultOperands.find(R); 1130 assert(F != DefaultOperands.end() &&"Isn't an analyzed default operand!"); 1131 return F->second; 1132 } 1133 1134 // Pattern Fragment information. 1135 TreePattern *getPatternFragment(Record *R) const { 1136 auto F = PatternFragments.find(R); 1137 assert(F != PatternFragments.end() && "Invalid pattern fragment request!"); 1138 return F->second.get(); 1139 } 1140 TreePattern *getPatternFragmentIfRead(Record *R) const { 1141 auto F = PatternFragments.find(R); 1142 if (F == PatternFragments.end()) 1143 return nullptr; 1144 return F->second.get(); 1145 } 1146 1147 typedef std::map<Record *, std::unique_ptr<TreePattern>, 1148 LessRecordByID>::const_iterator pf_iterator; 1149 pf_iterator pf_begin() const { return PatternFragments.begin(); } 1150 pf_iterator pf_end() const { return PatternFragments.end(); } 1151 iterator_range<pf_iterator> ptfs() const { return PatternFragments; } 1152 1153 // Patterns to match information. 1154 typedef std::vector<PatternToMatch>::const_iterator ptm_iterator; 1155 ptm_iterator ptm_begin() const { return PatternsToMatch.begin(); } 1156 ptm_iterator ptm_end() const { return PatternsToMatch.end(); } 1157 iterator_range<ptm_iterator> ptms() const { return PatternsToMatch; } 1158 1159 /// Parse the Pattern for an instruction, and insert the result in DAGInsts. 1160 typedef std::map<Record*, DAGInstruction, LessRecordByID> DAGInstMap; 1161 const DAGInstruction &parseInstructionPattern( 1162 CodeGenInstruction &CGI, ListInit *Pattern, 1163 DAGInstMap &DAGInsts); 1164 1165 const DAGInstruction &getInstruction(Record *R) const { 1166 auto F = Instructions.find(R); 1167 assert(F != Instructions.end() && "Unknown instruction!"); 1168 return F->second; 1169 } 1170 1171 Record *get_intrinsic_void_sdnode() const { 1172 return intrinsic_void_sdnode; 1173 } 1174 Record *get_intrinsic_w_chain_sdnode() const { 1175 return intrinsic_w_chain_sdnode; 1176 } 1177 Record *get_intrinsic_wo_chain_sdnode() const { 1178 return intrinsic_wo_chain_sdnode; 1179 } 1180 1181 bool hasTargetIntrinsics() { return !TgtIntrinsics.empty(); } 1182 1183 private: 1184 void ParseNodeInfo(); 1185 void ParseNodeTransforms(); 1186 void ParseComplexPatterns(); 1187 void ParsePatternFragments(bool OutFrags = false); 1188 void ParseDefaultOperands(); 1189 void ParseInstructions(); 1190 void ParsePatterns(); 1191 void ExpandHwModeBasedTypes(); 1192 void InferInstructionFlags(); 1193 void GenerateVariants(); 1194 void VerifyInstructionFlags(); 1195 1196 std::vector<Predicate> makePredList(ListInit *L); 1197 1198 void AddPatternToMatch(TreePattern *Pattern, PatternToMatch &&PTM); 1199 void FindPatternInputsAndOutputs( 1200 TreePattern &I, TreePatternNodePtr Pat, 1201 std::map<std::string, TreePatternNodePtr> &InstInputs, 1202 std::map<std::string, TreePatternNodePtr> &InstResults, 1203 std::vector<Record *> &InstImpResults); 1204 }; 1205 1206 1207 inline bool SDNodeInfo::ApplyTypeConstraints(TreePatternNode *N, 1208 TreePattern &TP) const { 1209 bool MadeChange = false; 1210 for (unsigned i = 0, e = TypeConstraints.size(); i != e; ++i) 1211 MadeChange |= TypeConstraints[i].ApplyTypeConstraint(N, *this, TP); 1212 return MadeChange; 1213 } 1214 1215 } // end namespace llvm 1216 1217 #endif 1218