1 //===- DAGISelEmitter.cpp - Generate an instruction selector --------------===// 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 tablegen backend emits a DAG instruction selector. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "DAGISelEmitter.h" 15 #include "Record.h" 16 #include "llvm/ADT/StringExtras.h" 17 #include "llvm/Support/CommandLine.h" 18 #include "llvm/Support/Debug.h" 19 #include "llvm/Support/MathExtras.h" 20 #include "llvm/Support/Debug.h" 21 #include <algorithm> 22 #include <deque> 23 #include <iostream> 24 using namespace llvm; 25 26 namespace { 27 cl::opt<bool> 28 GenDebug("gen-debug", cl::desc("Generate debug code"), 29 cl::init(false)); 30 } 31 32 //===----------------------------------------------------------------------===// 33 // DAGISelEmitter Helper methods 34 // 35 36 /// NodeIsComplexPattern - return true if N is a leaf node and a subclass of 37 /// ComplexPattern. 38 static bool NodeIsComplexPattern(TreePatternNode *N) { 39 return (N->isLeaf() && 40 dynamic_cast<DefInit*>(N->getLeafValue()) && 41 static_cast<DefInit*>(N->getLeafValue())->getDef()-> 42 isSubClassOf("ComplexPattern")); 43 } 44 45 /// NodeGetComplexPattern - return the pointer to the ComplexPattern if N 46 /// is a leaf node and a subclass of ComplexPattern, else it returns NULL. 47 static const ComplexPattern *NodeGetComplexPattern(TreePatternNode *N, 48 CodeGenDAGPatterns &CGP) { 49 if (N->isLeaf() && 50 dynamic_cast<DefInit*>(N->getLeafValue()) && 51 static_cast<DefInit*>(N->getLeafValue())->getDef()-> 52 isSubClassOf("ComplexPattern")) { 53 return &CGP.getComplexPattern(static_cast<DefInit*>(N->getLeafValue()) 54 ->getDef()); 55 } 56 return NULL; 57 } 58 59 /// getPatternSize - Return the 'size' of this pattern. We want to match large 60 /// patterns before small ones. This is used to determine the size of a 61 /// pattern. 62 static unsigned getPatternSize(TreePatternNode *P, CodeGenDAGPatterns &CGP) { 63 assert((EMVT::isExtIntegerInVTs(P->getExtTypes()) || 64 EMVT::isExtFloatingPointInVTs(P->getExtTypes()) || 65 P->getExtTypeNum(0) == MVT::isVoid || 66 P->getExtTypeNum(0) == MVT::Flag || 67 P->getExtTypeNum(0) == MVT::iPTR || 68 P->getExtTypeNum(0) == MVT::iPTRAny) && 69 "Not a valid pattern node to size!"); 70 unsigned Size = 3; // The node itself. 71 // If the root node is a ConstantSDNode, increases its size. 72 // e.g. (set R32:$dst, 0). 73 if (P->isLeaf() && dynamic_cast<IntInit*>(P->getLeafValue())) 74 Size += 2; 75 76 // FIXME: This is a hack to statically increase the priority of patterns 77 // which maps a sub-dag to a complex pattern. e.g. favors LEA over ADD. 78 // Later we can allow complexity / cost for each pattern to be (optionally) 79 // specified. To get best possible pattern match we'll need to dynamically 80 // calculate the complexity of all patterns a dag can potentially map to. 81 const ComplexPattern *AM = NodeGetComplexPattern(P, CGP); 82 if (AM) 83 Size += AM->getNumOperands() * 3; 84 85 // If this node has some predicate function that must match, it adds to the 86 // complexity of this node. 87 if (!P->getPredicateFns().empty()) 88 ++Size; 89 90 // Count children in the count if they are also nodes. 91 for (unsigned i = 0, e = P->getNumChildren(); i != e; ++i) { 92 TreePatternNode *Child = P->getChild(i); 93 if (!Child->isLeaf() && Child->getExtTypeNum(0) != MVT::Other) 94 Size += getPatternSize(Child, CGP); 95 else if (Child->isLeaf()) { 96 if (dynamic_cast<IntInit*>(Child->getLeafValue())) 97 Size += 5; // Matches a ConstantSDNode (+3) and a specific value (+2). 98 else if (NodeIsComplexPattern(Child)) 99 Size += getPatternSize(Child, CGP); 100 else if (!Child->getPredicateFns().empty()) 101 ++Size; 102 } 103 } 104 105 return Size; 106 } 107 108 /// getResultPatternCost - Compute the number of instructions for this pattern. 109 /// This is a temporary hack. We should really include the instruction 110 /// latencies in this calculation. 111 static unsigned getResultPatternCost(TreePatternNode *P, 112 CodeGenDAGPatterns &CGP) { 113 if (P->isLeaf()) return 0; 114 115 unsigned Cost = 0; 116 Record *Op = P->getOperator(); 117 if (Op->isSubClassOf("Instruction")) { 118 Cost++; 119 CodeGenInstruction &II = CGP.getTargetInfo().getInstruction(Op->getName()); 120 if (II.usesCustomDAGSchedInserter) 121 Cost += 10; 122 } 123 for (unsigned i = 0, e = P->getNumChildren(); i != e; ++i) 124 Cost += getResultPatternCost(P->getChild(i), CGP); 125 return Cost; 126 } 127 128 /// getResultPatternCodeSize - Compute the code size of instructions for this 129 /// pattern. 130 static unsigned getResultPatternSize(TreePatternNode *P, 131 CodeGenDAGPatterns &CGP) { 132 if (P->isLeaf()) return 0; 133 134 unsigned Cost = 0; 135 Record *Op = P->getOperator(); 136 if (Op->isSubClassOf("Instruction")) { 137 Cost += Op->getValueAsInt("CodeSize"); 138 } 139 for (unsigned i = 0, e = P->getNumChildren(); i != e; ++i) 140 Cost += getResultPatternSize(P->getChild(i), CGP); 141 return Cost; 142 } 143 144 // PatternSortingPredicate - return true if we prefer to match LHS before RHS. 145 // In particular, we want to match maximal patterns first and lowest cost within 146 // a particular complexity first. 147 struct PatternSortingPredicate { 148 PatternSortingPredicate(CodeGenDAGPatterns &cgp) : CGP(cgp) {} 149 CodeGenDAGPatterns &CGP; 150 151 typedef std::pair<unsigned, std::string> CodeLine; 152 typedef std::vector<CodeLine> CodeList; 153 typedef std::vector<std::pair<const PatternToMatch*, CodeList> > PatternList; 154 155 bool operator()(const std::pair<const PatternToMatch*, CodeList> &LHSPair, 156 const std::pair<const PatternToMatch*, CodeList> &RHSPair) { 157 const PatternToMatch *LHS = LHSPair.first; 158 const PatternToMatch *RHS = RHSPair.first; 159 160 unsigned LHSSize = getPatternSize(LHS->getSrcPattern(), CGP); 161 unsigned RHSSize = getPatternSize(RHS->getSrcPattern(), CGP); 162 LHSSize += LHS->getAddedComplexity(); 163 RHSSize += RHS->getAddedComplexity(); 164 if (LHSSize > RHSSize) return true; // LHS -> bigger -> less cost 165 if (LHSSize < RHSSize) return false; 166 167 // If the patterns have equal complexity, compare generated instruction cost 168 unsigned LHSCost = getResultPatternCost(LHS->getDstPattern(), CGP); 169 unsigned RHSCost = getResultPatternCost(RHS->getDstPattern(), CGP); 170 if (LHSCost < RHSCost) return true; 171 if (LHSCost > RHSCost) return false; 172 173 return getResultPatternSize(LHS->getDstPattern(), CGP) < 174 getResultPatternSize(RHS->getDstPattern(), CGP); 175 } 176 }; 177 178 /// getRegisterValueType - Look up and return the ValueType of the specified 179 /// register. If the register is a member of multiple register classes which 180 /// have different associated types, return MVT::Other. 181 static MVT::SimpleValueType getRegisterValueType(Record *R, const CodeGenTarget &T) { 182 bool FoundRC = false; 183 MVT::SimpleValueType VT = MVT::Other; 184 const std::vector<CodeGenRegisterClass> &RCs = T.getRegisterClasses(); 185 std::vector<CodeGenRegisterClass>::const_iterator RC; 186 std::vector<Record*>::const_iterator Element; 187 188 for (RC = RCs.begin() ; RC != RCs.end() ; RC++) { 189 Element = find((*RC).Elements.begin(), (*RC).Elements.end(), R); 190 if (Element != (*RC).Elements.end()) { 191 if (!FoundRC) { 192 FoundRC = true; 193 VT = (*RC).getValueTypeNum(0); 194 } else { 195 // In multiple RC's 196 if (VT != (*RC).getValueTypeNum(0)) { 197 // Types of the RC's do not agree. Return MVT::Other. The 198 // target is responsible for handling this. 199 return MVT::Other; 200 } 201 } 202 } 203 } 204 return VT; 205 } 206 207 208 /// RemoveAllTypes - A quick recursive walk over a pattern which removes all 209 /// type information from it. 210 static void RemoveAllTypes(TreePatternNode *N) { 211 N->removeTypes(); 212 if (!N->isLeaf()) 213 for (unsigned i = 0, e = N->getNumChildren(); i != e; ++i) 214 RemoveAllTypes(N->getChild(i)); 215 } 216 217 /// NodeHasProperty - return true if TreePatternNode has the specified 218 /// property. 219 static bool NodeHasProperty(TreePatternNode *N, SDNP Property, 220 CodeGenDAGPatterns &CGP) { 221 if (N->isLeaf()) { 222 const ComplexPattern *CP = NodeGetComplexPattern(N, CGP); 223 if (CP) 224 return CP->hasProperty(Property); 225 return false; 226 } 227 Record *Operator = N->getOperator(); 228 if (!Operator->isSubClassOf("SDNode")) return false; 229 230 return CGP.getSDNodeInfo(Operator).hasProperty(Property); 231 } 232 233 static bool PatternHasProperty(TreePatternNode *N, SDNP Property, 234 CodeGenDAGPatterns &CGP) { 235 if (NodeHasProperty(N, Property, CGP)) 236 return true; 237 238 for (unsigned i = 0, e = N->getNumChildren(); i != e; ++i) { 239 TreePatternNode *Child = N->getChild(i); 240 if (PatternHasProperty(Child, Property, CGP)) 241 return true; 242 } 243 244 return false; 245 } 246 247 static std::string getOpcodeName(Record *Op, CodeGenDAGPatterns &CGP) { 248 return CGP.getSDNodeInfo(Op).getEnumName(); 249 } 250 251 static 252 bool DisablePatternForFastISel(TreePatternNode *N, CodeGenDAGPatterns &CGP) { 253 bool isStore = !N->isLeaf() && 254 getOpcodeName(N->getOperator(), CGP) == "ISD::STORE"; 255 if (!isStore && NodeHasProperty(N, SDNPHasChain, CGP)) 256 return false; 257 258 bool HasChain = false; 259 for (unsigned i = 0, e = N->getNumChildren(); i != e; ++i) { 260 TreePatternNode *Child = N->getChild(i); 261 if (PatternHasProperty(Child, SDNPHasChain, CGP)) { 262 HasChain = true; 263 break; 264 } 265 } 266 return HasChain; 267 } 268 269 //===----------------------------------------------------------------------===// 270 // Node Transformation emitter implementation. 271 // 272 void DAGISelEmitter::EmitNodeTransforms(raw_ostream &OS) { 273 // Walk the pattern fragments, adding them to a map, which sorts them by 274 // name. 275 typedef std::map<std::string, CodeGenDAGPatterns::NodeXForm> NXsByNameTy; 276 NXsByNameTy NXsByName; 277 278 for (CodeGenDAGPatterns::nx_iterator I = CGP.nx_begin(), E = CGP.nx_end(); 279 I != E; ++I) 280 NXsByName.insert(std::make_pair(I->first->getName(), I->second)); 281 282 OS << "\n// Node transformations.\n"; 283 284 for (NXsByNameTy::iterator I = NXsByName.begin(), E = NXsByName.end(); 285 I != E; ++I) { 286 Record *SDNode = I->second.first; 287 std::string Code = I->second.second; 288 289 if (Code.empty()) continue; // Empty code? Skip it. 290 291 std::string ClassName = CGP.getSDNodeInfo(SDNode).getSDClassName(); 292 const char *C2 = ClassName == "SDNode" ? "N" : "inN"; 293 294 OS << "inline SDValue Transform_" << I->first << "(SDNode *" << C2 295 << ") {\n"; 296 if (ClassName != "SDNode") 297 OS << " " << ClassName << " *N = cast<" << ClassName << ">(inN);\n"; 298 OS << Code << "\n}\n"; 299 } 300 } 301 302 //===----------------------------------------------------------------------===// 303 // Predicate emitter implementation. 304 // 305 306 void DAGISelEmitter::EmitPredicateFunctions(raw_ostream &OS) { 307 OS << "\n// Predicate functions.\n"; 308 309 // Walk the pattern fragments, adding them to a map, which sorts them by 310 // name. 311 typedef std::map<std::string, std::pair<Record*, TreePattern*> > PFsByNameTy; 312 PFsByNameTy PFsByName; 313 314 for (CodeGenDAGPatterns::pf_iterator I = CGP.pf_begin(), E = CGP.pf_end(); 315 I != E; ++I) 316 PFsByName.insert(std::make_pair(I->first->getName(), *I)); 317 318 319 for (PFsByNameTy::iterator I = PFsByName.begin(), E = PFsByName.end(); 320 I != E; ++I) { 321 Record *PatFragRecord = I->second.first;// Record that derives from PatFrag. 322 TreePattern *P = I->second.second; 323 324 // If there is a code init for this fragment, emit the predicate code. 325 std::string Code = PatFragRecord->getValueAsCode("Predicate"); 326 if (Code.empty()) continue; 327 328 if (P->getOnlyTree()->isLeaf()) 329 OS << "inline bool Predicate_" << PatFragRecord->getName() 330 << "(SDNode *N) {\n"; 331 else { 332 std::string ClassName = 333 CGP.getSDNodeInfo(P->getOnlyTree()->getOperator()).getSDClassName(); 334 const char *C2 = ClassName == "SDNode" ? "N" : "inN"; 335 336 OS << "inline bool Predicate_" << PatFragRecord->getName() 337 << "(SDNode *" << C2 << ") {\n"; 338 if (ClassName != "SDNode") 339 OS << " " << ClassName << " *N = cast<" << ClassName << ">(inN);\n"; 340 } 341 OS << Code << "\n}\n"; 342 } 343 344 OS << "\n\n"; 345 } 346 347 348 //===----------------------------------------------------------------------===// 349 // PatternCodeEmitter implementation. 350 // 351 class PatternCodeEmitter { 352 private: 353 CodeGenDAGPatterns &CGP; 354 355 // Predicates. 356 std::string PredicateCheck; 357 // Pattern cost. 358 unsigned Cost; 359 // Instruction selector pattern. 360 TreePatternNode *Pattern; 361 // Matched instruction. 362 TreePatternNode *Instruction; 363 364 // Node to name mapping 365 std::map<std::string, std::string> VariableMap; 366 // Node to operator mapping 367 std::map<std::string, Record*> OperatorMap; 368 // Name of the folded node which produces a flag. 369 std::pair<std::string, unsigned> FoldedFlag; 370 // Names of all the folded nodes which produce chains. 371 std::vector<std::pair<std::string, unsigned> > FoldedChains; 372 // Original input chain(s). 373 std::vector<std::pair<std::string, std::string> > OrigChains; 374 std::set<std::string> Duplicates; 375 376 /// LSI - Load/Store information. 377 /// Save loads/stores matched by a pattern, and generate a MemOperandSDNode 378 /// for each memory access. This facilitates the use of AliasAnalysis in 379 /// the backend. 380 std::vector<std::string> LSI; 381 382 /// GeneratedCode - This is the buffer that we emit code to. The first int 383 /// indicates whether this is an exit predicate (something that should be 384 /// tested, and if true, the match fails) [when 1], or normal code to emit 385 /// [when 0], or initialization code to emit [when 2]. 386 std::vector<std::pair<unsigned, std::string> > &GeneratedCode; 387 /// GeneratedDecl - This is the set of all SDValue declarations needed for 388 /// the set of patterns for each top-level opcode. 389 std::set<std::string> &GeneratedDecl; 390 /// TargetOpcodes - The target specific opcodes used by the resulting 391 /// instructions. 392 std::vector<std::string> &TargetOpcodes; 393 std::vector<std::string> &TargetVTs; 394 /// OutputIsVariadic - Records whether the instruction output pattern uses 395 /// variable_ops. This requires that the Emit function be passed an 396 /// additional argument to indicate where the input varargs operands 397 /// begin. 398 bool &OutputIsVariadic; 399 /// NumInputRootOps - Records the number of operands the root node of the 400 /// input pattern has. This information is used in the generated code to 401 /// pass to Emit functions when variable_ops processing is needed. 402 unsigned &NumInputRootOps; 403 404 std::string ChainName; 405 unsigned TmpNo; 406 unsigned OpcNo; 407 unsigned VTNo; 408 409 void emitCheck(const std::string &S) { 410 if (!S.empty()) 411 GeneratedCode.push_back(std::make_pair(1, S)); 412 } 413 void emitCode(const std::string &S) { 414 if (!S.empty()) 415 GeneratedCode.push_back(std::make_pair(0, S)); 416 } 417 void emitInit(const std::string &S) { 418 if (!S.empty()) 419 GeneratedCode.push_back(std::make_pair(2, S)); 420 } 421 void emitDecl(const std::string &S) { 422 assert(!S.empty() && "Invalid declaration"); 423 GeneratedDecl.insert(S); 424 } 425 void emitOpcode(const std::string &Opc) { 426 TargetOpcodes.push_back(Opc); 427 OpcNo++; 428 } 429 void emitVT(const std::string &VT) { 430 TargetVTs.push_back(VT); 431 VTNo++; 432 } 433 public: 434 PatternCodeEmitter(CodeGenDAGPatterns &cgp, std::string predcheck, 435 TreePatternNode *pattern, TreePatternNode *instr, 436 std::vector<std::pair<unsigned, std::string> > &gc, 437 std::set<std::string> &gd, 438 std::vector<std::string> &to, 439 std::vector<std::string> &tv, 440 bool &oiv, 441 unsigned &niro) 442 : CGP(cgp), PredicateCheck(predcheck), Pattern(pattern), Instruction(instr), 443 GeneratedCode(gc), GeneratedDecl(gd), 444 TargetOpcodes(to), TargetVTs(tv), 445 OutputIsVariadic(oiv), NumInputRootOps(niro), 446 TmpNo(0), OpcNo(0), VTNo(0) {} 447 448 /// EmitMatchCode - Emit a matcher for N, going to the label for PatternNo 449 /// if the match fails. At this point, we already know that the opcode for N 450 /// matches, and the SDNode for the result has the RootName specified name. 451 void EmitMatchCode(TreePatternNode *N, TreePatternNode *P, 452 const std::string &RootName, const std::string &ChainSuffix, 453 bool &FoundChain) { 454 455 // Save loads/stores matched by a pattern. 456 if (!N->isLeaf() && N->getName().empty()) { 457 if (NodeHasProperty(N, SDNPMemOperand, CGP)) 458 LSI.push_back(RootName); 459 } 460 461 bool isRoot = (P == NULL); 462 // Emit instruction predicates. Each predicate is just a string for now. 463 if (isRoot) { 464 // Record input varargs info. 465 NumInputRootOps = N->getNumChildren(); 466 467 if (DisablePatternForFastISel(N, CGP)) 468 emitCheck("OptLevel != CodeGenOpt::None"); 469 470 emitCheck(PredicateCheck); 471 } 472 473 if (N->isLeaf()) { 474 if (IntInit *II = dynamic_cast<IntInit*>(N->getLeafValue())) { 475 emitCheck("cast<ConstantSDNode>(" + RootName + 476 ")->getSExtValue() == INT64_C(" + 477 itostr(II->getValue()) + ")"); 478 return; 479 } else if (!NodeIsComplexPattern(N)) { 480 assert(0 && "Cannot match this as a leaf value!"); 481 abort(); 482 } 483 } 484 485 // If this node has a name associated with it, capture it in VariableMap. If 486 // we already saw this in the pattern, emit code to verify dagness. 487 if (!N->getName().empty()) { 488 std::string &VarMapEntry = VariableMap[N->getName()]; 489 if (VarMapEntry.empty()) { 490 VarMapEntry = RootName; 491 } else { 492 // If we get here, this is a second reference to a specific name. Since 493 // we already have checked that the first reference is valid, we don't 494 // have to recursively match it, just check that it's the same as the 495 // previously named thing. 496 emitCheck(VarMapEntry + " == " + RootName); 497 return; 498 } 499 500 if (!N->isLeaf()) 501 OperatorMap[N->getName()] = N->getOperator(); 502 } 503 504 505 // Emit code to load the child nodes and match their contents recursively. 506 unsigned OpNo = 0; 507 bool NodeHasChain = NodeHasProperty (N, SDNPHasChain, CGP); 508 bool HasChain = PatternHasProperty(N, SDNPHasChain, CGP); 509 bool EmittedUseCheck = false; 510 if (HasChain) { 511 if (NodeHasChain) 512 OpNo = 1; 513 if (!isRoot) { 514 // Multiple uses of actual result? 515 emitCheck(RootName + ".hasOneUse()"); 516 EmittedUseCheck = true; 517 if (NodeHasChain) { 518 // If the immediate use can somehow reach this node through another 519 // path, then can't fold it either or it will create a cycle. 520 // e.g. In the following diagram, XX can reach ld through YY. If 521 // ld is folded into XX, then YY is both a predecessor and a successor 522 // of XX. 523 // 524 // [ld] 525 // ^ ^ 526 // | | 527 // / \--- 528 // / [YY] 529 // | ^ 530 // [XX]-------| 531 bool NeedCheck = P != Pattern; 532 if (!NeedCheck) { 533 const SDNodeInfo &PInfo = CGP.getSDNodeInfo(P->getOperator()); 534 NeedCheck = 535 P->getOperator() == CGP.get_intrinsic_void_sdnode() || 536 P->getOperator() == CGP.get_intrinsic_w_chain_sdnode() || 537 P->getOperator() == CGP.get_intrinsic_wo_chain_sdnode() || 538 PInfo.getNumOperands() > 1 || 539 PInfo.hasProperty(SDNPHasChain) || 540 PInfo.hasProperty(SDNPInFlag) || 541 PInfo.hasProperty(SDNPOptInFlag); 542 } 543 544 if (NeedCheck) { 545 std::string ParentName(RootName.begin(), RootName.end()-1); 546 emitCheck("IsLegalAndProfitableToFold(" + RootName + 547 ".getNode(), " + ParentName + ".getNode(), N.getNode())"); 548 } 549 } 550 } 551 552 if (NodeHasChain) { 553 if (FoundChain) { 554 emitCheck("(" + ChainName + ".getNode() == " + RootName + ".getNode() || " 555 "IsChainCompatible(" + ChainName + ".getNode(), " + 556 RootName + ".getNode()))"); 557 OrigChains.push_back(std::make_pair(ChainName, RootName)); 558 } else 559 FoundChain = true; 560 ChainName = "Chain" + ChainSuffix; 561 emitInit("SDValue " + ChainName + " = " + RootName + 562 ".getOperand(0);"); 563 } 564 } 565 566 // Don't fold any node which reads or writes a flag and has multiple uses. 567 // FIXME: We really need to separate the concepts of flag and "glue". Those 568 // real flag results, e.g. X86CMP output, can have multiple uses. 569 // FIXME: If the optional incoming flag does not exist. Then it is ok to 570 // fold it. 571 if (!isRoot && 572 (PatternHasProperty(N, SDNPInFlag, CGP) || 573 PatternHasProperty(N, SDNPOptInFlag, CGP) || 574 PatternHasProperty(N, SDNPOutFlag, CGP))) { 575 if (!EmittedUseCheck) { 576 // Multiple uses of actual result? 577 emitCheck(RootName + ".hasOneUse()"); 578 } 579 } 580 581 // If there are node predicates for this, emit the calls. 582 for (unsigned i = 0, e = N->getPredicateFns().size(); i != e; ++i) 583 emitCheck(N->getPredicateFns()[i] + "(" + RootName + ".getNode())"); 584 585 // If this is an 'and R, 1234' where the operation is AND/OR and the RHS is 586 // a constant without a predicate fn that has more that one bit set, handle 587 // this as a special case. This is usually for targets that have special 588 // handling of certain large constants (e.g. alpha with it's 8/16/32-bit 589 // handling stuff). Using these instructions is often far more efficient 590 // than materializing the constant. Unfortunately, both the instcombiner 591 // and the dag combiner can often infer that bits are dead, and thus drop 592 // them from the mask in the dag. For example, it might turn 'AND X, 255' 593 // into 'AND X, 254' if it knows the low bit is set. Emit code that checks 594 // to handle this. 595 if (!N->isLeaf() && 596 (N->getOperator()->getName() == "and" || 597 N->getOperator()->getName() == "or") && 598 N->getChild(1)->isLeaf() && 599 N->getChild(1)->getPredicateFns().empty()) { 600 if (IntInit *II = dynamic_cast<IntInit*>(N->getChild(1)->getLeafValue())) { 601 if (!isPowerOf2_32(II->getValue())) { // Don't bother with single bits. 602 emitInit("SDValue " + RootName + "0" + " = " + 603 RootName + ".getOperand(" + utostr(0) + ");"); 604 emitInit("SDValue " + RootName + "1" + " = " + 605 RootName + ".getOperand(" + utostr(1) + ");"); 606 607 unsigned NTmp = TmpNo++; 608 emitCode("ConstantSDNode *Tmp" + utostr(NTmp) + 609 " = dyn_cast<ConstantSDNode>(" + RootName + "1);"); 610 emitCheck("Tmp" + utostr(NTmp)); 611 const char *MaskPredicate = N->getOperator()->getName() == "or" 612 ? "CheckOrMask(" : "CheckAndMask("; 613 emitCheck(MaskPredicate + RootName + "0, Tmp" + utostr(NTmp) + 614 ", INT64_C(" + itostr(II->getValue()) + "))"); 615 616 EmitChildMatchCode(N->getChild(0), N, RootName + utostr(0), RootName, 617 ChainSuffix + utostr(0), FoundChain); 618 return; 619 } 620 } 621 } 622 623 for (unsigned i = 0, e = N->getNumChildren(); i != e; ++i, ++OpNo) { 624 emitInit("SDValue " + RootName + utostr(OpNo) + " = " + 625 RootName + ".getOperand(" +utostr(OpNo) + ");"); 626 627 EmitChildMatchCode(N->getChild(i), N, RootName + utostr(OpNo), RootName, 628 ChainSuffix + utostr(OpNo), FoundChain); 629 } 630 631 // Handle cases when root is a complex pattern. 632 const ComplexPattern *CP; 633 if (isRoot && N->isLeaf() && (CP = NodeGetComplexPattern(N, CGP))) { 634 std::string Fn = CP->getSelectFunc(); 635 unsigned NumOps = CP->getNumOperands(); 636 for (unsigned i = 0; i < NumOps; ++i) { 637 emitDecl("CPTmp" + RootName + "_" + utostr(i)); 638 emitCode("SDValue CPTmp" + RootName + "_" + utostr(i) + ";"); 639 } 640 if (CP->hasProperty(SDNPHasChain)) { 641 emitDecl("CPInChain"); 642 emitDecl("Chain" + ChainSuffix); 643 emitCode("SDValue CPInChain;"); 644 emitCode("SDValue Chain" + ChainSuffix + ";"); 645 } 646 647 std::string Code = Fn + "(" + RootName + ", " + RootName; 648 for (unsigned i = 0; i < NumOps; i++) 649 Code += ", CPTmp" + RootName + "_" + utostr(i); 650 if (CP->hasProperty(SDNPHasChain)) { 651 ChainName = "Chain" + ChainSuffix; 652 Code += ", CPInChain, Chain" + ChainSuffix; 653 } 654 emitCheck(Code + ")"); 655 } 656 } 657 658 void EmitChildMatchCode(TreePatternNode *Child, TreePatternNode *Parent, 659 const std::string &RootName, 660 const std::string &ParentRootName, 661 const std::string &ChainSuffix, bool &FoundChain) { 662 if (!Child->isLeaf()) { 663 // If it's not a leaf, recursively match. 664 const SDNodeInfo &CInfo = CGP.getSDNodeInfo(Child->getOperator()); 665 emitCheck(RootName + ".getOpcode() == " + 666 CInfo.getEnumName()); 667 EmitMatchCode(Child, Parent, RootName, ChainSuffix, FoundChain); 668 bool HasChain = false; 669 if (NodeHasProperty(Child, SDNPHasChain, CGP)) { 670 HasChain = true; 671 FoldedChains.push_back(std::make_pair(RootName, CInfo.getNumResults())); 672 } 673 if (NodeHasProperty(Child, SDNPOutFlag, CGP)) { 674 assert(FoldedFlag.first == "" && FoldedFlag.second == 0 && 675 "Pattern folded multiple nodes which produce flags?"); 676 FoldedFlag = std::make_pair(RootName, 677 CInfo.getNumResults() + (unsigned)HasChain); 678 } 679 } else { 680 // If this child has a name associated with it, capture it in VarMap. If 681 // we already saw this in the pattern, emit code to verify dagness. 682 if (!Child->getName().empty()) { 683 std::string &VarMapEntry = VariableMap[Child->getName()]; 684 if (VarMapEntry.empty()) { 685 VarMapEntry = RootName; 686 } else { 687 // If we get here, this is a second reference to a specific name. 688 // Since we already have checked that the first reference is valid, 689 // we don't have to recursively match it, just check that it's the 690 // same as the previously named thing. 691 emitCheck(VarMapEntry + " == " + RootName); 692 Duplicates.insert(RootName); 693 return; 694 } 695 } 696 697 // Handle leaves of various types. 698 if (DefInit *DI = dynamic_cast<DefInit*>(Child->getLeafValue())) { 699 Record *LeafRec = DI->getDef(); 700 if (LeafRec->isSubClassOf("RegisterClass") || 701 LeafRec->getName() == "ptr_rc") { 702 // Handle register references. Nothing to do here. 703 } else if (LeafRec->isSubClassOf("Register")) { 704 // Handle register references. 705 } else if (LeafRec->isSubClassOf("ComplexPattern")) { 706 // Handle complex pattern. 707 const ComplexPattern *CP = NodeGetComplexPattern(Child, CGP); 708 std::string Fn = CP->getSelectFunc(); 709 unsigned NumOps = CP->getNumOperands(); 710 for (unsigned i = 0; i < NumOps; ++i) { 711 emitDecl("CPTmp" + RootName + "_" + utostr(i)); 712 emitCode("SDValue CPTmp" + RootName + "_" + utostr(i) + ";"); 713 } 714 if (CP->hasProperty(SDNPHasChain)) { 715 const SDNodeInfo &PInfo = CGP.getSDNodeInfo(Parent->getOperator()); 716 FoldedChains.push_back(std::make_pair("CPInChain", 717 PInfo.getNumResults())); 718 ChainName = "Chain" + ChainSuffix; 719 emitDecl("CPInChain"); 720 emitDecl(ChainName); 721 emitCode("SDValue CPInChain;"); 722 emitCode("SDValue " + ChainName + ";"); 723 } 724 725 std::string Code = Fn + "("; 726 if (CP->hasAttribute(CPAttrParentAsRoot)) { 727 Code += ParentRootName + ", "; 728 } else { 729 Code += "N, "; 730 } 731 if (CP->hasProperty(SDNPHasChain)) { 732 std::string ParentName(RootName.begin(), RootName.end()-1); 733 Code += ParentName + ", "; 734 } 735 Code += RootName; 736 for (unsigned i = 0; i < NumOps; i++) 737 Code += ", CPTmp" + RootName + "_" + utostr(i); 738 if (CP->hasProperty(SDNPHasChain)) 739 Code += ", CPInChain, Chain" + ChainSuffix; 740 emitCheck(Code + ")"); 741 } else if (LeafRec->getName() == "srcvalue") { 742 // Place holder for SRCVALUE nodes. Nothing to do here. 743 } else if (LeafRec->isSubClassOf("ValueType")) { 744 // Make sure this is the specified value type. 745 emitCheck("cast<VTSDNode>(" + RootName + 746 ")->getVT() == MVT::" + LeafRec->getName()); 747 } else if (LeafRec->isSubClassOf("CondCode")) { 748 // Make sure this is the specified cond code. 749 emitCheck("cast<CondCodeSDNode>(" + RootName + 750 ")->get() == ISD::" + LeafRec->getName()); 751 } else { 752 #ifndef NDEBUG 753 Child->dump(); 754 errs() << " "; 755 #endif 756 assert(0 && "Unknown leaf type!"); 757 } 758 759 // If there are node predicates for this, emit the calls. 760 for (unsigned i = 0, e = Child->getPredicateFns().size(); i != e; ++i) 761 emitCheck(Child->getPredicateFns()[i] + "(" + RootName + 762 ".getNode())"); 763 } else if (IntInit *II = 764 dynamic_cast<IntInit*>(Child->getLeafValue())) { 765 unsigned NTmp = TmpNo++; 766 emitCode("ConstantSDNode *Tmp"+ utostr(NTmp) + 767 " = dyn_cast<ConstantSDNode>("+ 768 RootName + ");"); 769 emitCheck("Tmp" + utostr(NTmp)); 770 unsigned CTmp = TmpNo++; 771 emitCode("int64_t CN"+ utostr(CTmp) + 772 " = Tmp" + utostr(NTmp) + "->getSExtValue();"); 773 emitCheck("CN" + utostr(CTmp) + " == " 774 "INT64_C(" +itostr(II->getValue()) + ")"); 775 } else { 776 #ifndef NDEBUG 777 Child->dump(); 778 #endif 779 assert(0 && "Unknown leaf type!"); 780 } 781 } 782 } 783 784 /// EmitResultCode - Emit the action for a pattern. Now that it has matched 785 /// we actually have to build a DAG! 786 std::vector<std::string> 787 EmitResultCode(TreePatternNode *N, std::vector<Record*> DstRegs, 788 bool InFlagDecled, bool ResNodeDecled, 789 bool LikeLeaf = false, bool isRoot = false) { 790 // List of arguments of getTargetNode() or SelectNodeTo(). 791 std::vector<std::string> NodeOps; 792 // This is something selected from the pattern we matched. 793 if (!N->getName().empty()) { 794 const std::string &VarName = N->getName(); 795 std::string Val = VariableMap[VarName]; 796 bool ModifiedVal = false; 797 if (Val.empty()) { 798 errs() << "Variable '" << VarName << " referenced but not defined " 799 << "and not caught earlier!\n"; 800 abort(); 801 } 802 if (Val[0] == 'T' && Val[1] == 'm' && Val[2] == 'p') { 803 // Already selected this operand, just return the tmpval. 804 NodeOps.push_back(Val); 805 return NodeOps; 806 } 807 808 const ComplexPattern *CP; 809 unsigned ResNo = TmpNo++; 810 if (!N->isLeaf() && N->getOperator()->getName() == "imm") { 811 assert(N->getExtTypes().size() == 1 && "Multiple types not handled!"); 812 std::string CastType; 813 std::string TmpVar = "Tmp" + utostr(ResNo); 814 switch (N->getTypeNum(0)) { 815 default: 816 errs() << "Cannot handle " << getEnumName(N->getTypeNum(0)) 817 << " type as an immediate constant. Aborting\n"; 818 abort(); 819 case MVT::i1: CastType = "bool"; break; 820 case MVT::i8: CastType = "unsigned char"; break; 821 case MVT::i16: CastType = "unsigned short"; break; 822 case MVT::i32: CastType = "unsigned"; break; 823 case MVT::i64: CastType = "uint64_t"; break; 824 } 825 emitCode("SDValue " + TmpVar + 826 " = CurDAG->getTargetConstant(((" + CastType + 827 ") cast<ConstantSDNode>(" + Val + ")->getZExtValue()), " + 828 getEnumName(N->getTypeNum(0)) + ");"); 829 // Add Tmp<ResNo> to VariableMap, so that we don't multiply select this 830 // value if used multiple times by this pattern result. 831 Val = TmpVar; 832 ModifiedVal = true; 833 NodeOps.push_back(Val); 834 } else if (!N->isLeaf() && N->getOperator()->getName() == "fpimm") { 835 assert(N->getExtTypes().size() == 1 && "Multiple types not handled!"); 836 std::string TmpVar = "Tmp" + utostr(ResNo); 837 emitCode("SDValue " + TmpVar + 838 " = CurDAG->getTargetConstantFP(*cast<ConstantFPSDNode>(" + 839 Val + ")->getConstantFPValue(), cast<ConstantFPSDNode>(" + 840 Val + ")->getValueType(0));"); 841 // Add Tmp<ResNo> to VariableMap, so that we don't multiply select this 842 // value if used multiple times by this pattern result. 843 Val = TmpVar; 844 ModifiedVal = true; 845 NodeOps.push_back(Val); 846 } else if (!N->isLeaf() && N->getOperator()->getName() == "texternalsym"){ 847 Record *Op = OperatorMap[N->getName()]; 848 // Transform ExternalSymbol to TargetExternalSymbol 849 if (Op && Op->getName() == "externalsym") { 850 std::string TmpVar = "Tmp"+utostr(ResNo); 851 emitCode("SDValue " + TmpVar + " = CurDAG->getTarget" 852 "ExternalSymbol(cast<ExternalSymbolSDNode>(" + 853 Val + ")->getSymbol(), " + 854 getEnumName(N->getTypeNum(0)) + ");"); 855 // Add Tmp<ResNo> to VariableMap, so that we don't multiply select 856 // this value if used multiple times by this pattern result. 857 Val = TmpVar; 858 ModifiedVal = true; 859 } 860 NodeOps.push_back(Val); 861 } else if (!N->isLeaf() && (N->getOperator()->getName() == "tglobaladdr" 862 || N->getOperator()->getName() == "tglobaltlsaddr")) { 863 Record *Op = OperatorMap[N->getName()]; 864 // Transform GlobalAddress to TargetGlobalAddress 865 if (Op && (Op->getName() == "globaladdr" || 866 Op->getName() == "globaltlsaddr")) { 867 std::string TmpVar = "Tmp" + utostr(ResNo); 868 emitCode("SDValue " + TmpVar + " = CurDAG->getTarget" 869 "GlobalAddress(cast<GlobalAddressSDNode>(" + Val + 870 ")->getGlobal(), " + getEnumName(N->getTypeNum(0)) + 871 ");"); 872 // Add Tmp<ResNo> to VariableMap, so that we don't multiply select 873 // this value if used multiple times by this pattern result. 874 Val = TmpVar; 875 ModifiedVal = true; 876 } 877 NodeOps.push_back(Val); 878 } else if (!N->isLeaf() 879 && (N->getOperator()->getName() == "texternalsym" 880 || N->getOperator()->getName() == "tconstpool")) { 881 // Do not rewrite the variable name, since we don't generate a new 882 // temporary. 883 NodeOps.push_back(Val); 884 } else if (N->isLeaf() && (CP = NodeGetComplexPattern(N, CGP))) { 885 for (unsigned i = 0; i < CP->getNumOperands(); ++i) { 886 NodeOps.push_back("CPTmp" + Val + "_" + utostr(i)); 887 } 888 } else { 889 // This node, probably wrapped in a SDNodeXForm, behaves like a leaf 890 // node even if it isn't one. Don't select it. 891 if (!LikeLeaf) { 892 if (isRoot && N->isLeaf()) { 893 emitCode("ReplaceUses(N, " + Val + ");"); 894 emitCode("return NULL;"); 895 } 896 } 897 NodeOps.push_back(Val); 898 } 899 900 if (ModifiedVal) { 901 VariableMap[VarName] = Val; 902 } 903 return NodeOps; 904 } 905 if (N->isLeaf()) { 906 // If this is an explicit register reference, handle it. 907 if (DefInit *DI = dynamic_cast<DefInit*>(N->getLeafValue())) { 908 unsigned ResNo = TmpNo++; 909 if (DI->getDef()->isSubClassOf("Register")) { 910 emitCode("SDValue Tmp" + utostr(ResNo) + " = CurDAG->getRegister(" + 911 getQualifiedName(DI->getDef()) + ", " + 912 getEnumName(N->getTypeNum(0)) + ");"); 913 NodeOps.push_back("Tmp" + utostr(ResNo)); 914 return NodeOps; 915 } else if (DI->getDef()->getName() == "zero_reg") { 916 emitCode("SDValue Tmp" + utostr(ResNo) + 917 " = CurDAG->getRegister(0, " + 918 getEnumName(N->getTypeNum(0)) + ");"); 919 NodeOps.push_back("Tmp" + utostr(ResNo)); 920 return NodeOps; 921 } else if (DI->getDef()->isSubClassOf("RegisterClass")) { 922 // Handle a reference to a register class. This is used 923 // in COPY_TO_SUBREG instructions. 924 emitCode("SDValue Tmp" + utostr(ResNo) + 925 " = CurDAG->getTargetConstant(" + 926 getQualifiedName(DI->getDef()) + "RegClassID, " + 927 "MVT::i32);"); 928 NodeOps.push_back("Tmp" + utostr(ResNo)); 929 return NodeOps; 930 } 931 } else if (IntInit *II = dynamic_cast<IntInit*>(N->getLeafValue())) { 932 unsigned ResNo = TmpNo++; 933 assert(N->getExtTypes().size() == 1 && "Multiple types not handled!"); 934 emitCode("SDValue Tmp" + utostr(ResNo) + 935 " = CurDAG->getTargetConstant(0x" + itohexstr(II->getValue()) + 936 "ULL, " + getEnumName(N->getTypeNum(0)) + ");"); 937 NodeOps.push_back("Tmp" + utostr(ResNo)); 938 return NodeOps; 939 } 940 941 #ifndef NDEBUG 942 N->dump(); 943 #endif 944 assert(0 && "Unknown leaf type!"); 945 return NodeOps; 946 } 947 948 Record *Op = N->getOperator(); 949 if (Op->isSubClassOf("Instruction")) { 950 const CodeGenTarget &CGT = CGP.getTargetInfo(); 951 CodeGenInstruction &II = CGT.getInstruction(Op->getName()); 952 const DAGInstruction &Inst = CGP.getInstruction(Op); 953 const TreePattern *InstPat = Inst.getPattern(); 954 // FIXME: Assume actual pattern comes before "implicit". 955 TreePatternNode *InstPatNode = 956 isRoot ? (InstPat ? InstPat->getTree(0) : Pattern) 957 : (InstPat ? InstPat->getTree(0) : NULL); 958 if (InstPatNode && !InstPatNode->isLeaf() && 959 InstPatNode->getOperator()->getName() == "set") { 960 InstPatNode = InstPatNode->getChild(InstPatNode->getNumChildren()-1); 961 } 962 bool IsVariadic = isRoot && II.isVariadic; 963 // FIXME: fix how we deal with physical register operands. 964 bool HasImpInputs = isRoot && Inst.getNumImpOperands() > 0; 965 bool HasImpResults = isRoot && DstRegs.size() > 0; 966 bool NodeHasOptInFlag = isRoot && 967 PatternHasProperty(Pattern, SDNPOptInFlag, CGP); 968 bool NodeHasInFlag = isRoot && 969 PatternHasProperty(Pattern, SDNPInFlag, CGP); 970 bool NodeHasOutFlag = isRoot && 971 PatternHasProperty(Pattern, SDNPOutFlag, CGP); 972 bool NodeHasChain = InstPatNode && 973 PatternHasProperty(InstPatNode, SDNPHasChain, CGP); 974 bool InputHasChain = isRoot && 975 NodeHasProperty(Pattern, SDNPHasChain, CGP); 976 unsigned NumResults = Inst.getNumResults(); 977 unsigned NumDstRegs = HasImpResults ? DstRegs.size() : 0; 978 979 // Record output varargs info. 980 OutputIsVariadic = IsVariadic; 981 982 if (NodeHasOptInFlag) { 983 emitCode("bool HasInFlag = " 984 "(N.getOperand(N.getNumOperands()-1).getValueType() == MVT::Flag);"); 985 } 986 if (IsVariadic) 987 emitCode("SmallVector<SDValue, 8> Ops" + utostr(OpcNo) + ";"); 988 989 // How many results is this pattern expected to produce? 990 unsigned NumPatResults = 0; 991 for (unsigned i = 0, e = Pattern->getExtTypes().size(); i != e; i++) { 992 MVT::SimpleValueType VT = Pattern->getTypeNum(i); 993 if (VT != MVT::isVoid && VT != MVT::Flag) 994 NumPatResults++; 995 } 996 997 if (OrigChains.size() > 0) { 998 // The original input chain is being ignored. If it is not just 999 // pointing to the op that's being folded, we should create a 1000 // TokenFactor with it and the chain of the folded op as the new chain. 1001 // We could potentially be doing multiple levels of folding, in that 1002 // case, the TokenFactor can have more operands. 1003 emitCode("SmallVector<SDValue, 8> InChains;"); 1004 for (unsigned i = 0, e = OrigChains.size(); i < e; ++i) { 1005 emitCode("if (" + OrigChains[i].first + ".getNode() != " + 1006 OrigChains[i].second + ".getNode()) {"); 1007 emitCode(" InChains.push_back(" + OrigChains[i].first + ");"); 1008 emitCode("}"); 1009 } 1010 emitCode("InChains.push_back(" + ChainName + ");"); 1011 emitCode(ChainName + " = CurDAG->getNode(ISD::TokenFactor, " 1012 "N.getDebugLoc(), MVT::Other, " 1013 "&InChains[0], InChains.size());"); 1014 if (GenDebug) { 1015 emitCode("CurDAG->setSubgraphColor(" + ChainName +".getNode(), \"yellow\");"); 1016 emitCode("CurDAG->setSubgraphColor(" + ChainName +".getNode(), \"black\");"); 1017 } 1018 } 1019 1020 // Loop over all of the operands of the instruction pattern, emitting code 1021 // to fill them all in. The node 'N' usually has number children equal to 1022 // the number of input operands of the instruction. However, in cases 1023 // where there are predicate operands for an instruction, we need to fill 1024 // in the 'execute always' values. Match up the node operands to the 1025 // instruction operands to do this. 1026 std::vector<std::string> AllOps; 1027 for (unsigned ChildNo = 0, InstOpNo = NumResults; 1028 InstOpNo != II.OperandList.size(); ++InstOpNo) { 1029 std::vector<std::string> Ops; 1030 1031 // Determine what to emit for this operand. 1032 Record *OperandNode = II.OperandList[InstOpNo].Rec; 1033 if ((OperandNode->isSubClassOf("PredicateOperand") || 1034 OperandNode->isSubClassOf("OptionalDefOperand")) && 1035 !CGP.getDefaultOperand(OperandNode).DefaultOps.empty()) { 1036 // This is a predicate or optional def operand; emit the 1037 // 'default ops' operands. 1038 const DAGDefaultOperand &DefaultOp = 1039 CGP.getDefaultOperand(II.OperandList[InstOpNo].Rec); 1040 for (unsigned i = 0, e = DefaultOp.DefaultOps.size(); i != e; ++i) { 1041 Ops = EmitResultCode(DefaultOp.DefaultOps[i], DstRegs, 1042 InFlagDecled, ResNodeDecled); 1043 AllOps.insert(AllOps.end(), Ops.begin(), Ops.end()); 1044 } 1045 } else { 1046 // Otherwise this is a normal operand or a predicate operand without 1047 // 'execute always'; emit it. 1048 Ops = EmitResultCode(N->getChild(ChildNo), DstRegs, 1049 InFlagDecled, ResNodeDecled); 1050 AllOps.insert(AllOps.end(), Ops.begin(), Ops.end()); 1051 ++ChildNo; 1052 } 1053 } 1054 1055 // Emit all the chain and CopyToReg stuff. 1056 bool ChainEmitted = NodeHasChain; 1057 if (NodeHasInFlag || HasImpInputs) 1058 EmitInFlagSelectCode(Pattern, "N", ChainEmitted, 1059 InFlagDecled, ResNodeDecled, true); 1060 if (NodeHasOptInFlag || NodeHasInFlag || HasImpInputs) { 1061 if (!InFlagDecled) { 1062 emitCode("SDValue InFlag(0, 0);"); 1063 InFlagDecled = true; 1064 } 1065 if (NodeHasOptInFlag) { 1066 emitCode("if (HasInFlag) {"); 1067 emitCode(" InFlag = N.getOperand(N.getNumOperands()-1);"); 1068 emitCode("}"); 1069 } 1070 } 1071 1072 unsigned ResNo = TmpNo++; 1073 1074 unsigned OpsNo = OpcNo; 1075 std::string CodePrefix; 1076 bool ChainAssignmentNeeded = NodeHasChain && !isRoot; 1077 std::deque<std::string> After; 1078 std::string NodeName; 1079 if (!isRoot) { 1080 NodeName = "Tmp" + utostr(ResNo); 1081 CodePrefix = "SDValue " + NodeName + "("; 1082 } else { 1083 NodeName = "ResNode"; 1084 if (!ResNodeDecled) { 1085 CodePrefix = "SDNode *" + NodeName + " = "; 1086 ResNodeDecled = true; 1087 } else 1088 CodePrefix = NodeName + " = "; 1089 } 1090 1091 std::string Code = "Opc" + utostr(OpcNo); 1092 1093 if (!isRoot || (InputHasChain && !NodeHasChain)) 1094 // For call to "getTargetNode()". 1095 Code += ", N.getDebugLoc()"; 1096 1097 emitOpcode(II.Namespace + "::" + II.TheDef->getName()); 1098 1099 // Output order: results, chain, flags 1100 // Result types. 1101 if (NumResults > 0 && N->getTypeNum(0) != MVT::isVoid) { 1102 Code += ", VT" + utostr(VTNo); 1103 emitVT(getEnumName(N->getTypeNum(0))); 1104 } 1105 // Add types for implicit results in physical registers, scheduler will 1106 // care of adding copyfromreg nodes. 1107 for (unsigned i = 0; i < NumDstRegs; i++) { 1108 Record *RR = DstRegs[i]; 1109 if (RR->isSubClassOf("Register")) { 1110 MVT::SimpleValueType RVT = getRegisterValueType(RR, CGT); 1111 Code += ", " + getEnumName(RVT); 1112 } 1113 } 1114 if (NodeHasChain) 1115 Code += ", MVT::Other"; 1116 if (NodeHasOutFlag) 1117 Code += ", MVT::Flag"; 1118 1119 // Inputs. 1120 if (IsVariadic) { 1121 for (unsigned i = 0, e = AllOps.size(); i != e; ++i) 1122 emitCode("Ops" + utostr(OpsNo) + ".push_back(" + AllOps[i] + ");"); 1123 AllOps.clear(); 1124 1125 // Figure out whether any operands at the end of the op list are not 1126 // part of the variable section. 1127 std::string EndAdjust; 1128 if (NodeHasInFlag || HasImpInputs) 1129 EndAdjust = "-1"; // Always has one flag. 1130 else if (NodeHasOptInFlag) 1131 EndAdjust = "-(HasInFlag?1:0)"; // May have a flag. 1132 1133 emitCode("for (unsigned i = NumInputRootOps + " + utostr(NodeHasChain) + 1134 ", e = N.getNumOperands()" + EndAdjust + "; i != e; ++i) {"); 1135 1136 emitCode(" Ops" + utostr(OpsNo) + ".push_back(N.getOperand(i));"); 1137 emitCode("}"); 1138 } 1139 1140 // Generate MemOperandSDNodes nodes for each memory accesses covered by 1141 // this pattern. 1142 if (II.mayLoad | II.mayStore) { 1143 std::vector<std::string>::const_iterator mi, mie; 1144 for (mi = LSI.begin(), mie = LSI.end(); mi != mie; ++mi) { 1145 std::string LSIName = "LSI_" + *mi; 1146 emitCode("SDValue " + LSIName + " = " 1147 "CurDAG->getMemOperand(cast<MemSDNode>(" + 1148 *mi + ")->getMemOperand());"); 1149 if (GenDebug) { 1150 emitCode("CurDAG->setSubgraphColor(" + LSIName +".getNode(), \"yellow\");"); 1151 emitCode("CurDAG->setSubgraphColor(" + LSIName +".getNode(), \"black\");"); 1152 } 1153 if (IsVariadic) 1154 emitCode("Ops" + utostr(OpsNo) + ".push_back(" + LSIName + ");"); 1155 else 1156 AllOps.push_back(LSIName); 1157 } 1158 } 1159 1160 if (NodeHasChain) { 1161 if (IsVariadic) 1162 emitCode("Ops" + utostr(OpsNo) + ".push_back(" + ChainName + ");"); 1163 else 1164 AllOps.push_back(ChainName); 1165 } 1166 1167 if (IsVariadic) { 1168 if (NodeHasInFlag || HasImpInputs) 1169 emitCode("Ops" + utostr(OpsNo) + ".push_back(InFlag);"); 1170 else if (NodeHasOptInFlag) { 1171 emitCode("if (HasInFlag)"); 1172 emitCode(" Ops" + utostr(OpsNo) + ".push_back(InFlag);"); 1173 } 1174 Code += ", &Ops" + utostr(OpsNo) + "[0], Ops" + utostr(OpsNo) + 1175 ".size()"; 1176 } else if (NodeHasInFlag || NodeHasOptInFlag || HasImpInputs) 1177 AllOps.push_back("InFlag"); 1178 1179 unsigned NumOps = AllOps.size(); 1180 if (NumOps) { 1181 if (!NodeHasOptInFlag && NumOps < 4) { 1182 for (unsigned i = 0; i != NumOps; ++i) 1183 Code += ", " + AllOps[i]; 1184 } else { 1185 std::string OpsCode = "SDValue Ops" + utostr(OpsNo) + "[] = { "; 1186 for (unsigned i = 0; i != NumOps; ++i) { 1187 OpsCode += AllOps[i]; 1188 if (i != NumOps-1) 1189 OpsCode += ", "; 1190 } 1191 emitCode(OpsCode + " };"); 1192 Code += ", Ops" + utostr(OpsNo) + ", "; 1193 if (NodeHasOptInFlag) { 1194 Code += "HasInFlag ? "; 1195 Code += utostr(NumOps) + " : " + utostr(NumOps-1); 1196 } else 1197 Code += utostr(NumOps); 1198 } 1199 } 1200 1201 if (!isRoot) 1202 Code += "), 0"; 1203 1204 std::vector<std::string> ReplaceFroms; 1205 std::vector<std::string> ReplaceTos; 1206 if (!isRoot) { 1207 NodeOps.push_back("Tmp" + utostr(ResNo)); 1208 } else { 1209 1210 if (NodeHasOutFlag) { 1211 if (!InFlagDecled) { 1212 After.push_back("SDValue InFlag(ResNode, " + 1213 utostr(NumResults+NumDstRegs+(unsigned)NodeHasChain) + 1214 ");"); 1215 InFlagDecled = true; 1216 } else 1217 After.push_back("InFlag = SDValue(ResNode, " + 1218 utostr(NumResults+NumDstRegs+(unsigned)NodeHasChain) + 1219 ");"); 1220 } 1221 1222 for (unsigned j = 0, e = FoldedChains.size(); j < e; j++) { 1223 ReplaceFroms.push_back("SDValue(" + 1224 FoldedChains[j].first + ".getNode(), " + 1225 utostr(FoldedChains[j].second) + 1226 ")"); 1227 ReplaceTos.push_back("SDValue(ResNode, " + 1228 utostr(NumResults+NumDstRegs) + ")"); 1229 } 1230 1231 if (NodeHasOutFlag) { 1232 if (FoldedFlag.first != "") { 1233 ReplaceFroms.push_back("SDValue(" + FoldedFlag.first + ".getNode(), " + 1234 utostr(FoldedFlag.second) + ")"); 1235 ReplaceTos.push_back("InFlag"); 1236 } else { 1237 assert(NodeHasProperty(Pattern, SDNPOutFlag, CGP)); 1238 ReplaceFroms.push_back("SDValue(N.getNode(), " + 1239 utostr(NumPatResults + (unsigned)InputHasChain) 1240 + ")"); 1241 ReplaceTos.push_back("InFlag"); 1242 } 1243 } 1244 1245 if (!ReplaceFroms.empty() && InputHasChain) { 1246 ReplaceFroms.push_back("SDValue(N.getNode(), " + 1247 utostr(NumPatResults) + ")"); 1248 ReplaceTos.push_back("SDValue(" + ChainName + ".getNode(), " + 1249 ChainName + ".getResNo()" + ")"); 1250 ChainAssignmentNeeded |= NodeHasChain; 1251 } 1252 1253 // User does not expect the instruction would produce a chain! 1254 if ((!InputHasChain && NodeHasChain) && NodeHasOutFlag) { 1255 ; 1256 } else if (InputHasChain && !NodeHasChain) { 1257 // One of the inner node produces a chain. 1258 if (NodeHasOutFlag) { 1259 ReplaceFroms.push_back("SDValue(N.getNode(), " + 1260 utostr(NumPatResults+1) + 1261 ")"); 1262 ReplaceTos.push_back("SDValue(ResNode, N.getResNo()-1)"); 1263 } 1264 ReplaceFroms.push_back("SDValue(N.getNode(), " + 1265 utostr(NumPatResults) + ")"); 1266 ReplaceTos.push_back(ChainName); 1267 } 1268 } 1269 1270 if (ChainAssignmentNeeded) { 1271 // Remember which op produces the chain. 1272 std::string ChainAssign; 1273 if (!isRoot) 1274 ChainAssign = ChainName + " = SDValue(" + NodeName + 1275 ".getNode(), " + utostr(NumResults+NumDstRegs) + ");"; 1276 else 1277 ChainAssign = ChainName + " = SDValue(" + NodeName + 1278 ", " + utostr(NumResults+NumDstRegs) + ");"; 1279 1280 After.push_front(ChainAssign); 1281 } 1282 1283 if (ReplaceFroms.size() == 1) { 1284 After.push_back("ReplaceUses(" + ReplaceFroms[0] + ", " + 1285 ReplaceTos[0] + ");"); 1286 } else if (!ReplaceFroms.empty()) { 1287 After.push_back("const SDValue Froms[] = {"); 1288 for (unsigned i = 0, e = ReplaceFroms.size(); i != e; ++i) 1289 After.push_back(" " + ReplaceFroms[i] + (i + 1 != e ? "," : "")); 1290 After.push_back("};"); 1291 After.push_back("const SDValue Tos[] = {"); 1292 for (unsigned i = 0, e = ReplaceFroms.size(); i != e; ++i) 1293 After.push_back(" " + ReplaceTos[i] + (i + 1 != e ? "," : "")); 1294 After.push_back("};"); 1295 After.push_back("ReplaceUses(Froms, Tos, " + 1296 itostr(ReplaceFroms.size()) + ");"); 1297 } 1298 1299 // We prefer to use SelectNodeTo since it avoids allocation when 1300 // possible and it avoids CSE map recalculation for the node's 1301 // users, however it's tricky to use in a non-root context. 1302 // 1303 // We also don't use if the pattern replacement is being used to 1304 // jettison a chain result, since morphing the node in place 1305 // would leave users of the chain dangling. 1306 // 1307 if (!isRoot || (InputHasChain && !NodeHasChain)) { 1308 Code = "CurDAG->getTargetNode(" + Code; 1309 } else { 1310 Code = "CurDAG->SelectNodeTo(N.getNode(), " + Code; 1311 } 1312 if (isRoot) { 1313 if (After.empty()) 1314 CodePrefix = "return "; 1315 else 1316 After.push_back("return ResNode;"); 1317 } 1318 1319 emitCode(CodePrefix + Code + ");"); 1320 1321 if (GenDebug) { 1322 if (!isRoot) { 1323 emitCode("CurDAG->setSubgraphColor(" + NodeName +".getNode(), \"yellow\");"); 1324 emitCode("CurDAG->setSubgraphColor(" + NodeName +".getNode(), \"black\");"); 1325 } 1326 else { 1327 emitCode("CurDAG->setSubgraphColor(" + NodeName +", \"yellow\");"); 1328 emitCode("CurDAG->setSubgraphColor(" + NodeName +", \"black\");"); 1329 } 1330 } 1331 1332 for (unsigned i = 0, e = After.size(); i != e; ++i) 1333 emitCode(After[i]); 1334 1335 return NodeOps; 1336 } 1337 if (Op->isSubClassOf("SDNodeXForm")) { 1338 assert(N->getNumChildren() == 1 && "node xform should have one child!"); 1339 // PatLeaf node - the operand may or may not be a leaf node. But it should 1340 // behave like one. 1341 std::vector<std::string> Ops = 1342 EmitResultCode(N->getChild(0), DstRegs, InFlagDecled, 1343 ResNodeDecled, true); 1344 unsigned ResNo = TmpNo++; 1345 emitCode("SDValue Tmp" + utostr(ResNo) + " = Transform_" + Op->getName() 1346 + "(" + Ops.back() + ".getNode());"); 1347 NodeOps.push_back("Tmp" + utostr(ResNo)); 1348 if (isRoot) 1349 emitCode("return Tmp" + utostr(ResNo) + ".getNode();"); 1350 return NodeOps; 1351 } 1352 1353 N->dump(); 1354 errs() << "\n"; 1355 throw std::string("Unknown node in result pattern!"); 1356 } 1357 1358 /// InsertOneTypeCheck - Insert a type-check for an unresolved type in 'Pat' 1359 /// and add it to the tree. 'Pat' and 'Other' are isomorphic trees except that 1360 /// 'Pat' may be missing types. If we find an unresolved type to add a check 1361 /// for, this returns true otherwise false if Pat has all types. 1362 bool InsertOneTypeCheck(TreePatternNode *Pat, TreePatternNode *Other, 1363 const std::string &Prefix, bool isRoot = false) { 1364 // Did we find one? 1365 if (Pat->getExtTypes() != Other->getExtTypes()) { 1366 // Move a type over from 'other' to 'pat'. 1367 Pat->setTypes(Other->getExtTypes()); 1368 // The top level node type is checked outside of the select function. 1369 if (!isRoot) 1370 emitCheck(Prefix + ".getNode()->getValueType(0) == " + 1371 getName(Pat->getTypeNum(0))); 1372 return true; 1373 } 1374 1375 unsigned OpNo = 1376 (unsigned) NodeHasProperty(Pat, SDNPHasChain, CGP); 1377 for (unsigned i = 0, e = Pat->getNumChildren(); i != e; ++i, ++OpNo) 1378 if (InsertOneTypeCheck(Pat->getChild(i), Other->getChild(i), 1379 Prefix + utostr(OpNo))) 1380 return true; 1381 return false; 1382 } 1383 1384 private: 1385 /// EmitInFlagSelectCode - Emit the flag operands for the DAG that is 1386 /// being built. 1387 void EmitInFlagSelectCode(TreePatternNode *N, const std::string &RootName, 1388 bool &ChainEmitted, bool &InFlagDecled, 1389 bool &ResNodeDecled, bool isRoot = false) { 1390 const CodeGenTarget &T = CGP.getTargetInfo(); 1391 unsigned OpNo = 1392 (unsigned) NodeHasProperty(N, SDNPHasChain, CGP); 1393 bool HasInFlag = NodeHasProperty(N, SDNPInFlag, CGP); 1394 for (unsigned i = 0, e = N->getNumChildren(); i != e; ++i, ++OpNo) { 1395 TreePatternNode *Child = N->getChild(i); 1396 if (!Child->isLeaf()) { 1397 EmitInFlagSelectCode(Child, RootName + utostr(OpNo), ChainEmitted, 1398 InFlagDecled, ResNodeDecled); 1399 } else { 1400 if (DefInit *DI = dynamic_cast<DefInit*>(Child->getLeafValue())) { 1401 if (!Child->getName().empty()) { 1402 std::string Name = RootName + utostr(OpNo); 1403 if (Duplicates.find(Name) != Duplicates.end()) 1404 // A duplicate! Do not emit a copy for this node. 1405 continue; 1406 } 1407 1408 Record *RR = DI->getDef(); 1409 if (RR->isSubClassOf("Register")) { 1410 MVT::SimpleValueType RVT = getRegisterValueType(RR, T); 1411 if (RVT == MVT::Flag) { 1412 if (!InFlagDecled) { 1413 emitCode("SDValue InFlag = " + RootName + utostr(OpNo) + ";"); 1414 InFlagDecled = true; 1415 } else 1416 emitCode("InFlag = " + RootName + utostr(OpNo) + ";"); 1417 } else { 1418 if (!ChainEmitted) { 1419 emitCode("SDValue Chain = CurDAG->getEntryNode();"); 1420 ChainName = "Chain"; 1421 ChainEmitted = true; 1422 } 1423 if (!InFlagDecled) { 1424 emitCode("SDValue InFlag(0, 0);"); 1425 InFlagDecled = true; 1426 } 1427 std::string Decl = (!ResNodeDecled) ? "SDNode *" : ""; 1428 emitCode(Decl + "ResNode = CurDAG->getCopyToReg(" + ChainName + 1429 ", " + RootName + ".getDebugLoc()" + 1430 ", " + getQualifiedName(RR) + 1431 ", " + RootName + utostr(OpNo) + ", InFlag).getNode();"); 1432 ResNodeDecled = true; 1433 emitCode(ChainName + " = SDValue(ResNode, 0);"); 1434 emitCode("InFlag = SDValue(ResNode, 1);"); 1435 } 1436 } 1437 } 1438 } 1439 } 1440 1441 if (HasInFlag) { 1442 if (!InFlagDecled) { 1443 emitCode("SDValue InFlag = " + RootName + 1444 ".getOperand(" + utostr(OpNo) + ");"); 1445 InFlagDecled = true; 1446 } else 1447 emitCode("InFlag = " + RootName + 1448 ".getOperand(" + utostr(OpNo) + ");"); 1449 } 1450 } 1451 }; 1452 1453 /// EmitCodeForPattern - Given a pattern to match, emit code to the specified 1454 /// stream to match the pattern, and generate the code for the match if it 1455 /// succeeds. Returns true if the pattern is not guaranteed to match. 1456 void DAGISelEmitter::GenerateCodeForPattern(const PatternToMatch &Pattern, 1457 std::vector<std::pair<unsigned, std::string> > &GeneratedCode, 1458 std::set<std::string> &GeneratedDecl, 1459 std::vector<std::string> &TargetOpcodes, 1460 std::vector<std::string> &TargetVTs, 1461 bool &OutputIsVariadic, 1462 unsigned &NumInputRootOps) { 1463 OutputIsVariadic = false; 1464 NumInputRootOps = 0; 1465 1466 PatternCodeEmitter Emitter(CGP, Pattern.getPredicateCheck(), 1467 Pattern.getSrcPattern(), Pattern.getDstPattern(), 1468 GeneratedCode, GeneratedDecl, 1469 TargetOpcodes, TargetVTs, 1470 OutputIsVariadic, NumInputRootOps); 1471 1472 // Emit the matcher, capturing named arguments in VariableMap. 1473 bool FoundChain = false; 1474 Emitter.EmitMatchCode(Pattern.getSrcPattern(), NULL, "N", "", FoundChain); 1475 1476 // TP - Get *SOME* tree pattern, we don't care which. 1477 TreePattern &TP = *CGP.pf_begin()->second; 1478 1479 // At this point, we know that we structurally match the pattern, but the 1480 // types of the nodes may not match. Figure out the fewest number of type 1481 // comparisons we need to emit. For example, if there is only one integer 1482 // type supported by a target, there should be no type comparisons at all for 1483 // integer patterns! 1484 // 1485 // To figure out the fewest number of type checks needed, clone the pattern, 1486 // remove the types, then perform type inference on the pattern as a whole. 1487 // If there are unresolved types, emit an explicit check for those types, 1488 // apply the type to the tree, then rerun type inference. Iterate until all 1489 // types are resolved. 1490 // 1491 TreePatternNode *Pat = Pattern.getSrcPattern()->clone(); 1492 RemoveAllTypes(Pat); 1493 1494 do { 1495 // Resolve/propagate as many types as possible. 1496 try { 1497 bool MadeChange = true; 1498 while (MadeChange) 1499 MadeChange = Pat->ApplyTypeConstraints(TP, 1500 true/*Ignore reg constraints*/); 1501 } catch (...) { 1502 assert(0 && "Error: could not find consistent types for something we" 1503 " already decided was ok!"); 1504 abort(); 1505 } 1506 1507 // Insert a check for an unresolved type and add it to the tree. If we find 1508 // an unresolved type to add a check for, this returns true and we iterate, 1509 // otherwise we are done. 1510 } while (Emitter.InsertOneTypeCheck(Pat, Pattern.getSrcPattern(), "N", true)); 1511 1512 Emitter.EmitResultCode(Pattern.getDstPattern(), Pattern.getDstRegs(), 1513 false, false, false, true); 1514 delete Pat; 1515 } 1516 1517 /// EraseCodeLine - Erase one code line from all of the patterns. If removing 1518 /// a line causes any of them to be empty, remove them and return true when 1519 /// done. 1520 static bool EraseCodeLine(std::vector<std::pair<const PatternToMatch*, 1521 std::vector<std::pair<unsigned, std::string> > > > 1522 &Patterns) { 1523 bool ErasedPatterns = false; 1524 for (unsigned i = 0, e = Patterns.size(); i != e; ++i) { 1525 Patterns[i].second.pop_back(); 1526 if (Patterns[i].second.empty()) { 1527 Patterns.erase(Patterns.begin()+i); 1528 --i; --e; 1529 ErasedPatterns = true; 1530 } 1531 } 1532 return ErasedPatterns; 1533 } 1534 1535 /// EmitPatterns - Emit code for at least one pattern, but try to group common 1536 /// code together between the patterns. 1537 void DAGISelEmitter::EmitPatterns(std::vector<std::pair<const PatternToMatch*, 1538 std::vector<std::pair<unsigned, std::string> > > > 1539 &Patterns, unsigned Indent, 1540 raw_ostream &OS) { 1541 typedef std::pair<unsigned, std::string> CodeLine; 1542 typedef std::vector<CodeLine> CodeList; 1543 typedef std::vector<std::pair<const PatternToMatch*, CodeList> > PatternList; 1544 1545 if (Patterns.empty()) return; 1546 1547 // Figure out how many patterns share the next code line. Explicitly copy 1548 // FirstCodeLine so that we don't invalidate a reference when changing 1549 // Patterns. 1550 const CodeLine FirstCodeLine = Patterns.back().second.back(); 1551 unsigned LastMatch = Patterns.size()-1; 1552 while (LastMatch != 0 && Patterns[LastMatch-1].second.back() == FirstCodeLine) 1553 --LastMatch; 1554 1555 // If not all patterns share this line, split the list into two pieces. The 1556 // first chunk will use this line, the second chunk won't. 1557 if (LastMatch != 0) { 1558 PatternList Shared(Patterns.begin()+LastMatch, Patterns.end()); 1559 PatternList Other(Patterns.begin(), Patterns.begin()+LastMatch); 1560 1561 // FIXME: Emit braces? 1562 if (Shared.size() == 1) { 1563 const PatternToMatch &Pattern = *Shared.back().first; 1564 OS << "\n" << std::string(Indent, ' ') << "// Pattern: "; 1565 Pattern.getSrcPattern()->print(OS); 1566 OS << "\n" << std::string(Indent, ' ') << "// Emits: "; 1567 Pattern.getDstPattern()->print(OS); 1568 OS << "\n"; 1569 unsigned AddedComplexity = Pattern.getAddedComplexity(); 1570 OS << std::string(Indent, ' ') << "// Pattern complexity = " 1571 << getPatternSize(Pattern.getSrcPattern(), CGP) + AddedComplexity 1572 << " cost = " 1573 << getResultPatternCost(Pattern.getDstPattern(), CGP) 1574 << " size = " 1575 << getResultPatternSize(Pattern.getDstPattern(), CGP) << "\n"; 1576 } 1577 if (FirstCodeLine.first != 1) { 1578 OS << std::string(Indent, ' ') << "{\n"; 1579 Indent += 2; 1580 } 1581 EmitPatterns(Shared, Indent, OS); 1582 if (FirstCodeLine.first != 1) { 1583 Indent -= 2; 1584 OS << std::string(Indent, ' ') << "}\n"; 1585 } 1586 1587 if (Other.size() == 1) { 1588 const PatternToMatch &Pattern = *Other.back().first; 1589 OS << "\n" << std::string(Indent, ' ') << "// Pattern: "; 1590 Pattern.getSrcPattern()->print(OS); 1591 OS << "\n" << std::string(Indent, ' ') << "// Emits: "; 1592 Pattern.getDstPattern()->print(OS); 1593 OS << "\n"; 1594 unsigned AddedComplexity = Pattern.getAddedComplexity(); 1595 OS << std::string(Indent, ' ') << "// Pattern complexity = " 1596 << getPatternSize(Pattern.getSrcPattern(), CGP) + AddedComplexity 1597 << " cost = " 1598 << getResultPatternCost(Pattern.getDstPattern(), CGP) 1599 << " size = " 1600 << getResultPatternSize(Pattern.getDstPattern(), CGP) << "\n"; 1601 } 1602 EmitPatterns(Other, Indent, OS); 1603 return; 1604 } 1605 1606 // Remove this code from all of the patterns that share it. 1607 bool ErasedPatterns = EraseCodeLine(Patterns); 1608 1609 bool isPredicate = FirstCodeLine.first == 1; 1610 1611 // Otherwise, every pattern in the list has this line. Emit it. 1612 if (!isPredicate) { 1613 // Normal code. 1614 OS << std::string(Indent, ' ') << FirstCodeLine.second << "\n"; 1615 } else { 1616 OS << std::string(Indent, ' ') << "if (" << FirstCodeLine.second; 1617 1618 // If the next code line is another predicate, and if all of the pattern 1619 // in this group share the same next line, emit it inline now. Do this 1620 // until we run out of common predicates. 1621 while (!ErasedPatterns && Patterns.back().second.back().first == 1) { 1622 // Check that all of the patterns in Patterns end with the same predicate. 1623 bool AllEndWithSamePredicate = true; 1624 for (unsigned i = 0, e = Patterns.size(); i != e; ++i) 1625 if (Patterns[i].second.back() != Patterns.back().second.back()) { 1626 AllEndWithSamePredicate = false; 1627 break; 1628 } 1629 // If all of the predicates aren't the same, we can't share them. 1630 if (!AllEndWithSamePredicate) break; 1631 1632 // Otherwise we can. Emit it shared now. 1633 OS << " &&\n" << std::string(Indent+4, ' ') 1634 << Patterns.back().second.back().second; 1635 ErasedPatterns = EraseCodeLine(Patterns); 1636 } 1637 1638 OS << ") {\n"; 1639 Indent += 2; 1640 } 1641 1642 EmitPatterns(Patterns, Indent, OS); 1643 1644 if (isPredicate) 1645 OS << std::string(Indent-2, ' ') << "}\n"; 1646 } 1647 1648 static std::string getLegalCName(std::string OpName) { 1649 std::string::size_type pos = OpName.find("::"); 1650 if (pos != std::string::npos) 1651 OpName.replace(pos, 2, "_"); 1652 return OpName; 1653 } 1654 1655 void DAGISelEmitter::EmitInstructionSelector(raw_ostream &OS) { 1656 const CodeGenTarget &Target = CGP.getTargetInfo(); 1657 1658 // Get the namespace to insert instructions into. 1659 std::string InstNS = Target.getInstNamespace(); 1660 if (!InstNS.empty()) InstNS += "::"; 1661 1662 // Group the patterns by their top-level opcodes. 1663 std::map<std::string, std::vector<const PatternToMatch*> > PatternsByOpcode; 1664 // All unique target node emission functions. 1665 std::map<std::string, unsigned> EmitFunctions; 1666 for (CodeGenDAGPatterns::ptm_iterator I = CGP.ptm_begin(), 1667 E = CGP.ptm_end(); I != E; ++I) { 1668 const PatternToMatch &Pattern = *I; 1669 1670 TreePatternNode *Node = Pattern.getSrcPattern(); 1671 if (!Node->isLeaf()) { 1672 PatternsByOpcode[getOpcodeName(Node->getOperator(), CGP)]. 1673 push_back(&Pattern); 1674 } else { 1675 const ComplexPattern *CP; 1676 if (dynamic_cast<IntInit*>(Node->getLeafValue())) { 1677 PatternsByOpcode[getOpcodeName(CGP.getSDNodeNamed("imm"), CGP)]. 1678 push_back(&Pattern); 1679 } else if ((CP = NodeGetComplexPattern(Node, CGP))) { 1680 std::vector<Record*> OpNodes = CP->getRootNodes(); 1681 for (unsigned j = 0, e = OpNodes.size(); j != e; j++) { 1682 PatternsByOpcode[getOpcodeName(OpNodes[j], CGP)] 1683 .insert(PatternsByOpcode[getOpcodeName(OpNodes[j], CGP)].begin(), 1684 &Pattern); 1685 } 1686 } else { 1687 errs() << "Unrecognized opcode '"; 1688 Node->dump(); 1689 errs() << "' on tree pattern '"; 1690 errs() << Pattern.getDstPattern()->getOperator()->getName() << "'!\n"; 1691 exit(1); 1692 } 1693 } 1694 } 1695 1696 // For each opcode, there might be multiple select functions, one per 1697 // ValueType of the node (or its first operand if it doesn't produce a 1698 // non-chain result. 1699 std::map<std::string, std::vector<std::string> > OpcodeVTMap; 1700 1701 // Emit one Select_* method for each top-level opcode. We do this instead of 1702 // emitting one giant switch statement to support compilers where this will 1703 // result in the recursive functions taking less stack space. 1704 for (std::map<std::string, std::vector<const PatternToMatch*> >::iterator 1705 PBOI = PatternsByOpcode.begin(), E = PatternsByOpcode.end(); 1706 PBOI != E; ++PBOI) { 1707 const std::string &OpName = PBOI->first; 1708 std::vector<const PatternToMatch*> &PatternsOfOp = PBOI->second; 1709 assert(!PatternsOfOp.empty() && "No patterns but map has entry?"); 1710 1711 // Split them into groups by type. 1712 std::map<MVT::SimpleValueType, 1713 std::vector<const PatternToMatch*> > PatternsByType; 1714 for (unsigned i = 0, e = PatternsOfOp.size(); i != e; ++i) { 1715 const PatternToMatch *Pat = PatternsOfOp[i]; 1716 TreePatternNode *SrcPat = Pat->getSrcPattern(); 1717 PatternsByType[SrcPat->getTypeNum(0)].push_back(Pat); 1718 } 1719 1720 for (std::map<MVT::SimpleValueType, 1721 std::vector<const PatternToMatch*> >::iterator 1722 II = PatternsByType.begin(), EE = PatternsByType.end(); II != EE; 1723 ++II) { 1724 MVT::SimpleValueType OpVT = II->first; 1725 std::vector<const PatternToMatch*> &Patterns = II->second; 1726 typedef std::pair<unsigned, std::string> CodeLine; 1727 typedef std::vector<CodeLine> CodeList; 1728 typedef CodeList::iterator CodeListI; 1729 1730 std::vector<std::pair<const PatternToMatch*, CodeList> > CodeForPatterns; 1731 std::vector<std::vector<std::string> > PatternOpcodes; 1732 std::vector<std::vector<std::string> > PatternVTs; 1733 std::vector<std::set<std::string> > PatternDecls; 1734 std::vector<bool> OutputIsVariadicFlags; 1735 std::vector<unsigned> NumInputRootOpsCounts; 1736 for (unsigned i = 0, e = Patterns.size(); i != e; ++i) { 1737 CodeList GeneratedCode; 1738 std::set<std::string> GeneratedDecl; 1739 std::vector<std::string> TargetOpcodes; 1740 std::vector<std::string> TargetVTs; 1741 bool OutputIsVariadic; 1742 unsigned NumInputRootOps; 1743 GenerateCodeForPattern(*Patterns[i], GeneratedCode, GeneratedDecl, 1744 TargetOpcodes, TargetVTs, 1745 OutputIsVariadic, NumInputRootOps); 1746 CodeForPatterns.push_back(std::make_pair(Patterns[i], GeneratedCode)); 1747 PatternDecls.push_back(GeneratedDecl); 1748 PatternOpcodes.push_back(TargetOpcodes); 1749 PatternVTs.push_back(TargetVTs); 1750 OutputIsVariadicFlags.push_back(OutputIsVariadic); 1751 NumInputRootOpsCounts.push_back(NumInputRootOps); 1752 } 1753 1754 // Factor target node emission code (emitted by EmitResultCode) into 1755 // separate functions. Uniquing and share them among all instruction 1756 // selection routines. 1757 for (unsigned i = 0, e = CodeForPatterns.size(); i != e; ++i) { 1758 CodeList &GeneratedCode = CodeForPatterns[i].second; 1759 std::vector<std::string> &TargetOpcodes = PatternOpcodes[i]; 1760 std::vector<std::string> &TargetVTs = PatternVTs[i]; 1761 std::set<std::string> Decls = PatternDecls[i]; 1762 bool OutputIsVariadic = OutputIsVariadicFlags[i]; 1763 unsigned NumInputRootOps = NumInputRootOpsCounts[i]; 1764 std::vector<std::string> AddedInits; 1765 int CodeSize = (int)GeneratedCode.size(); 1766 int LastPred = -1; 1767 for (int j = CodeSize-1; j >= 0; --j) { 1768 if (LastPred == -1 && GeneratedCode[j].first == 1) 1769 LastPred = j; 1770 else if (LastPred != -1 && GeneratedCode[j].first == 2) 1771 AddedInits.push_back(GeneratedCode[j].second); 1772 } 1773 1774 std::string CalleeCode = "(const SDValue &N"; 1775 std::string CallerCode = "(N"; 1776 for (unsigned j = 0, e = TargetOpcodes.size(); j != e; ++j) { 1777 CalleeCode += ", unsigned Opc" + utostr(j); 1778 CallerCode += ", " + TargetOpcodes[j]; 1779 } 1780 for (unsigned j = 0, e = TargetVTs.size(); j != e; ++j) { 1781 CalleeCode += ", MVT VT" + utostr(j); 1782 CallerCode += ", " + TargetVTs[j]; 1783 } 1784 for (std::set<std::string>::iterator 1785 I = Decls.begin(), E = Decls.end(); I != E; ++I) { 1786 std::string Name = *I; 1787 CalleeCode += ", SDValue &" + Name; 1788 CallerCode += ", " + Name; 1789 } 1790 1791 if (OutputIsVariadic) { 1792 CalleeCode += ", unsigned NumInputRootOps"; 1793 CallerCode += ", " + utostr(NumInputRootOps); 1794 } 1795 1796 CallerCode += ");"; 1797 CalleeCode += ") "; 1798 // Prevent emission routines from being inlined to reduce selection 1799 // routines stack frame sizes. 1800 CalleeCode += "DISABLE_INLINE "; 1801 CalleeCode += "{\n"; 1802 1803 for (std::vector<std::string>::const_reverse_iterator 1804 I = AddedInits.rbegin(), E = AddedInits.rend(); I != E; ++I) 1805 CalleeCode += " " + *I + "\n"; 1806 1807 for (int j = LastPred+1; j < CodeSize; ++j) 1808 CalleeCode += " " + GeneratedCode[j].second + "\n"; 1809 for (int j = LastPred+1; j < CodeSize; ++j) 1810 GeneratedCode.pop_back(); 1811 CalleeCode += "}\n"; 1812 1813 // Uniquing the emission routines. 1814 unsigned EmitFuncNum; 1815 std::map<std::string, unsigned>::iterator EFI = 1816 EmitFunctions.find(CalleeCode); 1817 if (EFI != EmitFunctions.end()) { 1818 EmitFuncNum = EFI->second; 1819 } else { 1820 EmitFuncNum = EmitFunctions.size(); 1821 EmitFunctions.insert(std::make_pair(CalleeCode, EmitFuncNum)); 1822 OS << "SDNode *Emit_" << utostr(EmitFuncNum) << CalleeCode; 1823 } 1824 1825 // Replace the emission code within selection routines with calls to the 1826 // emission functions. 1827 if (GenDebug) { 1828 GeneratedCode.push_back(std::make_pair(0, "CurDAG->setSubgraphColor(N.getNode(), \"red\");")); 1829 } 1830 CallerCode = "SDNode *Result = Emit_" + utostr(EmitFuncNum) + CallerCode; 1831 GeneratedCode.push_back(std::make_pair(3, CallerCode)); 1832 if (GenDebug) { 1833 GeneratedCode.push_back(std::make_pair(0, "if(Result) {")); 1834 GeneratedCode.push_back(std::make_pair(0, " CurDAG->setSubgraphColor(Result, \"yellow\");")); 1835 GeneratedCode.push_back(std::make_pair(0, " CurDAG->setSubgraphColor(Result, \"black\");")); 1836 GeneratedCode.push_back(std::make_pair(0, "}")); 1837 //GeneratedCode.push_back(std::make_pair(0, "CurDAG->setSubgraphColor(N.getNode(), \"black\");")); 1838 } 1839 GeneratedCode.push_back(std::make_pair(0, "return Result;")); 1840 } 1841 1842 // Print function. 1843 std::string OpVTStr; 1844 if (OpVT == MVT::iPTR) { 1845 OpVTStr = "_iPTR"; 1846 } else if (OpVT == MVT::iPTRAny) { 1847 OpVTStr = "_iPTRAny"; 1848 } else if (OpVT == MVT::isVoid) { 1849 // Nodes with a void result actually have a first result type of either 1850 // Other (a chain) or Flag. Since there is no one-to-one mapping from 1851 // void to this case, we handle it specially here. 1852 } else { 1853 OpVTStr = "_" + getEnumName(OpVT).substr(5); // Skip 'MVT::' 1854 } 1855 std::map<std::string, std::vector<std::string> >::iterator OpVTI = 1856 OpcodeVTMap.find(OpName); 1857 if (OpVTI == OpcodeVTMap.end()) { 1858 std::vector<std::string> VTSet; 1859 VTSet.push_back(OpVTStr); 1860 OpcodeVTMap.insert(std::make_pair(OpName, VTSet)); 1861 } else 1862 OpVTI->second.push_back(OpVTStr); 1863 1864 // We want to emit all of the matching code now. However, we want to emit 1865 // the matches in order of minimal cost. Sort the patterns so the least 1866 // cost one is at the start. 1867 std::stable_sort(CodeForPatterns.begin(), CodeForPatterns.end(), 1868 PatternSortingPredicate(CGP)); 1869 1870 // Scan the code to see if all of the patterns are reachable and if it is 1871 // possible that the last one might not match. 1872 bool mightNotMatch = true; 1873 for (unsigned i = 0, e = CodeForPatterns.size(); i != e; ++i) { 1874 CodeList &GeneratedCode = CodeForPatterns[i].second; 1875 mightNotMatch = false; 1876 1877 for (unsigned j = 0, e = GeneratedCode.size(); j != e; ++j) { 1878 if (GeneratedCode[j].first == 1) { // predicate. 1879 mightNotMatch = true; 1880 break; 1881 } 1882 } 1883 1884 // If this pattern definitely matches, and if it isn't the last one, the 1885 // patterns after it CANNOT ever match. Error out. 1886 if (mightNotMatch == false && i != CodeForPatterns.size()-1) { 1887 errs() << "Pattern '"; 1888 CodeForPatterns[i].first->getSrcPattern()->print(errs()); 1889 errs() << "' is impossible to select!\n"; 1890 exit(1); 1891 } 1892 } 1893 1894 // Loop through and reverse all of the CodeList vectors, as we will be 1895 // accessing them from their logical front, but accessing the end of a 1896 // vector is more efficient. 1897 for (unsigned i = 0, e = CodeForPatterns.size(); i != e; ++i) { 1898 CodeList &GeneratedCode = CodeForPatterns[i].second; 1899 std::reverse(GeneratedCode.begin(), GeneratedCode.end()); 1900 } 1901 1902 // Next, reverse the list of patterns itself for the same reason. 1903 std::reverse(CodeForPatterns.begin(), CodeForPatterns.end()); 1904 1905 OS << "SDNode *Select_" << getLegalCName(OpName) 1906 << OpVTStr << "(const SDValue &N) {\n"; 1907 1908 // Emit all of the patterns now, grouped together to share code. 1909 EmitPatterns(CodeForPatterns, 2, OS); 1910 1911 // If the last pattern has predicates (which could fail) emit code to 1912 // catch the case where nothing handles a pattern. 1913 if (mightNotMatch) { 1914 OS << "\n"; 1915 if (OpName != "ISD::INTRINSIC_W_CHAIN" && 1916 OpName != "ISD::INTRINSIC_WO_CHAIN" && 1917 OpName != "ISD::INTRINSIC_VOID") 1918 OS << " CannotYetSelect(N);\n"; 1919 else 1920 OS << " CannotYetSelectIntrinsic(N);\n"; 1921 1922 OS << " return NULL;\n"; 1923 } 1924 OS << "}\n\n"; 1925 } 1926 } 1927 1928 // Emit boilerplate. 1929 OS << "SDNode *Select_INLINEASM(SDValue N) {\n" 1930 << " std::vector<SDValue> Ops(N.getNode()->op_begin(), N.getNode()->op_end());\n" 1931 << " SelectInlineAsmMemoryOperands(Ops);\n\n" 1932 1933 << " std::vector<MVT> VTs;\n" 1934 << " VTs.push_back(MVT::Other);\n" 1935 << " VTs.push_back(MVT::Flag);\n" 1936 << " SDValue New = CurDAG->getNode(ISD::INLINEASM, N.getDebugLoc(), " 1937 "VTs, &Ops[0], Ops.size());\n" 1938 << " return New.getNode();\n" 1939 << "}\n\n"; 1940 1941 OS << "SDNode *Select_UNDEF(const SDValue &N) {\n" 1942 << " return CurDAG->SelectNodeTo(N.getNode(), TargetInstrInfo::IMPLICIT_DEF,\n" 1943 << " N.getValueType());\n" 1944 << "}\n\n"; 1945 1946 OS << "SDNode *Select_DBG_LABEL(const SDValue &N) {\n" 1947 << " SDValue Chain = N.getOperand(0);\n" 1948 << " unsigned C = cast<LabelSDNode>(N)->getLabelID();\n" 1949 << " SDValue Tmp = CurDAG->getTargetConstant(C, MVT::i32);\n" 1950 << " return CurDAG->SelectNodeTo(N.getNode(), TargetInstrInfo::DBG_LABEL,\n" 1951 << " MVT::Other, Tmp, Chain);\n" 1952 << "}\n\n"; 1953 1954 OS << "SDNode *Select_EH_LABEL(const SDValue &N) {\n" 1955 << " SDValue Chain = N.getOperand(0);\n" 1956 << " unsigned C = cast<LabelSDNode>(N)->getLabelID();\n" 1957 << " SDValue Tmp = CurDAG->getTargetConstant(C, MVT::i32);\n" 1958 << " return CurDAG->SelectNodeTo(N.getNode(), TargetInstrInfo::EH_LABEL,\n" 1959 << " MVT::Other, Tmp, Chain);\n" 1960 << "}\n\n"; 1961 1962 OS << "SDNode *Select_DECLARE(const SDValue &N) {\n" 1963 << " SDValue Chain = N.getOperand(0);\n" 1964 << " SDValue N1 = N.getOperand(1);\n" 1965 << " SDValue N2 = N.getOperand(2);\n" 1966 << " if (!isa<FrameIndexSDNode>(N1) || !isa<GlobalAddressSDNode>(N2)) {\n" 1967 << " CannotYetSelect(N);\n" 1968 << " }\n" 1969 << " int FI = cast<FrameIndexSDNode>(N1)->getIndex();\n" 1970 << " GlobalValue *GV = cast<GlobalAddressSDNode>(N2)->getGlobal();\n" 1971 << " SDValue Tmp1 = " 1972 << "CurDAG->getTargetFrameIndex(FI, TLI.getPointerTy());\n" 1973 << " SDValue Tmp2 = " 1974 << "CurDAG->getTargetGlobalAddress(GV, TLI.getPointerTy());\n" 1975 << " return CurDAG->SelectNodeTo(N.getNode(), TargetInstrInfo::DECLARE,\n" 1976 << " MVT::Other, Tmp1, Tmp2, Chain);\n" 1977 << "}\n\n"; 1978 1979 OS << "// The main instruction selector code.\n" 1980 << "SDNode *SelectCode(SDValue N) {\n" 1981 << " MVT::SimpleValueType NVT = N.getNode()->getValueType(0).getSimpleVT();\n" 1982 << " switch (N.getOpcode()) {\n" 1983 << " default:\n" 1984 << " assert(!N.isMachineOpcode() && \"Node already selected!\");\n" 1985 << " break;\n" 1986 << " case ISD::EntryToken: // These nodes remain the same.\n" 1987 << " case ISD::MEMOPERAND:\n" 1988 << " case ISD::BasicBlock:\n" 1989 << " case ISD::Register:\n" 1990 << " case ISD::HANDLENODE:\n" 1991 << " case ISD::TargetConstant:\n" 1992 << " case ISD::TargetConstantFP:\n" 1993 << " case ISD::TargetConstantPool:\n" 1994 << " case ISD::TargetFrameIndex:\n" 1995 << " case ISD::TargetExternalSymbol:\n" 1996 << " case ISD::TargetJumpTable:\n" 1997 << " case ISD::TargetGlobalTLSAddress:\n" 1998 << " case ISD::TargetGlobalAddress:\n" 1999 << " case ISD::TokenFactor:\n" 2000 << " case ISD::CopyFromReg:\n" 2001 << " case ISD::CopyToReg: {\n" 2002 << " return NULL;\n" 2003 << " }\n" 2004 << " case ISD::AssertSext:\n" 2005 << " case ISD::AssertZext: {\n" 2006 << " ReplaceUses(N, N.getOperand(0));\n" 2007 << " return NULL;\n" 2008 << " }\n" 2009 << " case ISD::INLINEASM: return Select_INLINEASM(N);\n" 2010 << " case ISD::DBG_LABEL: return Select_DBG_LABEL(N);\n" 2011 << " case ISD::EH_LABEL: return Select_EH_LABEL(N);\n" 2012 << " case ISD::DECLARE: return Select_DECLARE(N);\n" 2013 << " case ISD::UNDEF: return Select_UNDEF(N);\n"; 2014 2015 // Loop over all of the case statements, emiting a call to each method we 2016 // emitted above. 2017 for (std::map<std::string, std::vector<const PatternToMatch*> >::iterator 2018 PBOI = PatternsByOpcode.begin(), E = PatternsByOpcode.end(); 2019 PBOI != E; ++PBOI) { 2020 const std::string &OpName = PBOI->first; 2021 // Potentially multiple versions of select for this opcode. One for each 2022 // ValueType of the node (or its first true operand if it doesn't produce a 2023 // result. 2024 std::map<std::string, std::vector<std::string> >::iterator OpVTI = 2025 OpcodeVTMap.find(OpName); 2026 std::vector<std::string> &OpVTs = OpVTI->second; 2027 OS << " case " << OpName << ": {\n"; 2028 // If we have only one variant and it's the default, elide the 2029 // switch. Marginally faster, and makes MSVC happier. 2030 if (OpVTs.size()==1 && OpVTs[0].empty()) { 2031 OS << " return Select_" << getLegalCName(OpName) << "(N);\n"; 2032 OS << " break;\n"; 2033 OS << " }\n"; 2034 continue; 2035 } 2036 // Keep track of whether we see a pattern that has an iPtr result. 2037 bool HasPtrPattern = false; 2038 bool HasDefaultPattern = false; 2039 2040 OS << " switch (NVT) {\n"; 2041 for (unsigned i = 0, e = OpVTs.size(); i < e; ++i) { 2042 std::string &VTStr = OpVTs[i]; 2043 if (VTStr.empty()) { 2044 HasDefaultPattern = true; 2045 continue; 2046 } 2047 2048 // If this is a match on iPTR: don't emit it directly, we need special 2049 // code. 2050 if (VTStr == "_iPTR") { 2051 HasPtrPattern = true; 2052 continue; 2053 } 2054 OS << " case MVT::" << VTStr.substr(1) << ":\n" 2055 << " return Select_" << getLegalCName(OpName) 2056 << VTStr << "(N);\n"; 2057 } 2058 OS << " default:\n"; 2059 2060 // If there is an iPTR result version of this pattern, emit it here. 2061 if (HasPtrPattern) { 2062 OS << " if (TLI.getPointerTy() == NVT)\n"; 2063 OS << " return Select_" << getLegalCName(OpName) <<"_iPTR(N);\n"; 2064 } 2065 if (HasDefaultPattern) { 2066 OS << " return Select_" << getLegalCName(OpName) << "(N);\n"; 2067 } 2068 OS << " break;\n"; 2069 OS << " }\n"; 2070 OS << " break;\n"; 2071 OS << " }\n"; 2072 } 2073 2074 OS << " } // end of big switch.\n\n" 2075 << " if (N.getOpcode() != ISD::INTRINSIC_W_CHAIN &&\n" 2076 << " N.getOpcode() != ISD::INTRINSIC_WO_CHAIN &&\n" 2077 << " N.getOpcode() != ISD::INTRINSIC_VOID) {\n" 2078 << " CannotYetSelect(N);\n" 2079 << " } else {\n" 2080 << " CannotYetSelectIntrinsic(N);\n" 2081 << " }\n" 2082 << " return NULL;\n" 2083 << "}\n\n"; 2084 2085 OS << "void CannotYetSelect(SDValue N) DISABLE_INLINE {\n" 2086 << " std::string msg;\n" 2087 << " raw_string_ostream Msg(msg);\n" 2088 << " Msg << \"Cannot yet select: \";\n" 2089 << " N.getNode()->print(Msg, CurDAG);\n" 2090 << " llvm_report_error(Msg.str());\n" 2091 << "}\n\n"; 2092 2093 OS << "void CannotYetSelectIntrinsic(SDValue N) DISABLE_INLINE {\n" 2094 << " cerr << \"Cannot yet select: \";\n" 2095 << " unsigned iid = cast<ConstantSDNode>(N.getOperand(" 2096 << "N.getOperand(0).getValueType() == MVT::Other))->getZExtValue();\n" 2097 << " llvm_report_error(\"Cannot yet select: intrinsic %\" +\n" 2098 << "Intrinsic::getName((Intrinsic::ID)iid));\n" 2099 << "}\n\n"; 2100 } 2101 2102 void DAGISelEmitter::run(raw_ostream &OS) { 2103 EmitSourceFileHeader("DAG Instruction Selector for the " + 2104 CGP.getTargetInfo().getName() + " target", OS); 2105 2106 OS << "// *** NOTE: This file is #included into the middle of the target\n" 2107 << "// *** instruction selector class. These functions are really " 2108 << "methods.\n\n"; 2109 2110 OS << "// Include standard, target-independent definitions and methods used\n" 2111 << "// by the instruction selector.\n"; 2112 OS << "#include \"llvm/CodeGen/DAGISelHeader.h\"\n\n"; 2113 2114 EmitNodeTransforms(OS); 2115 EmitPredicateFunctions(OS); 2116 2117 DOUT << "\n\nALL PATTERNS TO MATCH:\n\n"; 2118 for (CodeGenDAGPatterns::ptm_iterator I = CGP.ptm_begin(), E = CGP.ptm_end(); 2119 I != E; ++I) { 2120 DOUT << "PATTERN: "; DEBUG(I->getSrcPattern()->dump()); 2121 DOUT << "\nRESULT: "; DEBUG(I->getDstPattern()->dump()); 2122 DOUT << "\n"; 2123 } 2124 2125 // At this point, we have full information about the 'Patterns' we need to 2126 // parse, both implicitly from instructions as well as from explicit pattern 2127 // definitions. Emit the resultant instruction selector. 2128 EmitInstructionSelector(OS); 2129 2130 } 2131