1 //===- DAGISelMatcherEmitter.cpp - Matcher Emitter ------------------------===// 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 contains code to generate C++ code for a matcher. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #include "CodeGenDAGPatterns.h" 14 #include "DAGISelMatcher.h" 15 #include "llvm/ADT/DenseMap.h" 16 #include "llvm/ADT/StringMap.h" 17 #include "llvm/ADT/MapVector.h" 18 #include "llvm/ADT/SmallString.h" 19 #include "llvm/ADT/StringMap.h" 20 #include "llvm/ADT/TinyPtrVector.h" 21 #include "llvm/Support/CommandLine.h" 22 #include "llvm/Support/Format.h" 23 #include "llvm/Support/SourceMgr.h" 24 #include "llvm/TableGen/Error.h" 25 #include "llvm/TableGen/Record.h" 26 27 using namespace llvm; 28 29 enum { 30 IndexWidth = 6, 31 FullIndexWidth = IndexWidth + 4, 32 HistOpcWidth = 40, 33 }; 34 35 cl::OptionCategory DAGISelCat("Options for -gen-dag-isel"); 36 37 // To reduce generated source code size. 38 static cl::opt<bool> OmitComments("omit-comments", 39 cl::desc("Do not generate comments"), 40 cl::init(false), cl::cat(DAGISelCat)); 41 42 static cl::opt<bool> InstrumentCoverage( 43 "instrument-coverage", 44 cl::desc("Generates tables to help identify patterns matched"), 45 cl::init(false), cl::cat(DAGISelCat)); 46 47 namespace { 48 class MatcherTableEmitter { 49 const CodeGenDAGPatterns &CGP; 50 51 SmallVector<unsigned, Matcher::HighestKind+1> OpcodeCounts; 52 53 DenseMap<TreePattern *, unsigned> NodePredicateMap; 54 std::vector<TreePredicateFn> NodePredicates; 55 std::vector<TreePredicateFn> NodePredicatesWithOperands; 56 57 // We de-duplicate the predicates by code string, and use this map to track 58 // all the patterns with "identical" predicates. 59 StringMap<TinyPtrVector<TreePattern *>> NodePredicatesByCodeToRun; 60 61 StringMap<unsigned> PatternPredicateMap; 62 std::vector<std::string> PatternPredicates; 63 64 DenseMap<const ComplexPattern*, unsigned> ComplexPatternMap; 65 std::vector<const ComplexPattern*> ComplexPatterns; 66 67 68 DenseMap<Record*, unsigned> NodeXFormMap; 69 std::vector<Record*> NodeXForms; 70 71 std::vector<std::string> VecIncludeStrings; 72 MapVector<std::string, unsigned, StringMap<unsigned> > VecPatterns; 73 74 unsigned getPatternIdxFromTable(std::string &&P, std::string &&include_loc) { 75 const auto It = VecPatterns.find(P); 76 if (It == VecPatterns.end()) { 77 VecPatterns.insert(make_pair(std::move(P), VecPatterns.size())); 78 VecIncludeStrings.push_back(std::move(include_loc)); 79 return VecIncludeStrings.size() - 1; 80 } 81 return It->second; 82 } 83 84 public: 85 MatcherTableEmitter(const CodeGenDAGPatterns &cgp) : CGP(cgp) { 86 OpcodeCounts.assign(Matcher::HighestKind+1, 0); 87 } 88 89 unsigned EmitMatcherList(const Matcher *N, const unsigned Indent, 90 unsigned StartIdx, raw_ostream &OS); 91 92 unsigned SizeMatcherList(Matcher *N, raw_ostream &OS); 93 94 void EmitPredicateFunctions(raw_ostream &OS); 95 96 void EmitHistogram(const Matcher *N, raw_ostream &OS); 97 98 void EmitPatternMatchTable(raw_ostream &OS); 99 100 private: 101 void EmitNodePredicatesFunction(const std::vector<TreePredicateFn> &Preds, 102 StringRef Decl, raw_ostream &OS); 103 104 unsigned SizeMatcher(Matcher *N, raw_ostream &OS); 105 106 unsigned EmitMatcher(const Matcher *N, const unsigned Indent, unsigned CurrentIdx, 107 raw_ostream &OS); 108 109 unsigned getNodePredicate(TreePredicateFn Pred) { 110 TreePattern *TP = Pred.getOrigPatFragRecord(); 111 unsigned &Entry = NodePredicateMap[TP]; 112 if (Entry == 0) { 113 TinyPtrVector<TreePattern *> &SameCodePreds = 114 NodePredicatesByCodeToRun[Pred.getCodeToRunOnSDNode()]; 115 if (SameCodePreds.empty()) { 116 // We've never seen a predicate with the same code: allocate an entry. 117 if (Pred.usesOperands()) { 118 NodePredicatesWithOperands.push_back(Pred); 119 Entry = NodePredicatesWithOperands.size(); 120 } else { 121 NodePredicates.push_back(Pred); 122 Entry = NodePredicates.size(); 123 } 124 } else { 125 // We did see an identical predicate: re-use it. 126 Entry = NodePredicateMap[SameCodePreds.front()]; 127 assert(Entry != 0); 128 assert(TreePredicateFn(SameCodePreds.front()).usesOperands() == 129 Pred.usesOperands() && 130 "PatFrags with some code must have same usesOperands setting"); 131 } 132 // In both cases, we've never seen this particular predicate before, so 133 // mark it in the list of predicates sharing the same code. 134 SameCodePreds.push_back(TP); 135 } 136 return Entry-1; 137 } 138 139 unsigned getPatternPredicate(StringRef PredName) { 140 unsigned &Entry = PatternPredicateMap[PredName]; 141 if (Entry == 0) { 142 PatternPredicates.push_back(PredName.str()); 143 Entry = PatternPredicates.size(); 144 } 145 return Entry-1; 146 } 147 unsigned getComplexPat(const ComplexPattern &P) { 148 unsigned &Entry = ComplexPatternMap[&P]; 149 if (Entry == 0) { 150 ComplexPatterns.push_back(&P); 151 Entry = ComplexPatterns.size(); 152 } 153 return Entry-1; 154 } 155 156 unsigned getNodeXFormID(Record *Rec) { 157 unsigned &Entry = NodeXFormMap[Rec]; 158 if (Entry == 0) { 159 NodeXForms.push_back(Rec); 160 Entry = NodeXForms.size(); 161 } 162 return Entry-1; 163 } 164 165 }; 166 } // end anonymous namespace. 167 168 static std::string GetPatFromTreePatternNode(const TreePatternNode *N) { 169 std::string str; 170 raw_string_ostream Stream(str); 171 Stream << *N; 172 Stream.str(); 173 return str; 174 } 175 176 static unsigned GetVBRSize(unsigned Val) { 177 if (Val <= 127) return 1; 178 179 unsigned NumBytes = 0; 180 while (Val >= 128) { 181 Val >>= 7; 182 ++NumBytes; 183 } 184 return NumBytes+1; 185 } 186 187 /// EmitVBRValue - Emit the specified value as a VBR, returning the number of 188 /// bytes emitted. 189 static unsigned EmitVBRValue(uint64_t Val, raw_ostream &OS) { 190 if (Val <= 127) { 191 OS << Val << ", "; 192 return 1; 193 } 194 195 uint64_t InVal = Val; 196 unsigned NumBytes = 0; 197 while (Val >= 128) { 198 OS << (Val&127) << "|128,"; 199 Val >>= 7; 200 ++NumBytes; 201 } 202 OS << Val; 203 if (!OmitComments) 204 OS << "/*" << InVal << "*/"; 205 OS << ", "; 206 return NumBytes+1; 207 } 208 209 /// Emit the specified signed value as a VBR. To improve compression we encode 210 /// positive numbers shifted left by 1 and negative numbers negated and shifted 211 /// left by 1 with bit 0 set. 212 static unsigned EmitSignedVBRValue(uint64_t Val, raw_ostream &OS) { 213 if ((int64_t)Val >= 0) 214 Val = Val << 1; 215 else 216 Val = (-Val << 1) | 1; 217 218 return EmitVBRValue(Val, OS); 219 } 220 221 // This is expensive and slow. 222 static std::string getIncludePath(const Record *R) { 223 std::string str; 224 raw_string_ostream Stream(str); 225 auto Locs = R->getLoc(); 226 SMLoc L; 227 if (Locs.size() > 1) { 228 // Get where the pattern prototype was instantiated 229 L = Locs[1]; 230 } else if (Locs.size() == 1) { 231 L = Locs[0]; 232 } 233 unsigned CurBuf = SrcMgr.FindBufferContainingLoc(L); 234 assert(CurBuf && "Invalid or unspecified location!"); 235 236 Stream << SrcMgr.getBufferInfo(CurBuf).Buffer->getBufferIdentifier() << ":" 237 << SrcMgr.FindLineNumber(L, CurBuf); 238 Stream.str(); 239 return str; 240 } 241 242 /// This function traverses the matcher tree and sizes all the nodes 243 /// that are children of the three kinds of nodes that have them. 244 unsigned MatcherTableEmitter:: 245 SizeMatcherList(Matcher *N, raw_ostream &OS) { 246 unsigned Size = 0; 247 while (N) { 248 Size += SizeMatcher(N, OS); 249 N = N->getNext(); 250 } 251 return Size; 252 } 253 254 /// This function sizes the children of the three kinds of nodes that 255 /// have them. It does so by using special cases for those three 256 /// nodes, but sharing the code in EmitMatcher() for the other kinds. 257 unsigned MatcherTableEmitter:: 258 SizeMatcher(Matcher *N, raw_ostream &OS) { 259 unsigned Idx = 0; 260 261 ++OpcodeCounts[N->getKind()]; 262 switch (N->getKind()) { 263 // The Scope matcher has its kind, a series of child size + child, 264 // and a trailing zero. 265 case Matcher::Scope: { 266 ScopeMatcher *SM = cast<ScopeMatcher>(N); 267 assert(SM->getNext() == nullptr && "Scope matcher should not have next"); 268 unsigned Size = 1; // Count the kind. 269 for (unsigned i = 0, e = SM->getNumChildren(); i != e; ++i) { 270 const unsigned ChildSize = SizeMatcherList(SM->getChild(i), OS); 271 assert(ChildSize != 0 && "Matcher cannot have child of size 0"); 272 SM->getChild(i)->setSize(ChildSize); 273 Size += GetVBRSize(ChildSize) + ChildSize; // Count VBR and child size. 274 } 275 ++Size; // Count the zero sentinel. 276 return Size; 277 } 278 279 // SwitchOpcode and SwitchType have their kind, a series of child size + 280 // opcode/type + child, and a trailing zero. 281 case Matcher::SwitchOpcode: 282 case Matcher::SwitchType: { 283 unsigned Size = 1; // Count the kind. 284 unsigned NumCases; 285 if (const SwitchOpcodeMatcher *SOM = dyn_cast<SwitchOpcodeMatcher>(N)) 286 NumCases = SOM->getNumCases(); 287 else 288 NumCases = cast<SwitchTypeMatcher>(N)->getNumCases(); 289 for (unsigned i = 0, e = NumCases; i != e; ++i) { 290 Matcher *Child; 291 if (SwitchOpcodeMatcher *SOM = dyn_cast<SwitchOpcodeMatcher>(N)) { 292 Child = SOM->getCaseMatcher(i); 293 Size += 2; // Count the child's opcode. 294 } else { 295 Child = cast<SwitchTypeMatcher>(N)->getCaseMatcher(i); 296 ++Size; // Count the child's type. 297 } 298 const unsigned ChildSize = SizeMatcherList(Child, OS); 299 assert(ChildSize != 0 && "Matcher cannot have child of size 0"); 300 Child->setSize(ChildSize); 301 Size += GetVBRSize(ChildSize) + ChildSize; // Count VBR and child size. 302 } 303 ++Size; // Count the zero sentinel. 304 return Size; 305 } 306 307 default: 308 // Employ the matcher emitter to size other matchers. 309 return EmitMatcher(N, 0, Idx, OS); 310 } 311 llvm_unreachable("Unreachable"); 312 } 313 314 static void BeginEmitFunction(raw_ostream &OS, StringRef RetType, 315 StringRef Decl, bool AddOverride) { 316 OS << "#ifdef GET_DAGISEL_DECL\n"; 317 OS << RetType << ' ' << Decl; 318 if (AddOverride) 319 OS << " override"; 320 OS << ";\n" 321 "#endif\n" 322 "#if defined(GET_DAGISEL_BODY) || DAGISEL_INLINE\n"; 323 OS << RetType << " DAGISEL_CLASS_COLONCOLON " << Decl << "\n"; 324 if (AddOverride) { 325 OS << "#if DAGISEL_INLINE\n" 326 " override\n" 327 "#endif\n"; 328 } 329 } 330 331 static void EndEmitFunction(raw_ostream &OS) { 332 OS << "#endif // GET_DAGISEL_BODY\n\n"; 333 } 334 335 void MatcherTableEmitter::EmitPatternMatchTable(raw_ostream &OS) { 336 337 assert(isUInt<16>(VecPatterns.size()) && 338 "Using only 16 bits to encode offset into Pattern Table"); 339 assert(VecPatterns.size() == VecIncludeStrings.size() && 340 "The sizes of Pattern and include vectors should be the same"); 341 342 BeginEmitFunction(OS, "StringRef", "getPatternForIndex(unsigned Index)", 343 true/*AddOverride*/); 344 OS << "{\n"; 345 OS << "static const char *PATTERN_MATCH_TABLE[] = {\n"; 346 347 for (const auto &It : VecPatterns) { 348 OS << "\"" << It.first << "\",\n"; 349 } 350 351 OS << "\n};"; 352 OS << "\nreturn StringRef(PATTERN_MATCH_TABLE[Index]);"; 353 OS << "\n}\n"; 354 EndEmitFunction(OS); 355 356 BeginEmitFunction(OS, "StringRef", "getIncludePathForIndex(unsigned Index)", 357 true/*AddOverride*/); 358 OS << "{\n"; 359 OS << "static const char *INCLUDE_PATH_TABLE[] = {\n"; 360 361 for (const auto &It : VecIncludeStrings) { 362 OS << "\"" << It << "\",\n"; 363 } 364 365 OS << "\n};"; 366 OS << "\nreturn StringRef(INCLUDE_PATH_TABLE[Index]);"; 367 OS << "\n}\n"; 368 EndEmitFunction(OS); 369 } 370 371 /// EmitMatcher - Emit bytes for the specified matcher and return 372 /// the number of bytes emitted. 373 unsigned MatcherTableEmitter:: 374 EmitMatcher(const Matcher *N, const unsigned Indent, unsigned CurrentIdx, 375 raw_ostream &OS) { 376 OS.indent(Indent); 377 378 switch (N->getKind()) { 379 case Matcher::Scope: { 380 const ScopeMatcher *SM = cast<ScopeMatcher>(N); 381 unsigned StartIdx = CurrentIdx; 382 383 // Emit all of the children. 384 for (unsigned i = 0, e = SM->getNumChildren(); i != e; ++i) { 385 if (i == 0) { 386 OS << "OPC_Scope, "; 387 ++CurrentIdx; 388 } else { 389 if (!OmitComments) { 390 OS << "/*" << format_decimal(CurrentIdx, IndexWidth) << "*/"; 391 OS.indent(Indent) << "/*Scope*/ "; 392 } else 393 OS.indent(Indent); 394 } 395 396 unsigned ChildSize = SM->getChild(i)->getSize(); 397 unsigned VBRSize = EmitVBRValue(ChildSize, OS); 398 if (!OmitComments) { 399 OS << "/*->" << CurrentIdx + VBRSize + ChildSize << "*/"; 400 if (i == 0) 401 OS << " // " << SM->getNumChildren() << " children in Scope"; 402 } 403 OS << '\n'; 404 405 ChildSize = EmitMatcherList(SM->getChild(i), Indent+1, 406 CurrentIdx + VBRSize, OS); 407 assert(ChildSize == SM->getChild(i)->getSize() && 408 "Emitted child size does not match calculated size"); 409 CurrentIdx += VBRSize + ChildSize; 410 } 411 412 // Emit a zero as a sentinel indicating end of 'Scope'. 413 if (!OmitComments) 414 OS << "/*" << format_decimal(CurrentIdx, IndexWidth) << "*/"; 415 OS.indent(Indent) << "0, "; 416 if (!OmitComments) 417 OS << "/*End of Scope*/"; 418 OS << '\n'; 419 return CurrentIdx - StartIdx + 1; 420 } 421 422 case Matcher::RecordNode: 423 OS << "OPC_RecordNode,"; 424 if (!OmitComments) 425 OS << " // #" 426 << cast<RecordMatcher>(N)->getResultNo() << " = " 427 << cast<RecordMatcher>(N)->getWhatFor(); 428 OS << '\n'; 429 return 1; 430 431 case Matcher::RecordChild: 432 OS << "OPC_RecordChild" << cast<RecordChildMatcher>(N)->getChildNo() 433 << ','; 434 if (!OmitComments) 435 OS << " // #" 436 << cast<RecordChildMatcher>(N)->getResultNo() << " = " 437 << cast<RecordChildMatcher>(N)->getWhatFor(); 438 OS << '\n'; 439 return 1; 440 441 case Matcher::RecordMemRef: 442 OS << "OPC_RecordMemRef,\n"; 443 return 1; 444 445 case Matcher::CaptureGlueInput: 446 OS << "OPC_CaptureGlueInput,\n"; 447 return 1; 448 449 case Matcher::MoveChild: { 450 const auto *MCM = cast<MoveChildMatcher>(N); 451 452 OS << "OPC_MoveChild"; 453 // Handle the specialized forms. 454 if (MCM->getChildNo() >= 8) 455 OS << ", "; 456 OS << MCM->getChildNo() << ",\n"; 457 return (MCM->getChildNo() >= 8) ? 2 : 1; 458 } 459 460 case Matcher::MoveParent: 461 OS << "OPC_MoveParent,\n"; 462 return 1; 463 464 case Matcher::CheckSame: 465 OS << "OPC_CheckSame, " 466 << cast<CheckSameMatcher>(N)->getMatchNumber() << ",\n"; 467 return 2; 468 469 case Matcher::CheckChildSame: 470 OS << "OPC_CheckChild" 471 << cast<CheckChildSameMatcher>(N)->getChildNo() << "Same, " 472 << cast<CheckChildSameMatcher>(N)->getMatchNumber() << ",\n"; 473 return 2; 474 475 case Matcher::CheckPatternPredicate: { 476 StringRef Pred =cast<CheckPatternPredicateMatcher>(N)->getPredicate(); 477 OS << "OPC_CheckPatternPredicate, " << getPatternPredicate(Pred) << ','; 478 if (!OmitComments) 479 OS << " // " << Pred; 480 OS << '\n'; 481 return 2; 482 } 483 case Matcher::CheckPredicate: { 484 TreePredicateFn Pred = cast<CheckPredicateMatcher>(N)->getPredicate(); 485 unsigned OperandBytes = 0; 486 487 if (Pred.usesOperands()) { 488 unsigned NumOps = cast<CheckPredicateMatcher>(N)->getNumOperands(); 489 OS << "OPC_CheckPredicateWithOperands, " << NumOps << "/*#Ops*/, "; 490 for (unsigned i = 0; i < NumOps; ++i) 491 OS << cast<CheckPredicateMatcher>(N)->getOperandNo(i) << ", "; 492 OperandBytes = 1 + NumOps; 493 } else { 494 OS << "OPC_CheckPredicate, "; 495 } 496 497 OS << getNodePredicate(Pred) << ','; 498 if (!OmitComments) 499 OS << " // " << Pred.getFnName(); 500 OS << '\n'; 501 return 2 + OperandBytes; 502 } 503 504 case Matcher::CheckOpcode: 505 OS << "OPC_CheckOpcode, TARGET_VAL(" 506 << cast<CheckOpcodeMatcher>(N)->getOpcode().getEnumName() << "),\n"; 507 return 3; 508 509 case Matcher::SwitchOpcode: 510 case Matcher::SwitchType: { 511 unsigned StartIdx = CurrentIdx; 512 513 unsigned NumCases; 514 if (const SwitchOpcodeMatcher *SOM = dyn_cast<SwitchOpcodeMatcher>(N)) { 515 OS << "OPC_SwitchOpcode "; 516 NumCases = SOM->getNumCases(); 517 } else { 518 OS << "OPC_SwitchType "; 519 NumCases = cast<SwitchTypeMatcher>(N)->getNumCases(); 520 } 521 522 if (!OmitComments) 523 OS << "/*" << NumCases << " cases */"; 524 OS << ", "; 525 ++CurrentIdx; 526 527 // For each case we emit the size, then the opcode, then the matcher. 528 for (unsigned i = 0, e = NumCases; i != e; ++i) { 529 const Matcher *Child; 530 unsigned IdxSize; 531 if (const SwitchOpcodeMatcher *SOM = dyn_cast<SwitchOpcodeMatcher>(N)) { 532 Child = SOM->getCaseMatcher(i); 533 IdxSize = 2; // size of opcode in table is 2 bytes. 534 } else { 535 Child = cast<SwitchTypeMatcher>(N)->getCaseMatcher(i); 536 IdxSize = 1; // size of type in table is 1 byte. 537 } 538 539 if (i != 0) { 540 if (!OmitComments) 541 OS << "/*" << format_decimal(CurrentIdx, IndexWidth) << "*/"; 542 OS.indent(Indent); 543 if (!OmitComments) 544 OS << (isa<SwitchOpcodeMatcher>(N) ? 545 "/*SwitchOpcode*/ " : "/*SwitchType*/ "); 546 } 547 548 unsigned ChildSize = Child->getSize(); 549 CurrentIdx += EmitVBRValue(ChildSize, OS) + IdxSize; 550 if (const SwitchOpcodeMatcher *SOM = dyn_cast<SwitchOpcodeMatcher>(N)) 551 OS << "TARGET_VAL(" << SOM->getCaseOpcode(i).getEnumName() << "),"; 552 else 553 OS << getEnumName(cast<SwitchTypeMatcher>(N)->getCaseType(i)) << ','; 554 if (!OmitComments) 555 OS << "// ->" << CurrentIdx + ChildSize; 556 OS << '\n'; 557 558 ChildSize = EmitMatcherList(Child, Indent+1, CurrentIdx, OS); 559 assert(ChildSize == Child->getSize() && 560 "Emitted child size does not match calculated size"); 561 CurrentIdx += ChildSize; 562 } 563 564 // Emit the final zero to terminate the switch. 565 if (!OmitComments) 566 OS << "/*" << format_decimal(CurrentIdx, IndexWidth) << "*/"; 567 OS.indent(Indent) << "0,"; 568 if (!OmitComments) 569 OS << (isa<SwitchOpcodeMatcher>(N) ? 570 " // EndSwitchOpcode" : " // EndSwitchType"); 571 572 OS << '\n'; 573 return CurrentIdx - StartIdx + 1; 574 } 575 576 case Matcher::CheckType: 577 if (cast<CheckTypeMatcher>(N)->getResNo() == 0) { 578 OS << "OPC_CheckType, " 579 << getEnumName(cast<CheckTypeMatcher>(N)->getType()) << ",\n"; 580 return 2; 581 } 582 OS << "OPC_CheckTypeRes, " << cast<CheckTypeMatcher>(N)->getResNo() 583 << ", " << getEnumName(cast<CheckTypeMatcher>(N)->getType()) << ",\n"; 584 return 3; 585 586 case Matcher::CheckChildType: 587 OS << "OPC_CheckChild" 588 << cast<CheckChildTypeMatcher>(N)->getChildNo() << "Type, " 589 << getEnumName(cast<CheckChildTypeMatcher>(N)->getType()) << ",\n"; 590 return 2; 591 592 case Matcher::CheckInteger: { 593 OS << "OPC_CheckInteger, "; 594 unsigned Bytes = 595 1 + EmitSignedVBRValue(cast<CheckIntegerMatcher>(N)->getValue(), OS); 596 OS << '\n'; 597 return Bytes; 598 } 599 case Matcher::CheckChildInteger: { 600 OS << "OPC_CheckChild" << cast<CheckChildIntegerMatcher>(N)->getChildNo() 601 << "Integer, "; 602 unsigned Bytes = 1 + EmitSignedVBRValue( 603 cast<CheckChildIntegerMatcher>(N)->getValue(), OS); 604 OS << '\n'; 605 return Bytes; 606 } 607 case Matcher::CheckCondCode: 608 OS << "OPC_CheckCondCode, ISD::" 609 << cast<CheckCondCodeMatcher>(N)->getCondCodeName() << ",\n"; 610 return 2; 611 612 case Matcher::CheckChild2CondCode: 613 OS << "OPC_CheckChild2CondCode, ISD::" 614 << cast<CheckChild2CondCodeMatcher>(N)->getCondCodeName() << ",\n"; 615 return 2; 616 617 case Matcher::CheckValueType: 618 OS << "OPC_CheckValueType, MVT::" 619 << cast<CheckValueTypeMatcher>(N)->getTypeName() << ",\n"; 620 return 2; 621 622 case Matcher::CheckComplexPat: { 623 const CheckComplexPatMatcher *CCPM = cast<CheckComplexPatMatcher>(N); 624 const ComplexPattern &Pattern = CCPM->getPattern(); 625 OS << "OPC_CheckComplexPat, /*CP*/" << getComplexPat(Pattern) << ", /*#*/" 626 << CCPM->getMatchNumber() << ','; 627 628 if (!OmitComments) { 629 OS << " // " << Pattern.getSelectFunc(); 630 OS << ":$" << CCPM->getName(); 631 for (unsigned i = 0, e = Pattern.getNumOperands(); i != e; ++i) 632 OS << " #" << CCPM->getFirstResult()+i; 633 634 if (Pattern.hasProperty(SDNPHasChain)) 635 OS << " + chain result"; 636 } 637 OS << '\n'; 638 return 3; 639 } 640 641 case Matcher::CheckAndImm: { 642 OS << "OPC_CheckAndImm, "; 643 unsigned Bytes=1+EmitVBRValue(cast<CheckAndImmMatcher>(N)->getValue(), OS); 644 OS << '\n'; 645 return Bytes; 646 } 647 648 case Matcher::CheckOrImm: { 649 OS << "OPC_CheckOrImm, "; 650 unsigned Bytes = 1+EmitVBRValue(cast<CheckOrImmMatcher>(N)->getValue(), OS); 651 OS << '\n'; 652 return Bytes; 653 } 654 655 case Matcher::CheckFoldableChainNode: 656 OS << "OPC_CheckFoldableChainNode,\n"; 657 return 1; 658 659 case Matcher::CheckImmAllOnesV: 660 OS << "OPC_CheckImmAllOnesV,\n"; 661 return 1; 662 663 case Matcher::CheckImmAllZerosV: 664 OS << "OPC_CheckImmAllZerosV,\n"; 665 return 1; 666 667 case Matcher::EmitInteger: { 668 int64_t Val = cast<EmitIntegerMatcher>(N)->getValue(); 669 OS << "OPC_EmitInteger, " 670 << getEnumName(cast<EmitIntegerMatcher>(N)->getVT()) << ", "; 671 unsigned Bytes = 2 + EmitSignedVBRValue(Val, OS); 672 OS << '\n'; 673 return Bytes; 674 } 675 case Matcher::EmitStringInteger: { 676 const std::string &Val = cast<EmitStringIntegerMatcher>(N)->getValue(); 677 // These should always fit into 7 bits. 678 OS << "OPC_EmitStringInteger, " 679 << getEnumName(cast<EmitStringIntegerMatcher>(N)->getVT()) << ", " << Val 680 << ",\n"; 681 return 3; 682 } 683 684 case Matcher::EmitRegister: { 685 const EmitRegisterMatcher *Matcher = cast<EmitRegisterMatcher>(N); 686 const CodeGenRegister *Reg = Matcher->getReg(); 687 // If the enum value of the register is larger than one byte can handle, 688 // use EmitRegister2. 689 if (Reg && Reg->EnumValue > 255) { 690 OS << "OPC_EmitRegister2, " << getEnumName(Matcher->getVT()) << ", "; 691 OS << "TARGET_VAL(" << getQualifiedName(Reg->TheDef) << "),\n"; 692 return 4; 693 } else { 694 OS << "OPC_EmitRegister, " << getEnumName(Matcher->getVT()) << ", "; 695 if (Reg) { 696 OS << getQualifiedName(Reg->TheDef) << ",\n"; 697 } else { 698 OS << "0 "; 699 if (!OmitComments) 700 OS << "/*zero_reg*/"; 701 OS << ",\n"; 702 } 703 return 3; 704 } 705 } 706 707 case Matcher::EmitConvertToTarget: 708 OS << "OPC_EmitConvertToTarget, " 709 << cast<EmitConvertToTargetMatcher>(N)->getSlot() << ",\n"; 710 return 2; 711 712 case Matcher::EmitMergeInputChains: { 713 const EmitMergeInputChainsMatcher *MN = 714 cast<EmitMergeInputChainsMatcher>(N); 715 716 // Handle the specialized forms OPC_EmitMergeInputChains1_0, 1_1, and 1_2. 717 if (MN->getNumNodes() == 1 && MN->getNode(0) < 3) { 718 OS << "OPC_EmitMergeInputChains1_" << MN->getNode(0) << ",\n"; 719 return 1; 720 } 721 722 OS << "OPC_EmitMergeInputChains, " << MN->getNumNodes() << ", "; 723 for (unsigned i = 0, e = MN->getNumNodes(); i != e; ++i) 724 OS << MN->getNode(i) << ", "; 725 OS << '\n'; 726 return 2+MN->getNumNodes(); 727 } 728 case Matcher::EmitCopyToReg: { 729 const auto *C2RMatcher = cast<EmitCopyToRegMatcher>(N); 730 int Bytes = 3; 731 const CodeGenRegister *Reg = C2RMatcher->getDestPhysReg(); 732 if (Reg->EnumValue > 255) { 733 assert(isUInt<16>(Reg->EnumValue) && "not handled"); 734 OS << "OPC_EmitCopyToReg2, " << C2RMatcher->getSrcSlot() << ", " 735 << "TARGET_VAL(" << getQualifiedName(Reg->TheDef) << "),\n"; 736 ++Bytes; 737 } else { 738 OS << "OPC_EmitCopyToReg, " << C2RMatcher->getSrcSlot() << ", " 739 << getQualifiedName(Reg->TheDef) << ",\n"; 740 } 741 742 return Bytes; 743 } 744 case Matcher::EmitNodeXForm: { 745 const EmitNodeXFormMatcher *XF = cast<EmitNodeXFormMatcher>(N); 746 OS << "OPC_EmitNodeXForm, " << getNodeXFormID(XF->getNodeXForm()) << ", " 747 << XF->getSlot() << ','; 748 if (!OmitComments) 749 OS << " // "<<XF->getNodeXForm()->getName(); 750 OS <<'\n'; 751 return 3; 752 } 753 754 case Matcher::EmitNode: 755 case Matcher::MorphNodeTo: { 756 auto NumCoveredBytes = 0; 757 if (InstrumentCoverage) { 758 if (const MorphNodeToMatcher *SNT = dyn_cast<MorphNodeToMatcher>(N)) { 759 NumCoveredBytes = 3; 760 OS << "OPC_Coverage, "; 761 std::string src = 762 GetPatFromTreePatternNode(SNT->getPattern().getSrcPattern()); 763 std::string dst = 764 GetPatFromTreePatternNode(SNT->getPattern().getDstPattern()); 765 Record *PatRecord = SNT->getPattern().getSrcRecord(); 766 std::string include_src = getIncludePath(PatRecord); 767 unsigned Offset = 768 getPatternIdxFromTable(src + " -> " + dst, std::move(include_src)); 769 OS << "TARGET_VAL(" << Offset << "),\n"; 770 OS.indent(FullIndexWidth + Indent); 771 } 772 } 773 const EmitNodeMatcherCommon *EN = cast<EmitNodeMatcherCommon>(N); 774 OS << (isa<EmitNodeMatcher>(EN) ? "OPC_EmitNode" : "OPC_MorphNodeTo"); 775 bool CompressVTs = EN->getNumVTs() < 3; 776 if (CompressVTs) 777 OS << EN->getNumVTs(); 778 779 OS << ", TARGET_VAL(" << EN->getOpcodeName() << "), 0"; 780 781 if (EN->hasChain()) OS << "|OPFL_Chain"; 782 if (EN->hasInFlag()) OS << "|OPFL_GlueInput"; 783 if (EN->hasOutFlag()) OS << "|OPFL_GlueOutput"; 784 if (EN->hasMemRefs()) OS << "|OPFL_MemRefs"; 785 if (EN->getNumFixedArityOperands() != -1) 786 OS << "|OPFL_Variadic" << EN->getNumFixedArityOperands(); 787 OS << ",\n"; 788 789 OS.indent(FullIndexWidth + Indent+4); 790 if (!CompressVTs) { 791 OS << EN->getNumVTs(); 792 if (!OmitComments) 793 OS << "/*#VTs*/"; 794 OS << ", "; 795 } 796 for (unsigned i = 0, e = EN->getNumVTs(); i != e; ++i) 797 OS << getEnumName(EN->getVT(i)) << ", "; 798 799 OS << EN->getNumOperands(); 800 if (!OmitComments) 801 OS << "/*#Ops*/"; 802 OS << ", "; 803 unsigned NumOperandBytes = 0; 804 for (unsigned i = 0, e = EN->getNumOperands(); i != e; ++i) 805 NumOperandBytes += EmitVBRValue(EN->getOperand(i), OS); 806 807 if (!OmitComments) { 808 // Print the result #'s for EmitNode. 809 if (const EmitNodeMatcher *E = dyn_cast<EmitNodeMatcher>(EN)) { 810 if (unsigned NumResults = EN->getNumVTs()) { 811 OS << " // Results ="; 812 unsigned First = E->getFirstResultSlot(); 813 for (unsigned i = 0; i != NumResults; ++i) 814 OS << " #" << First+i; 815 } 816 } 817 OS << '\n'; 818 819 if (const MorphNodeToMatcher *SNT = dyn_cast<MorphNodeToMatcher>(N)) { 820 OS.indent(FullIndexWidth + Indent) << "// Src: " 821 << *SNT->getPattern().getSrcPattern() << " - Complexity = " 822 << SNT->getPattern().getPatternComplexity(CGP) << '\n'; 823 OS.indent(FullIndexWidth + Indent) << "// Dst: " 824 << *SNT->getPattern().getDstPattern() << '\n'; 825 } 826 } else 827 OS << '\n'; 828 829 return 5 + !CompressVTs + EN->getNumVTs() + NumOperandBytes + 830 NumCoveredBytes; 831 } 832 case Matcher::CompleteMatch: { 833 const CompleteMatchMatcher *CM = cast<CompleteMatchMatcher>(N); 834 auto NumCoveredBytes = 0; 835 if (InstrumentCoverage) { 836 NumCoveredBytes = 3; 837 OS << "OPC_Coverage, "; 838 std::string src = 839 GetPatFromTreePatternNode(CM->getPattern().getSrcPattern()); 840 std::string dst = 841 GetPatFromTreePatternNode(CM->getPattern().getDstPattern()); 842 Record *PatRecord = CM->getPattern().getSrcRecord(); 843 std::string include_src = getIncludePath(PatRecord); 844 unsigned Offset = 845 getPatternIdxFromTable(src + " -> " + dst, std::move(include_src)); 846 OS << "TARGET_VAL(" << Offset << "),\n"; 847 OS.indent(FullIndexWidth + Indent); 848 } 849 OS << "OPC_CompleteMatch, " << CM->getNumResults() << ", "; 850 unsigned NumResultBytes = 0; 851 for (unsigned i = 0, e = CM->getNumResults(); i != e; ++i) 852 NumResultBytes += EmitVBRValue(CM->getResult(i), OS); 853 OS << '\n'; 854 if (!OmitComments) { 855 OS.indent(FullIndexWidth + Indent) << " // Src: " 856 << *CM->getPattern().getSrcPattern() << " - Complexity = " 857 << CM->getPattern().getPatternComplexity(CGP) << '\n'; 858 OS.indent(FullIndexWidth + Indent) << " // Dst: " 859 << *CM->getPattern().getDstPattern(); 860 } 861 OS << '\n'; 862 return 2 + NumResultBytes + NumCoveredBytes; 863 } 864 } 865 llvm_unreachable("Unreachable"); 866 } 867 868 /// This function traverses the matcher tree and emits all the nodes. 869 /// The nodes have already been sized. 870 unsigned MatcherTableEmitter:: 871 EmitMatcherList(const Matcher *N, const unsigned Indent, unsigned CurrentIdx, 872 raw_ostream &OS) { 873 unsigned Size = 0; 874 while (N) { 875 if (!OmitComments) 876 OS << "/*" << format_decimal(CurrentIdx, IndexWidth) << "*/"; 877 unsigned MatcherSize = EmitMatcher(N, Indent, CurrentIdx, OS); 878 Size += MatcherSize; 879 CurrentIdx += MatcherSize; 880 881 // If there are other nodes in this list, iterate to them, otherwise we're 882 // done. 883 N = N->getNext(); 884 } 885 return Size; 886 } 887 888 void MatcherTableEmitter::EmitNodePredicatesFunction( 889 const std::vector<TreePredicateFn> &Preds, StringRef Decl, 890 raw_ostream &OS) { 891 if (Preds.empty()) 892 return; 893 894 BeginEmitFunction(OS, "bool", Decl, true/*AddOverride*/); 895 OS << "{\n"; 896 OS << " switch (PredNo) {\n"; 897 OS << " default: llvm_unreachable(\"Invalid predicate in table?\");\n"; 898 for (unsigned i = 0, e = Preds.size(); i != e; ++i) { 899 // Emit the predicate code corresponding to this pattern. 900 const TreePredicateFn PredFn = Preds[i]; 901 assert(!PredFn.isAlwaysTrue() && "No code in this predicate"); 902 std::string PredFnCodeStr = PredFn.getCodeToRunOnSDNode(); 903 904 OS << " case " << i << ": {\n"; 905 for (auto *SimilarPred : NodePredicatesByCodeToRun[PredFnCodeStr]) 906 OS << " // " << TreePredicateFn(SimilarPred).getFnName() << '\n'; 907 OS << PredFnCodeStr << "\n }\n"; 908 } 909 OS << " }\n"; 910 OS << "}\n"; 911 EndEmitFunction(OS); 912 } 913 914 void MatcherTableEmitter::EmitPredicateFunctions(raw_ostream &OS) { 915 // Emit pattern predicates. 916 if (!PatternPredicates.empty()) { 917 BeginEmitFunction(OS, "bool", 918 "CheckPatternPredicate(unsigned PredNo) const", true/*AddOverride*/); 919 OS << "{\n"; 920 OS << " switch (PredNo) {\n"; 921 OS << " default: llvm_unreachable(\"Invalid predicate in table?\");\n"; 922 for (unsigned i = 0, e = PatternPredicates.size(); i != e; ++i) 923 OS << " case " << i << ": return " << PatternPredicates[i] << ";\n"; 924 OS << " }\n"; 925 OS << "}\n"; 926 EndEmitFunction(OS); 927 } 928 929 // Emit Node predicates. 930 EmitNodePredicatesFunction( 931 NodePredicates, "CheckNodePredicate(SDNode *Node, unsigned PredNo) const", 932 OS); 933 EmitNodePredicatesFunction( 934 NodePredicatesWithOperands, 935 "CheckNodePredicateWithOperands(SDNode *Node, unsigned PredNo, " 936 "const SmallVectorImpl<SDValue> &Operands) const", 937 OS); 938 939 // Emit CompletePattern matchers. 940 // FIXME: This should be const. 941 if (!ComplexPatterns.empty()) { 942 BeginEmitFunction(OS, "bool", 943 "CheckComplexPattern(SDNode *Root, SDNode *Parent,\n" 944 " SDValue N, unsigned PatternNo,\n" 945 " SmallVectorImpl<std::pair<SDValue, SDNode *>> &Result)", 946 true/*AddOverride*/); 947 OS << "{\n"; 948 OS << " unsigned NextRes = Result.size();\n"; 949 OS << " switch (PatternNo) {\n"; 950 OS << " default: llvm_unreachable(\"Invalid pattern # in table?\");\n"; 951 for (unsigned i = 0, e = ComplexPatterns.size(); i != e; ++i) { 952 const ComplexPattern &P = *ComplexPatterns[i]; 953 unsigned NumOps = P.getNumOperands(); 954 955 if (P.hasProperty(SDNPHasChain)) 956 ++NumOps; // Get the chained node too. 957 958 OS << " case " << i << ":\n"; 959 if (InstrumentCoverage) 960 OS << " {\n"; 961 OS << " Result.resize(NextRes+" << NumOps << ");\n"; 962 if (InstrumentCoverage) 963 OS << " bool Succeeded = " << P.getSelectFunc(); 964 else 965 OS << " return " << P.getSelectFunc(); 966 967 OS << "("; 968 // If the complex pattern wants the root of the match, pass it in as the 969 // first argument. 970 if (P.hasProperty(SDNPWantRoot)) 971 OS << "Root, "; 972 973 // If the complex pattern wants the parent of the operand being matched, 974 // pass it in as the next argument. 975 if (P.hasProperty(SDNPWantParent)) 976 OS << "Parent, "; 977 978 OS << "N"; 979 for (unsigned i = 0; i != NumOps; ++i) 980 OS << ", Result[NextRes+" << i << "].first"; 981 OS << ");\n"; 982 if (InstrumentCoverage) { 983 OS << " if (Succeeded)\n"; 984 OS << " dbgs() << \"\\nCOMPLEX_PATTERN: " << P.getSelectFunc() 985 << "\\n\" ;\n"; 986 OS << " return Succeeded;\n"; 987 OS << " }\n"; 988 } 989 } 990 OS << " }\n"; 991 OS << "}\n"; 992 EndEmitFunction(OS); 993 } 994 995 996 // Emit SDNodeXForm handlers. 997 // FIXME: This should be const. 998 if (!NodeXForms.empty()) { 999 BeginEmitFunction(OS, "SDValue", 1000 "RunSDNodeXForm(SDValue V, unsigned XFormNo)", true/*AddOverride*/); 1001 OS << "{\n"; 1002 OS << " switch (XFormNo) {\n"; 1003 OS << " default: llvm_unreachable(\"Invalid xform # in table?\");\n"; 1004 1005 // FIXME: The node xform could take SDValue's instead of SDNode*'s. 1006 for (unsigned i = 0, e = NodeXForms.size(); i != e; ++i) { 1007 const CodeGenDAGPatterns::NodeXForm &Entry = 1008 CGP.getSDNodeTransform(NodeXForms[i]); 1009 1010 Record *SDNode = Entry.first; 1011 const std::string &Code = Entry.second; 1012 1013 OS << " case " << i << ": { "; 1014 if (!OmitComments) 1015 OS << "// " << NodeXForms[i]->getName(); 1016 OS << '\n'; 1017 1018 std::string ClassName = 1019 std::string(CGP.getSDNodeInfo(SDNode).getSDClassName()); 1020 if (ClassName == "SDNode") 1021 OS << " SDNode *N = V.getNode();\n"; 1022 else 1023 OS << " " << ClassName << " *N = cast<" << ClassName 1024 << ">(V.getNode());\n"; 1025 OS << Code << "\n }\n"; 1026 } 1027 OS << " }\n"; 1028 OS << "}\n"; 1029 EndEmitFunction(OS); 1030 } 1031 } 1032 1033 static StringRef getOpcodeString(Matcher::KindTy Kind) { 1034 switch (Kind) { 1035 case Matcher::Scope: return "OPC_Scope"; break; 1036 case Matcher::RecordNode: return "OPC_RecordNode"; break; 1037 case Matcher::RecordChild: return "OPC_RecordChild"; break; 1038 case Matcher::RecordMemRef: return "OPC_RecordMemRef"; break; 1039 case Matcher::CaptureGlueInput: return "OPC_CaptureGlueInput"; break; 1040 case Matcher::MoveChild: return "OPC_MoveChild"; break; 1041 case Matcher::MoveParent: return "OPC_MoveParent"; break; 1042 case Matcher::CheckSame: return "OPC_CheckSame"; break; 1043 case Matcher::CheckChildSame: return "OPC_CheckChildSame"; break; 1044 case Matcher::CheckPatternPredicate: 1045 return "OPC_CheckPatternPredicate"; break; 1046 case Matcher::CheckPredicate: return "OPC_CheckPredicate"; break; 1047 case Matcher::CheckOpcode: return "OPC_CheckOpcode"; break; 1048 case Matcher::SwitchOpcode: return "OPC_SwitchOpcode"; break; 1049 case Matcher::CheckType: return "OPC_CheckType"; break; 1050 case Matcher::SwitchType: return "OPC_SwitchType"; break; 1051 case Matcher::CheckChildType: return "OPC_CheckChildType"; break; 1052 case Matcher::CheckInteger: return "OPC_CheckInteger"; break; 1053 case Matcher::CheckChildInteger: return "OPC_CheckChildInteger"; break; 1054 case Matcher::CheckCondCode: return "OPC_CheckCondCode"; break; 1055 case Matcher::CheckChild2CondCode: return "OPC_CheckChild2CondCode"; break; 1056 case Matcher::CheckValueType: return "OPC_CheckValueType"; break; 1057 case Matcher::CheckComplexPat: return "OPC_CheckComplexPat"; break; 1058 case Matcher::CheckAndImm: return "OPC_CheckAndImm"; break; 1059 case Matcher::CheckOrImm: return "OPC_CheckOrImm"; break; 1060 case Matcher::CheckFoldableChainNode: 1061 return "OPC_CheckFoldableChainNode"; break; 1062 case Matcher::CheckImmAllOnesV: return "OPC_CheckImmAllOnesV"; break; 1063 case Matcher::CheckImmAllZerosV: return "OPC_CheckImmAllZerosV"; break; 1064 case Matcher::EmitInteger: return "OPC_EmitInteger"; break; 1065 case Matcher::EmitStringInteger: return "OPC_EmitStringInteger"; break; 1066 case Matcher::EmitRegister: return "OPC_EmitRegister"; break; 1067 case Matcher::EmitConvertToTarget: return "OPC_EmitConvertToTarget"; break; 1068 case Matcher::EmitMergeInputChains: return "OPC_EmitMergeInputChains"; break; 1069 case Matcher::EmitCopyToReg: return "OPC_EmitCopyToReg"; break; 1070 case Matcher::EmitNode: return "OPC_EmitNode"; break; 1071 case Matcher::MorphNodeTo: return "OPC_MorphNodeTo"; break; 1072 case Matcher::EmitNodeXForm: return "OPC_EmitNodeXForm"; break; 1073 case Matcher::CompleteMatch: return "OPC_CompleteMatch"; break; 1074 } 1075 1076 llvm_unreachable("Unhandled opcode?"); 1077 } 1078 1079 void MatcherTableEmitter::EmitHistogram(const Matcher *M, 1080 raw_ostream &OS) { 1081 if (OmitComments) 1082 return; 1083 1084 OS << " // Opcode Histogram:\n"; 1085 for (unsigned i = 0, e = OpcodeCounts.size(); i != e; ++i) { 1086 OS << " // #" 1087 << left_justify(getOpcodeString((Matcher::KindTy)i), HistOpcWidth) 1088 << " = " << OpcodeCounts[i] << '\n'; 1089 } 1090 OS << '\n'; 1091 } 1092 1093 1094 void llvm::EmitMatcherTable(Matcher *TheMatcher, 1095 const CodeGenDAGPatterns &CGP, 1096 raw_ostream &OS) { 1097 OS << "#if defined(GET_DAGISEL_DECL) && defined(GET_DAGISEL_BODY)\n"; 1098 OS << "#error GET_DAGISEL_DECL and GET_DAGISEL_BODY cannot be both defined, "; 1099 OS << "undef both for inline definitions\n"; 1100 OS << "#endif\n\n"; 1101 1102 // Emit a check for omitted class name. 1103 OS << "#ifdef GET_DAGISEL_BODY\n"; 1104 OS << "#define LOCAL_DAGISEL_STRINGIZE(X) LOCAL_DAGISEL_STRINGIZE_(X)\n"; 1105 OS << "#define LOCAL_DAGISEL_STRINGIZE_(X) #X\n"; 1106 OS << "static_assert(sizeof(LOCAL_DAGISEL_STRINGIZE(GET_DAGISEL_BODY)) > 1," 1107 "\n"; 1108 OS << " \"GET_DAGISEL_BODY is empty: it should be defined with the class " 1109 "name\");\n"; 1110 OS << "#undef LOCAL_DAGISEL_STRINGIZE_\n"; 1111 OS << "#undef LOCAL_DAGISEL_STRINGIZE\n"; 1112 OS << "#endif\n\n"; 1113 1114 OS << "#if !defined(GET_DAGISEL_DECL) && !defined(GET_DAGISEL_BODY)\n"; 1115 OS << "#define DAGISEL_INLINE 1\n"; 1116 OS << "#else\n"; 1117 OS << "#define DAGISEL_INLINE 0\n"; 1118 OS << "#endif\n\n"; 1119 1120 OS << "#if !DAGISEL_INLINE\n"; 1121 OS << "#define DAGISEL_CLASS_COLONCOLON GET_DAGISEL_BODY ::\n"; 1122 OS << "#else\n"; 1123 OS << "#define DAGISEL_CLASS_COLONCOLON\n"; 1124 OS << "#endif\n\n"; 1125 1126 BeginEmitFunction(OS, "void", "SelectCode(SDNode *N)", false/*AddOverride*/); 1127 MatcherTableEmitter MatcherEmitter(CGP); 1128 1129 // First we size all the children of the three kinds of matchers that have 1130 // them. This is done by sharing the code in EmitMatcher(). but we don't 1131 // want to emit anything, so we turn off comments and use a null stream. 1132 bool SaveOmitComments = OmitComments; 1133 OmitComments = true; 1134 raw_null_ostream NullOS; 1135 unsigned TotalSize = MatcherEmitter.SizeMatcherList(TheMatcher, NullOS); 1136 OmitComments = SaveOmitComments; 1137 1138 // Now that the matchers are sized, we can emit the code for them to the 1139 // final stream. 1140 OS << "{\n"; 1141 OS << " // Some target values are emitted as 2 bytes, TARGET_VAL handles\n"; 1142 OS << " // this.\n"; 1143 OS << " #define TARGET_VAL(X) X & 255, unsigned(X) >> 8\n"; 1144 OS << " static const unsigned char MatcherTable[] = {\n"; 1145 TotalSize = MatcherEmitter.EmitMatcherList(TheMatcher, 1, 0, OS); 1146 OS << " 0\n }; // Total Array size is " << (TotalSize+1) << " bytes\n\n"; 1147 1148 MatcherEmitter.EmitHistogram(TheMatcher, OS); 1149 1150 OS << " #undef TARGET_VAL\n"; 1151 OS << " SelectCodeCommon(N, MatcherTable,sizeof(MatcherTable));\n"; 1152 OS << "}\n"; 1153 EndEmitFunction(OS); 1154 1155 // Next up, emit the function for node and pattern predicates: 1156 MatcherEmitter.EmitPredicateFunctions(OS); 1157 1158 if (InstrumentCoverage) 1159 MatcherEmitter.EmitPatternMatchTable(OS); 1160 1161 // Clean up the preprocessor macros. 1162 OS << "\n"; 1163 OS << "#ifdef DAGISEL_INLINE\n"; 1164 OS << "#undef DAGISEL_INLINE\n"; 1165 OS << "#endif\n"; 1166 OS << "#ifdef DAGISEL_CLASS_COLONCOLON\n"; 1167 OS << "#undef DAGISEL_CLASS_COLONCOLON\n"; 1168 OS << "#endif\n"; 1169 OS << "#ifdef GET_DAGISEL_DECL\n"; 1170 OS << "#undef GET_DAGISEL_DECL\n"; 1171 OS << "#endif\n"; 1172 OS << "#ifdef GET_DAGISEL_BODY\n"; 1173 OS << "#undef GET_DAGISEL_BODY\n"; 1174 OS << "#endif\n"; 1175 } 1176