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->isSubClassOf("PointerLikeRegClass")) { 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" + 936 utohexstr((uint64_t) II->getValue()) + 937 "ULL, " + getEnumName(N->getTypeNum(0)) + ");"); 938 NodeOps.push_back("Tmp" + utostr(ResNo)); 939 return NodeOps; 940 } 941 942 #ifndef NDEBUG 943 N->dump(); 944 #endif 945 assert(0 && "Unknown leaf type!"); 946 return NodeOps; 947 } 948 949 Record *Op = N->getOperator(); 950 if (Op->isSubClassOf("Instruction")) { 951 const CodeGenTarget &CGT = CGP.getTargetInfo(); 952 CodeGenInstruction &II = CGT.getInstruction(Op->getName()); 953 const DAGInstruction &Inst = CGP.getInstruction(Op); 954 const TreePattern *InstPat = Inst.getPattern(); 955 // FIXME: Assume actual pattern comes before "implicit". 956 TreePatternNode *InstPatNode = 957 isRoot ? (InstPat ? InstPat->getTree(0) : Pattern) 958 : (InstPat ? InstPat->getTree(0) : NULL); 959 if (InstPatNode && !InstPatNode->isLeaf() && 960 InstPatNode->getOperator()->getName() == "set") { 961 InstPatNode = InstPatNode->getChild(InstPatNode->getNumChildren()-1); 962 } 963 bool IsVariadic = isRoot && II.isVariadic; 964 // FIXME: fix how we deal with physical register operands. 965 bool HasImpInputs = isRoot && Inst.getNumImpOperands() > 0; 966 bool HasImpResults = isRoot && DstRegs.size() > 0; 967 bool NodeHasOptInFlag = isRoot && 968 PatternHasProperty(Pattern, SDNPOptInFlag, CGP); 969 bool NodeHasInFlag = isRoot && 970 PatternHasProperty(Pattern, SDNPInFlag, CGP); 971 bool NodeHasOutFlag = isRoot && 972 PatternHasProperty(Pattern, SDNPOutFlag, CGP); 973 bool NodeHasChain = InstPatNode && 974 PatternHasProperty(InstPatNode, SDNPHasChain, CGP); 975 bool InputHasChain = isRoot && 976 NodeHasProperty(Pattern, SDNPHasChain, CGP); 977 unsigned NumResults = Inst.getNumResults(); 978 unsigned NumDstRegs = HasImpResults ? DstRegs.size() : 0; 979 980 // Record output varargs info. 981 OutputIsVariadic = IsVariadic; 982 983 if (NodeHasOptInFlag) { 984 emitCode("bool HasInFlag = " 985 "(N.getOperand(N.getNumOperands()-1).getValueType() == MVT::Flag);"); 986 } 987 if (IsVariadic) 988 emitCode("SmallVector<SDValue, 8> Ops" + utostr(OpcNo) + ";"); 989 990 // How many results is this pattern expected to produce? 991 unsigned NumPatResults = 0; 992 for (unsigned i = 0, e = Pattern->getExtTypes().size(); i != e; i++) { 993 MVT::SimpleValueType VT = Pattern->getTypeNum(i); 994 if (VT != MVT::isVoid && VT != MVT::Flag) 995 NumPatResults++; 996 } 997 998 if (OrigChains.size() > 0) { 999 // The original input chain is being ignored. If it is not just 1000 // pointing to the op that's being folded, we should create a 1001 // TokenFactor with it and the chain of the folded op as the new chain. 1002 // We could potentially be doing multiple levels of folding, in that 1003 // case, the TokenFactor can have more operands. 1004 emitCode("SmallVector<SDValue, 8> InChains;"); 1005 for (unsigned i = 0, e = OrigChains.size(); i < e; ++i) { 1006 emitCode("if (" + OrigChains[i].first + ".getNode() != " + 1007 OrigChains[i].second + ".getNode()) {"); 1008 emitCode(" InChains.push_back(" + OrigChains[i].first + ");"); 1009 emitCode("}"); 1010 } 1011 emitCode("InChains.push_back(" + ChainName + ");"); 1012 emitCode(ChainName + " = CurDAG->getNode(ISD::TokenFactor, " 1013 "N.getDebugLoc(), MVT::Other, " 1014 "&InChains[0], InChains.size());"); 1015 if (GenDebug) { 1016 emitCode("CurDAG->setSubgraphColor(" + ChainName +".getNode(), \"yellow\");"); 1017 emitCode("CurDAG->setSubgraphColor(" + ChainName +".getNode(), \"black\");"); 1018 } 1019 } 1020 1021 // Loop over all of the operands of the instruction pattern, emitting code 1022 // to fill them all in. The node 'N' usually has number children equal to 1023 // the number of input operands of the instruction. However, in cases 1024 // where there are predicate operands for an instruction, we need to fill 1025 // in the 'execute always' values. Match up the node operands to the 1026 // instruction operands to do this. 1027 std::vector<std::string> AllOps; 1028 for (unsigned ChildNo = 0, InstOpNo = NumResults; 1029 InstOpNo != II.OperandList.size(); ++InstOpNo) { 1030 std::vector<std::string> Ops; 1031 1032 // Determine what to emit for this operand. 1033 Record *OperandNode = II.OperandList[InstOpNo].Rec; 1034 if ((OperandNode->isSubClassOf("PredicateOperand") || 1035 OperandNode->isSubClassOf("OptionalDefOperand")) && 1036 !CGP.getDefaultOperand(OperandNode).DefaultOps.empty()) { 1037 // This is a predicate or optional def operand; emit the 1038 // 'default ops' operands. 1039 const DAGDefaultOperand &DefaultOp = 1040 CGP.getDefaultOperand(II.OperandList[InstOpNo].Rec); 1041 for (unsigned i = 0, e = DefaultOp.DefaultOps.size(); i != e; ++i) { 1042 Ops = EmitResultCode(DefaultOp.DefaultOps[i], DstRegs, 1043 InFlagDecled, ResNodeDecled); 1044 AllOps.insert(AllOps.end(), Ops.begin(), Ops.end()); 1045 } 1046 } else { 1047 // Otherwise this is a normal operand or a predicate operand without 1048 // 'execute always'; emit it. 1049 Ops = EmitResultCode(N->getChild(ChildNo), DstRegs, 1050 InFlagDecled, ResNodeDecled); 1051 AllOps.insert(AllOps.end(), Ops.begin(), Ops.end()); 1052 ++ChildNo; 1053 } 1054 } 1055 1056 // Emit all the chain and CopyToReg stuff. 1057 bool ChainEmitted = NodeHasChain; 1058 if (NodeHasInFlag || HasImpInputs) 1059 EmitInFlagSelectCode(Pattern, "N", ChainEmitted, 1060 InFlagDecled, ResNodeDecled, true); 1061 if (NodeHasOptInFlag || NodeHasInFlag || HasImpInputs) { 1062 if (!InFlagDecled) { 1063 emitCode("SDValue InFlag(0, 0);"); 1064 InFlagDecled = true; 1065 } 1066 if (NodeHasOptInFlag) { 1067 emitCode("if (HasInFlag) {"); 1068 emitCode(" InFlag = N.getOperand(N.getNumOperands()-1);"); 1069 emitCode("}"); 1070 } 1071 } 1072 1073 unsigned ResNo = TmpNo++; 1074 1075 unsigned OpsNo = OpcNo; 1076 std::string CodePrefix; 1077 bool ChainAssignmentNeeded = NodeHasChain && !isRoot; 1078 std::deque<std::string> After; 1079 std::string NodeName; 1080 if (!isRoot) { 1081 NodeName = "Tmp" + utostr(ResNo); 1082 CodePrefix = "SDValue " + NodeName + "("; 1083 } else { 1084 NodeName = "ResNode"; 1085 if (!ResNodeDecled) { 1086 CodePrefix = "SDNode *" + NodeName + " = "; 1087 ResNodeDecled = true; 1088 } else 1089 CodePrefix = NodeName + " = "; 1090 } 1091 1092 std::string Code = "Opc" + utostr(OpcNo); 1093 1094 if (!isRoot || (InputHasChain && !NodeHasChain)) 1095 // For call to "getTargetNode()". 1096 Code += ", N.getDebugLoc()"; 1097 1098 emitOpcode(II.Namespace + "::" + II.TheDef->getName()); 1099 1100 // Output order: results, chain, flags 1101 // Result types. 1102 if (NumResults > 0 && N->getTypeNum(0) != MVT::isVoid) { 1103 Code += ", VT" + utostr(VTNo); 1104 emitVT(getEnumName(N->getTypeNum(0))); 1105 } 1106 // Add types for implicit results in physical registers, scheduler will 1107 // care of adding copyfromreg nodes. 1108 for (unsigned i = 0; i < NumDstRegs; i++) { 1109 Record *RR = DstRegs[i]; 1110 if (RR->isSubClassOf("Register")) { 1111 MVT::SimpleValueType RVT = getRegisterValueType(RR, CGT); 1112 Code += ", " + getEnumName(RVT); 1113 } 1114 } 1115 if (NodeHasChain) 1116 Code += ", MVT::Other"; 1117 if (NodeHasOutFlag) 1118 Code += ", MVT::Flag"; 1119 1120 // Inputs. 1121 if (IsVariadic) { 1122 for (unsigned i = 0, e = AllOps.size(); i != e; ++i) 1123 emitCode("Ops" + utostr(OpsNo) + ".push_back(" + AllOps[i] + ");"); 1124 AllOps.clear(); 1125 1126 // Figure out whether any operands at the end of the op list are not 1127 // part of the variable section. 1128 std::string EndAdjust; 1129 if (NodeHasInFlag || HasImpInputs) 1130 EndAdjust = "-1"; // Always has one flag. 1131 else if (NodeHasOptInFlag) 1132 EndAdjust = "-(HasInFlag?1:0)"; // May have a flag. 1133 1134 emitCode("for (unsigned i = NumInputRootOps + " + utostr(NodeHasChain) + 1135 ", e = N.getNumOperands()" + EndAdjust + "; i != e; ++i) {"); 1136 1137 emitCode(" Ops" + utostr(OpsNo) + ".push_back(N.getOperand(i));"); 1138 emitCode("}"); 1139 } 1140 1141 // Generate MemOperandSDNodes nodes for each memory accesses covered by 1142 // this pattern. 1143 if (II.mayLoad | II.mayStore) { 1144 std::vector<std::string>::const_iterator mi, mie; 1145 for (mi = LSI.begin(), mie = LSI.end(); mi != mie; ++mi) { 1146 std::string LSIName = "LSI_" + *mi; 1147 emitCode("SDValue " + LSIName + " = " 1148 "CurDAG->getMemOperand(cast<MemSDNode>(" + 1149 *mi + ")->getMemOperand());"); 1150 if (GenDebug) { 1151 emitCode("CurDAG->setSubgraphColor(" + LSIName +".getNode(), \"yellow\");"); 1152 emitCode("CurDAG->setSubgraphColor(" + LSIName +".getNode(), \"black\");"); 1153 } 1154 if (IsVariadic) 1155 emitCode("Ops" + utostr(OpsNo) + ".push_back(" + LSIName + ");"); 1156 else 1157 AllOps.push_back(LSIName); 1158 } 1159 } 1160 1161 if (NodeHasChain) { 1162 if (IsVariadic) 1163 emitCode("Ops" + utostr(OpsNo) + ".push_back(" + ChainName + ");"); 1164 else 1165 AllOps.push_back(ChainName); 1166 } 1167 1168 if (IsVariadic) { 1169 if (NodeHasInFlag || HasImpInputs) 1170 emitCode("Ops" + utostr(OpsNo) + ".push_back(InFlag);"); 1171 else if (NodeHasOptInFlag) { 1172 emitCode("if (HasInFlag)"); 1173 emitCode(" Ops" + utostr(OpsNo) + ".push_back(InFlag);"); 1174 } 1175 Code += ", &Ops" + utostr(OpsNo) + "[0], Ops" + utostr(OpsNo) + 1176 ".size()"; 1177 } else if (NodeHasInFlag || NodeHasOptInFlag || HasImpInputs) 1178 AllOps.push_back("InFlag"); 1179 1180 unsigned NumOps = AllOps.size(); 1181 if (NumOps) { 1182 if (!NodeHasOptInFlag && NumOps < 4) { 1183 for (unsigned i = 0; i != NumOps; ++i) 1184 Code += ", " + AllOps[i]; 1185 } else { 1186 std::string OpsCode = "SDValue Ops" + utostr(OpsNo) + "[] = { "; 1187 for (unsigned i = 0; i != NumOps; ++i) { 1188 OpsCode += AllOps[i]; 1189 if (i != NumOps-1) 1190 OpsCode += ", "; 1191 } 1192 emitCode(OpsCode + " };"); 1193 Code += ", Ops" + utostr(OpsNo) + ", "; 1194 if (NodeHasOptInFlag) { 1195 Code += "HasInFlag ? "; 1196 Code += utostr(NumOps) + " : " + utostr(NumOps-1); 1197 } else 1198 Code += utostr(NumOps); 1199 } 1200 } 1201 1202 if (!isRoot) 1203 Code += "), 0"; 1204 1205 std::vector<std::string> ReplaceFroms; 1206 std::vector<std::string> ReplaceTos; 1207 if (!isRoot) { 1208 NodeOps.push_back("Tmp" + utostr(ResNo)); 1209 } else { 1210 1211 if (NodeHasOutFlag) { 1212 if (!InFlagDecled) { 1213 After.push_back("SDValue InFlag(ResNode, " + 1214 utostr(NumResults+NumDstRegs+(unsigned)NodeHasChain) + 1215 ");"); 1216 InFlagDecled = true; 1217 } else 1218 After.push_back("InFlag = SDValue(ResNode, " + 1219 utostr(NumResults+NumDstRegs+(unsigned)NodeHasChain) + 1220 ");"); 1221 } 1222 1223 for (unsigned j = 0, e = FoldedChains.size(); j < e; j++) { 1224 ReplaceFroms.push_back("SDValue(" + 1225 FoldedChains[j].first + ".getNode(), " + 1226 utostr(FoldedChains[j].second) + 1227 ")"); 1228 ReplaceTos.push_back("SDValue(ResNode, " + 1229 utostr(NumResults+NumDstRegs) + ")"); 1230 } 1231 1232 if (NodeHasOutFlag) { 1233 if (FoldedFlag.first != "") { 1234 ReplaceFroms.push_back("SDValue(" + FoldedFlag.first + ".getNode(), " + 1235 utostr(FoldedFlag.second) + ")"); 1236 ReplaceTos.push_back("InFlag"); 1237 } else { 1238 assert(NodeHasProperty(Pattern, SDNPOutFlag, CGP)); 1239 ReplaceFroms.push_back("SDValue(N.getNode(), " + 1240 utostr(NumPatResults + (unsigned)InputHasChain) 1241 + ")"); 1242 ReplaceTos.push_back("InFlag"); 1243 } 1244 } 1245 1246 if (!ReplaceFroms.empty() && InputHasChain) { 1247 ReplaceFroms.push_back("SDValue(N.getNode(), " + 1248 utostr(NumPatResults) + ")"); 1249 ReplaceTos.push_back("SDValue(" + ChainName + ".getNode(), " + 1250 ChainName + ".getResNo()" + ")"); 1251 ChainAssignmentNeeded |= NodeHasChain; 1252 } 1253 1254 // User does not expect the instruction would produce a chain! 1255 if ((!InputHasChain && NodeHasChain) && NodeHasOutFlag) { 1256 ; 1257 } else if (InputHasChain && !NodeHasChain) { 1258 // One of the inner node produces a chain. 1259 if (NodeHasOutFlag) { 1260 ReplaceFroms.push_back("SDValue(N.getNode(), " + 1261 utostr(NumPatResults+1) + 1262 ")"); 1263 ReplaceTos.push_back("SDValue(ResNode, N.getResNo()-1)"); 1264 } 1265 ReplaceFroms.push_back("SDValue(N.getNode(), " + 1266 utostr(NumPatResults) + ")"); 1267 ReplaceTos.push_back(ChainName); 1268 } 1269 } 1270 1271 if (ChainAssignmentNeeded) { 1272 // Remember which op produces the chain. 1273 std::string ChainAssign; 1274 if (!isRoot) 1275 ChainAssign = ChainName + " = SDValue(" + NodeName + 1276 ".getNode(), " + utostr(NumResults+NumDstRegs) + ");"; 1277 else 1278 ChainAssign = ChainName + " = SDValue(" + NodeName + 1279 ", " + utostr(NumResults+NumDstRegs) + ");"; 1280 1281 After.push_front(ChainAssign); 1282 } 1283 1284 if (ReplaceFroms.size() == 1) { 1285 After.push_back("ReplaceUses(" + ReplaceFroms[0] + ", " + 1286 ReplaceTos[0] + ");"); 1287 } else if (!ReplaceFroms.empty()) { 1288 After.push_back("const SDValue Froms[] = {"); 1289 for (unsigned i = 0, e = ReplaceFroms.size(); i != e; ++i) 1290 After.push_back(" " + ReplaceFroms[i] + (i + 1 != e ? "," : "")); 1291 After.push_back("};"); 1292 After.push_back("const SDValue Tos[] = {"); 1293 for (unsigned i = 0, e = ReplaceFroms.size(); i != e; ++i) 1294 After.push_back(" " + ReplaceTos[i] + (i + 1 != e ? "," : "")); 1295 After.push_back("};"); 1296 After.push_back("ReplaceUses(Froms, Tos, " + 1297 itostr(ReplaceFroms.size()) + ");"); 1298 } 1299 1300 // We prefer to use SelectNodeTo since it avoids allocation when 1301 // possible and it avoids CSE map recalculation for the node's 1302 // users, however it's tricky to use in a non-root context. 1303 // 1304 // We also don't use if the pattern replacement is being used to 1305 // jettison a chain result, since morphing the node in place 1306 // would leave users of the chain dangling. 1307 // 1308 if (!isRoot || (InputHasChain && !NodeHasChain)) { 1309 Code = "CurDAG->getTargetNode(" + Code; 1310 } else { 1311 Code = "CurDAG->SelectNodeTo(N.getNode(), " + Code; 1312 } 1313 if (isRoot) { 1314 if (After.empty()) 1315 CodePrefix = "return "; 1316 else 1317 After.push_back("return ResNode;"); 1318 } 1319 1320 emitCode(CodePrefix + Code + ");"); 1321 1322 if (GenDebug) { 1323 if (!isRoot) { 1324 emitCode("CurDAG->setSubgraphColor(" + NodeName +".getNode(), \"yellow\");"); 1325 emitCode("CurDAG->setSubgraphColor(" + NodeName +".getNode(), \"black\");"); 1326 } 1327 else { 1328 emitCode("CurDAG->setSubgraphColor(" + NodeName +", \"yellow\");"); 1329 emitCode("CurDAG->setSubgraphColor(" + NodeName +", \"black\");"); 1330 } 1331 } 1332 1333 for (unsigned i = 0, e = After.size(); i != e; ++i) 1334 emitCode(After[i]); 1335 1336 return NodeOps; 1337 } 1338 if (Op->isSubClassOf("SDNodeXForm")) { 1339 assert(N->getNumChildren() == 1 && "node xform should have one child!"); 1340 // PatLeaf node - the operand may or may not be a leaf node. But it should 1341 // behave like one. 1342 std::vector<std::string> Ops = 1343 EmitResultCode(N->getChild(0), DstRegs, InFlagDecled, 1344 ResNodeDecled, true); 1345 unsigned ResNo = TmpNo++; 1346 emitCode("SDValue Tmp" + utostr(ResNo) + " = Transform_" + Op->getName() 1347 + "(" + Ops.back() + ".getNode());"); 1348 NodeOps.push_back("Tmp" + utostr(ResNo)); 1349 if (isRoot) 1350 emitCode("return Tmp" + utostr(ResNo) + ".getNode();"); 1351 return NodeOps; 1352 } 1353 1354 N->dump(); 1355 errs() << "\n"; 1356 throw std::string("Unknown node in result pattern!"); 1357 } 1358 1359 /// InsertOneTypeCheck - Insert a type-check for an unresolved type in 'Pat' 1360 /// and add it to the tree. 'Pat' and 'Other' are isomorphic trees except that 1361 /// 'Pat' may be missing types. If we find an unresolved type to add a check 1362 /// for, this returns true otherwise false if Pat has all types. 1363 bool InsertOneTypeCheck(TreePatternNode *Pat, TreePatternNode *Other, 1364 const std::string &Prefix, bool isRoot = false) { 1365 // Did we find one? 1366 if (Pat->getExtTypes() != Other->getExtTypes()) { 1367 // Move a type over from 'other' to 'pat'. 1368 Pat->setTypes(Other->getExtTypes()); 1369 // The top level node type is checked outside of the select function. 1370 if (!isRoot) 1371 emitCheck(Prefix + ".getNode()->getValueType(0) == " + 1372 getName(Pat->getTypeNum(0))); 1373 return true; 1374 } 1375 1376 unsigned OpNo = 1377 (unsigned) NodeHasProperty(Pat, SDNPHasChain, CGP); 1378 for (unsigned i = 0, e = Pat->getNumChildren(); i != e; ++i, ++OpNo) 1379 if (InsertOneTypeCheck(Pat->getChild(i), Other->getChild(i), 1380 Prefix + utostr(OpNo))) 1381 return true; 1382 return false; 1383 } 1384 1385 private: 1386 /// EmitInFlagSelectCode - Emit the flag operands for the DAG that is 1387 /// being built. 1388 void EmitInFlagSelectCode(TreePatternNode *N, const std::string &RootName, 1389 bool &ChainEmitted, bool &InFlagDecled, 1390 bool &ResNodeDecled, bool isRoot = false) { 1391 const CodeGenTarget &T = CGP.getTargetInfo(); 1392 unsigned OpNo = 1393 (unsigned) NodeHasProperty(N, SDNPHasChain, CGP); 1394 bool HasInFlag = NodeHasProperty(N, SDNPInFlag, CGP); 1395 for (unsigned i = 0, e = N->getNumChildren(); i != e; ++i, ++OpNo) { 1396 TreePatternNode *Child = N->getChild(i); 1397 if (!Child->isLeaf()) { 1398 EmitInFlagSelectCode(Child, RootName + utostr(OpNo), ChainEmitted, 1399 InFlagDecled, ResNodeDecled); 1400 } else { 1401 if (DefInit *DI = dynamic_cast<DefInit*>(Child->getLeafValue())) { 1402 if (!Child->getName().empty()) { 1403 std::string Name = RootName + utostr(OpNo); 1404 if (Duplicates.find(Name) != Duplicates.end()) 1405 // A duplicate! Do not emit a copy for this node. 1406 continue; 1407 } 1408 1409 Record *RR = DI->getDef(); 1410 if (RR->isSubClassOf("Register")) { 1411 MVT::SimpleValueType RVT = getRegisterValueType(RR, T); 1412 if (RVT == MVT::Flag) { 1413 if (!InFlagDecled) { 1414 emitCode("SDValue InFlag = " + RootName + utostr(OpNo) + ";"); 1415 InFlagDecled = true; 1416 } else 1417 emitCode("InFlag = " + RootName + utostr(OpNo) + ";"); 1418 } else { 1419 if (!ChainEmitted) { 1420 emitCode("SDValue Chain = CurDAG->getEntryNode();"); 1421 ChainName = "Chain"; 1422 ChainEmitted = true; 1423 } 1424 if (!InFlagDecled) { 1425 emitCode("SDValue InFlag(0, 0);"); 1426 InFlagDecled = true; 1427 } 1428 std::string Decl = (!ResNodeDecled) ? "SDNode *" : ""; 1429 emitCode(Decl + "ResNode = CurDAG->getCopyToReg(" + ChainName + 1430 ", " + RootName + ".getDebugLoc()" + 1431 ", " + getQualifiedName(RR) + 1432 ", " + RootName + utostr(OpNo) + ", InFlag).getNode();"); 1433 ResNodeDecled = true; 1434 emitCode(ChainName + " = SDValue(ResNode, 0);"); 1435 emitCode("InFlag = SDValue(ResNode, 1);"); 1436 } 1437 } 1438 } 1439 } 1440 } 1441 1442 if (HasInFlag) { 1443 if (!InFlagDecled) { 1444 emitCode("SDValue InFlag = " + RootName + 1445 ".getOperand(" + utostr(OpNo) + ");"); 1446 InFlagDecled = true; 1447 } else 1448 emitCode("InFlag = " + RootName + 1449 ".getOperand(" + utostr(OpNo) + ");"); 1450 } 1451 } 1452 }; 1453 1454 /// EmitCodeForPattern - Given a pattern to match, emit code to the specified 1455 /// stream to match the pattern, and generate the code for the match if it 1456 /// succeeds. Returns true if the pattern is not guaranteed to match. 1457 void DAGISelEmitter::GenerateCodeForPattern(const PatternToMatch &Pattern, 1458 std::vector<std::pair<unsigned, std::string> > &GeneratedCode, 1459 std::set<std::string> &GeneratedDecl, 1460 std::vector<std::string> &TargetOpcodes, 1461 std::vector<std::string> &TargetVTs, 1462 bool &OutputIsVariadic, 1463 unsigned &NumInputRootOps) { 1464 OutputIsVariadic = false; 1465 NumInputRootOps = 0; 1466 1467 PatternCodeEmitter Emitter(CGP, Pattern.getPredicateCheck(), 1468 Pattern.getSrcPattern(), Pattern.getDstPattern(), 1469 GeneratedCode, GeneratedDecl, 1470 TargetOpcodes, TargetVTs, 1471 OutputIsVariadic, NumInputRootOps); 1472 1473 // Emit the matcher, capturing named arguments in VariableMap. 1474 bool FoundChain = false; 1475 Emitter.EmitMatchCode(Pattern.getSrcPattern(), NULL, "N", "", FoundChain); 1476 1477 // TP - Get *SOME* tree pattern, we don't care which. 1478 TreePattern &TP = *CGP.pf_begin()->second; 1479 1480 // At this point, we know that we structurally match the pattern, but the 1481 // types of the nodes may not match. Figure out the fewest number of type 1482 // comparisons we need to emit. For example, if there is only one integer 1483 // type supported by a target, there should be no type comparisons at all for 1484 // integer patterns! 1485 // 1486 // To figure out the fewest number of type checks needed, clone the pattern, 1487 // remove the types, then perform type inference on the pattern as a whole. 1488 // If there are unresolved types, emit an explicit check for those types, 1489 // apply the type to the tree, then rerun type inference. Iterate until all 1490 // types are resolved. 1491 // 1492 TreePatternNode *Pat = Pattern.getSrcPattern()->clone(); 1493 RemoveAllTypes(Pat); 1494 1495 do { 1496 // Resolve/propagate as many types as possible. 1497 try { 1498 bool MadeChange = true; 1499 while (MadeChange) 1500 MadeChange = Pat->ApplyTypeConstraints(TP, 1501 true/*Ignore reg constraints*/); 1502 } catch (...) { 1503 assert(0 && "Error: could not find consistent types for something we" 1504 " already decided was ok!"); 1505 abort(); 1506 } 1507 1508 // Insert a check for an unresolved type and add it to the tree. If we find 1509 // an unresolved type to add a check for, this returns true and we iterate, 1510 // otherwise we are done. 1511 } while (Emitter.InsertOneTypeCheck(Pat, Pattern.getSrcPattern(), "N", true)); 1512 1513 Emitter.EmitResultCode(Pattern.getDstPattern(), Pattern.getDstRegs(), 1514 false, false, false, true); 1515 delete Pat; 1516 } 1517 1518 /// EraseCodeLine - Erase one code line from all of the patterns. If removing 1519 /// a line causes any of them to be empty, remove them and return true when 1520 /// done. 1521 static bool EraseCodeLine(std::vector<std::pair<const PatternToMatch*, 1522 std::vector<std::pair<unsigned, std::string> > > > 1523 &Patterns) { 1524 bool ErasedPatterns = false; 1525 for (unsigned i = 0, e = Patterns.size(); i != e; ++i) { 1526 Patterns[i].second.pop_back(); 1527 if (Patterns[i].second.empty()) { 1528 Patterns.erase(Patterns.begin()+i); 1529 --i; --e; 1530 ErasedPatterns = true; 1531 } 1532 } 1533 return ErasedPatterns; 1534 } 1535 1536 /// EmitPatterns - Emit code for at least one pattern, but try to group common 1537 /// code together between the patterns. 1538 void DAGISelEmitter::EmitPatterns(std::vector<std::pair<const PatternToMatch*, 1539 std::vector<std::pair<unsigned, std::string> > > > 1540 &Patterns, unsigned Indent, 1541 raw_ostream &OS) { 1542 typedef std::pair<unsigned, std::string> CodeLine; 1543 typedef std::vector<CodeLine> CodeList; 1544 typedef std::vector<std::pair<const PatternToMatch*, CodeList> > PatternList; 1545 1546 if (Patterns.empty()) return; 1547 1548 // Figure out how many patterns share the next code line. Explicitly copy 1549 // FirstCodeLine so that we don't invalidate a reference when changing 1550 // Patterns. 1551 const CodeLine FirstCodeLine = Patterns.back().second.back(); 1552 unsigned LastMatch = Patterns.size()-1; 1553 while (LastMatch != 0 && Patterns[LastMatch-1].second.back() == FirstCodeLine) 1554 --LastMatch; 1555 1556 // If not all patterns share this line, split the list into two pieces. The 1557 // first chunk will use this line, the second chunk won't. 1558 if (LastMatch != 0) { 1559 PatternList Shared(Patterns.begin()+LastMatch, Patterns.end()); 1560 PatternList Other(Patterns.begin(), Patterns.begin()+LastMatch); 1561 1562 // FIXME: Emit braces? 1563 if (Shared.size() == 1) { 1564 const PatternToMatch &Pattern = *Shared.back().first; 1565 OS << "\n" << std::string(Indent, ' ') << "// Pattern: "; 1566 Pattern.getSrcPattern()->print(OS); 1567 OS << "\n" << std::string(Indent, ' ') << "// Emits: "; 1568 Pattern.getDstPattern()->print(OS); 1569 OS << "\n"; 1570 unsigned AddedComplexity = Pattern.getAddedComplexity(); 1571 OS << std::string(Indent, ' ') << "// Pattern complexity = " 1572 << getPatternSize(Pattern.getSrcPattern(), CGP) + AddedComplexity 1573 << " cost = " 1574 << getResultPatternCost(Pattern.getDstPattern(), CGP) 1575 << " size = " 1576 << getResultPatternSize(Pattern.getDstPattern(), CGP) << "\n"; 1577 } 1578 if (FirstCodeLine.first != 1) { 1579 OS << std::string(Indent, ' ') << "{\n"; 1580 Indent += 2; 1581 } 1582 EmitPatterns(Shared, Indent, OS); 1583 if (FirstCodeLine.first != 1) { 1584 Indent -= 2; 1585 OS << std::string(Indent, ' ') << "}\n"; 1586 } 1587 1588 if (Other.size() == 1) { 1589 const PatternToMatch &Pattern = *Other.back().first; 1590 OS << "\n" << std::string(Indent, ' ') << "// Pattern: "; 1591 Pattern.getSrcPattern()->print(OS); 1592 OS << "\n" << std::string(Indent, ' ') << "// Emits: "; 1593 Pattern.getDstPattern()->print(OS); 1594 OS << "\n"; 1595 unsigned AddedComplexity = Pattern.getAddedComplexity(); 1596 OS << std::string(Indent, ' ') << "// Pattern complexity = " 1597 << getPatternSize(Pattern.getSrcPattern(), CGP) + AddedComplexity 1598 << " cost = " 1599 << getResultPatternCost(Pattern.getDstPattern(), CGP) 1600 << " size = " 1601 << getResultPatternSize(Pattern.getDstPattern(), CGP) << "\n"; 1602 } 1603 EmitPatterns(Other, Indent, OS); 1604 return; 1605 } 1606 1607 // Remove this code from all of the patterns that share it. 1608 bool ErasedPatterns = EraseCodeLine(Patterns); 1609 1610 bool isPredicate = FirstCodeLine.first == 1; 1611 1612 // Otherwise, every pattern in the list has this line. Emit it. 1613 if (!isPredicate) { 1614 // Normal code. 1615 OS << std::string(Indent, ' ') << FirstCodeLine.second << "\n"; 1616 } else { 1617 OS << std::string(Indent, ' ') << "if (" << FirstCodeLine.second; 1618 1619 // If the next code line is another predicate, and if all of the pattern 1620 // in this group share the same next line, emit it inline now. Do this 1621 // until we run out of common predicates. 1622 while (!ErasedPatterns && Patterns.back().second.back().first == 1) { 1623 // Check that all of the patterns in Patterns end with the same predicate. 1624 bool AllEndWithSamePredicate = true; 1625 for (unsigned i = 0, e = Patterns.size(); i != e; ++i) 1626 if (Patterns[i].second.back() != Patterns.back().second.back()) { 1627 AllEndWithSamePredicate = false; 1628 break; 1629 } 1630 // If all of the predicates aren't the same, we can't share them. 1631 if (!AllEndWithSamePredicate) break; 1632 1633 // Otherwise we can. Emit it shared now. 1634 OS << " &&\n" << std::string(Indent+4, ' ') 1635 << Patterns.back().second.back().second; 1636 ErasedPatterns = EraseCodeLine(Patterns); 1637 } 1638 1639 OS << ") {\n"; 1640 Indent += 2; 1641 } 1642 1643 EmitPatterns(Patterns, Indent, OS); 1644 1645 if (isPredicate) 1646 OS << std::string(Indent-2, ' ') << "}\n"; 1647 } 1648 1649 static std::string getLegalCName(std::string OpName) { 1650 std::string::size_type pos = OpName.find("::"); 1651 if (pos != std::string::npos) 1652 OpName.replace(pos, 2, "_"); 1653 return OpName; 1654 } 1655 1656 void DAGISelEmitter::EmitInstructionSelector(raw_ostream &OS) { 1657 const CodeGenTarget &Target = CGP.getTargetInfo(); 1658 1659 // Get the namespace to insert instructions into. 1660 std::string InstNS = Target.getInstNamespace(); 1661 if (!InstNS.empty()) InstNS += "::"; 1662 1663 // Group the patterns by their top-level opcodes. 1664 std::map<std::string, std::vector<const PatternToMatch*> > PatternsByOpcode; 1665 // All unique target node emission functions. 1666 std::map<std::string, unsigned> EmitFunctions; 1667 for (CodeGenDAGPatterns::ptm_iterator I = CGP.ptm_begin(), 1668 E = CGP.ptm_end(); I != E; ++I) { 1669 const PatternToMatch &Pattern = *I; 1670 1671 TreePatternNode *Node = Pattern.getSrcPattern(); 1672 if (!Node->isLeaf()) { 1673 PatternsByOpcode[getOpcodeName(Node->getOperator(), CGP)]. 1674 push_back(&Pattern); 1675 } else { 1676 const ComplexPattern *CP; 1677 if (dynamic_cast<IntInit*>(Node->getLeafValue())) { 1678 PatternsByOpcode[getOpcodeName(CGP.getSDNodeNamed("imm"), CGP)]. 1679 push_back(&Pattern); 1680 } else if ((CP = NodeGetComplexPattern(Node, CGP))) { 1681 std::vector<Record*> OpNodes = CP->getRootNodes(); 1682 for (unsigned j = 0, e = OpNodes.size(); j != e; j++) { 1683 PatternsByOpcode[getOpcodeName(OpNodes[j], CGP)] 1684 .insert(PatternsByOpcode[getOpcodeName(OpNodes[j], CGP)].begin(), 1685 &Pattern); 1686 } 1687 } else { 1688 errs() << "Unrecognized opcode '"; 1689 Node->dump(); 1690 errs() << "' on tree pattern '"; 1691 errs() << Pattern.getDstPattern()->getOperator()->getName() << "'!\n"; 1692 exit(1); 1693 } 1694 } 1695 } 1696 1697 // For each opcode, there might be multiple select functions, one per 1698 // ValueType of the node (or its first operand if it doesn't produce a 1699 // non-chain result. 1700 std::map<std::string, std::vector<std::string> > OpcodeVTMap; 1701 1702 // Emit one Select_* method for each top-level opcode. We do this instead of 1703 // emitting one giant switch statement to support compilers where this will 1704 // result in the recursive functions taking less stack space. 1705 for (std::map<std::string, std::vector<const PatternToMatch*> >::iterator 1706 PBOI = PatternsByOpcode.begin(), E = PatternsByOpcode.end(); 1707 PBOI != E; ++PBOI) { 1708 const std::string &OpName = PBOI->first; 1709 std::vector<const PatternToMatch*> &PatternsOfOp = PBOI->second; 1710 assert(!PatternsOfOp.empty() && "No patterns but map has entry?"); 1711 1712 // Split them into groups by type. 1713 std::map<MVT::SimpleValueType, 1714 std::vector<const PatternToMatch*> > PatternsByType; 1715 for (unsigned i = 0, e = PatternsOfOp.size(); i != e; ++i) { 1716 const PatternToMatch *Pat = PatternsOfOp[i]; 1717 TreePatternNode *SrcPat = Pat->getSrcPattern(); 1718 PatternsByType[SrcPat->getTypeNum(0)].push_back(Pat); 1719 } 1720 1721 for (std::map<MVT::SimpleValueType, 1722 std::vector<const PatternToMatch*> >::iterator 1723 II = PatternsByType.begin(), EE = PatternsByType.end(); II != EE; 1724 ++II) { 1725 MVT::SimpleValueType OpVT = II->first; 1726 std::vector<const PatternToMatch*> &Patterns = II->second; 1727 typedef std::pair<unsigned, std::string> CodeLine; 1728 typedef std::vector<CodeLine> CodeList; 1729 typedef CodeList::iterator CodeListI; 1730 1731 std::vector<std::pair<const PatternToMatch*, CodeList> > CodeForPatterns; 1732 std::vector<std::vector<std::string> > PatternOpcodes; 1733 std::vector<std::vector<std::string> > PatternVTs; 1734 std::vector<std::set<std::string> > PatternDecls; 1735 std::vector<bool> OutputIsVariadicFlags; 1736 std::vector<unsigned> NumInputRootOpsCounts; 1737 for (unsigned i = 0, e = Patterns.size(); i != e; ++i) { 1738 CodeList GeneratedCode; 1739 std::set<std::string> GeneratedDecl; 1740 std::vector<std::string> TargetOpcodes; 1741 std::vector<std::string> TargetVTs; 1742 bool OutputIsVariadic; 1743 unsigned NumInputRootOps; 1744 GenerateCodeForPattern(*Patterns[i], GeneratedCode, GeneratedDecl, 1745 TargetOpcodes, TargetVTs, 1746 OutputIsVariadic, NumInputRootOps); 1747 CodeForPatterns.push_back(std::make_pair(Patterns[i], GeneratedCode)); 1748 PatternDecls.push_back(GeneratedDecl); 1749 PatternOpcodes.push_back(TargetOpcodes); 1750 PatternVTs.push_back(TargetVTs); 1751 OutputIsVariadicFlags.push_back(OutputIsVariadic); 1752 NumInputRootOpsCounts.push_back(NumInputRootOps); 1753 } 1754 1755 // Factor target node emission code (emitted by EmitResultCode) into 1756 // separate functions. Uniquing and share them among all instruction 1757 // selection routines. 1758 for (unsigned i = 0, e = CodeForPatterns.size(); i != e; ++i) { 1759 CodeList &GeneratedCode = CodeForPatterns[i].second; 1760 std::vector<std::string> &TargetOpcodes = PatternOpcodes[i]; 1761 std::vector<std::string> &TargetVTs = PatternVTs[i]; 1762 std::set<std::string> Decls = PatternDecls[i]; 1763 bool OutputIsVariadic = OutputIsVariadicFlags[i]; 1764 unsigned NumInputRootOps = NumInputRootOpsCounts[i]; 1765 std::vector<std::string> AddedInits; 1766 int CodeSize = (int)GeneratedCode.size(); 1767 int LastPred = -1; 1768 for (int j = CodeSize-1; j >= 0; --j) { 1769 if (LastPred == -1 && GeneratedCode[j].first == 1) 1770 LastPred = j; 1771 else if (LastPred != -1 && GeneratedCode[j].first == 2) 1772 AddedInits.push_back(GeneratedCode[j].second); 1773 } 1774 1775 std::string CalleeCode = "(const SDValue &N"; 1776 std::string CallerCode = "(N"; 1777 for (unsigned j = 0, e = TargetOpcodes.size(); j != e; ++j) { 1778 CalleeCode += ", unsigned Opc" + utostr(j); 1779 CallerCode += ", " + TargetOpcodes[j]; 1780 } 1781 for (unsigned j = 0, e = TargetVTs.size(); j != e; ++j) { 1782 CalleeCode += ", MVT VT" + utostr(j); 1783 CallerCode += ", " + TargetVTs[j]; 1784 } 1785 for (std::set<std::string>::iterator 1786 I = Decls.begin(), E = Decls.end(); I != E; ++I) { 1787 std::string Name = *I; 1788 CalleeCode += ", SDValue &" + Name; 1789 CallerCode += ", " + Name; 1790 } 1791 1792 if (OutputIsVariadic) { 1793 CalleeCode += ", unsigned NumInputRootOps"; 1794 CallerCode += ", " + utostr(NumInputRootOps); 1795 } 1796 1797 CallerCode += ");"; 1798 CalleeCode += ") "; 1799 // Prevent emission routines from being inlined to reduce selection 1800 // routines stack frame sizes. 1801 CalleeCode += "DISABLE_INLINE "; 1802 CalleeCode += "{\n"; 1803 1804 for (std::vector<std::string>::const_reverse_iterator 1805 I = AddedInits.rbegin(), E = AddedInits.rend(); I != E; ++I) 1806 CalleeCode += " " + *I + "\n"; 1807 1808 for (int j = LastPred+1; j < CodeSize; ++j) 1809 CalleeCode += " " + GeneratedCode[j].second + "\n"; 1810 for (int j = LastPred+1; j < CodeSize; ++j) 1811 GeneratedCode.pop_back(); 1812 CalleeCode += "}\n"; 1813 1814 // Uniquing the emission routines. 1815 unsigned EmitFuncNum; 1816 std::map<std::string, unsigned>::iterator EFI = 1817 EmitFunctions.find(CalleeCode); 1818 if (EFI != EmitFunctions.end()) { 1819 EmitFuncNum = EFI->second; 1820 } else { 1821 EmitFuncNum = EmitFunctions.size(); 1822 EmitFunctions.insert(std::make_pair(CalleeCode, EmitFuncNum)); 1823 OS << "SDNode *Emit_" << utostr(EmitFuncNum) << CalleeCode; 1824 } 1825 1826 // Replace the emission code within selection routines with calls to the 1827 // emission functions. 1828 if (GenDebug) { 1829 GeneratedCode.push_back(std::make_pair(0, "CurDAG->setSubgraphColor(N.getNode(), \"red\");")); 1830 } 1831 CallerCode = "SDNode *Result = Emit_" + utostr(EmitFuncNum) + CallerCode; 1832 GeneratedCode.push_back(std::make_pair(3, CallerCode)); 1833 if (GenDebug) { 1834 GeneratedCode.push_back(std::make_pair(0, "if(Result) {")); 1835 GeneratedCode.push_back(std::make_pair(0, " CurDAG->setSubgraphColor(Result, \"yellow\");")); 1836 GeneratedCode.push_back(std::make_pair(0, " CurDAG->setSubgraphColor(Result, \"black\");")); 1837 GeneratedCode.push_back(std::make_pair(0, "}")); 1838 //GeneratedCode.push_back(std::make_pair(0, "CurDAG->setSubgraphColor(N.getNode(), \"black\");")); 1839 } 1840 GeneratedCode.push_back(std::make_pair(0, "return Result;")); 1841 } 1842 1843 // Print function. 1844 std::string OpVTStr; 1845 if (OpVT == MVT::iPTR) { 1846 OpVTStr = "_iPTR"; 1847 } else if (OpVT == MVT::iPTRAny) { 1848 OpVTStr = "_iPTRAny"; 1849 } else if (OpVT == MVT::isVoid) { 1850 // Nodes with a void result actually have a first result type of either 1851 // Other (a chain) or Flag. Since there is no one-to-one mapping from 1852 // void to this case, we handle it specially here. 1853 } else { 1854 OpVTStr = "_" + getEnumName(OpVT).substr(5); // Skip 'MVT::' 1855 } 1856 std::map<std::string, std::vector<std::string> >::iterator OpVTI = 1857 OpcodeVTMap.find(OpName); 1858 if (OpVTI == OpcodeVTMap.end()) { 1859 std::vector<std::string> VTSet; 1860 VTSet.push_back(OpVTStr); 1861 OpcodeVTMap.insert(std::make_pair(OpName, VTSet)); 1862 } else 1863 OpVTI->second.push_back(OpVTStr); 1864 1865 // We want to emit all of the matching code now. However, we want to emit 1866 // the matches in order of minimal cost. Sort the patterns so the least 1867 // cost one is at the start. 1868 std::stable_sort(CodeForPatterns.begin(), CodeForPatterns.end(), 1869 PatternSortingPredicate(CGP)); 1870 1871 // Scan the code to see if all of the patterns are reachable and if it is 1872 // possible that the last one might not match. 1873 bool mightNotMatch = true; 1874 for (unsigned i = 0, e = CodeForPatterns.size(); i != e; ++i) { 1875 CodeList &GeneratedCode = CodeForPatterns[i].second; 1876 mightNotMatch = false; 1877 1878 for (unsigned j = 0, e = GeneratedCode.size(); j != e; ++j) { 1879 if (GeneratedCode[j].first == 1) { // predicate. 1880 mightNotMatch = true; 1881 break; 1882 } 1883 } 1884 1885 // If this pattern definitely matches, and if it isn't the last one, the 1886 // patterns after it CANNOT ever match. Error out. 1887 if (mightNotMatch == false && i != CodeForPatterns.size()-1) { 1888 errs() << "Pattern '"; 1889 CodeForPatterns[i].first->getSrcPattern()->print(errs()); 1890 errs() << "' is impossible to select!\n"; 1891 exit(1); 1892 } 1893 } 1894 1895 // Loop through and reverse all of the CodeList vectors, as we will be 1896 // accessing them from their logical front, but accessing the end of a 1897 // vector is more efficient. 1898 for (unsigned i = 0, e = CodeForPatterns.size(); i != e; ++i) { 1899 CodeList &GeneratedCode = CodeForPatterns[i].second; 1900 std::reverse(GeneratedCode.begin(), GeneratedCode.end()); 1901 } 1902 1903 // Next, reverse the list of patterns itself for the same reason. 1904 std::reverse(CodeForPatterns.begin(), CodeForPatterns.end()); 1905 1906 OS << "SDNode *Select_" << getLegalCName(OpName) 1907 << OpVTStr << "(const SDValue &N) {\n"; 1908 1909 // Emit all of the patterns now, grouped together to share code. 1910 EmitPatterns(CodeForPatterns, 2, OS); 1911 1912 // If the last pattern has predicates (which could fail) emit code to 1913 // catch the case where nothing handles a pattern. 1914 if (mightNotMatch) { 1915 OS << "\n"; 1916 if (OpName != "ISD::INTRINSIC_W_CHAIN" && 1917 OpName != "ISD::INTRINSIC_WO_CHAIN" && 1918 OpName != "ISD::INTRINSIC_VOID") 1919 OS << " CannotYetSelect(N);\n"; 1920 else 1921 OS << " CannotYetSelectIntrinsic(N);\n"; 1922 1923 OS << " return NULL;\n"; 1924 } 1925 OS << "}\n\n"; 1926 } 1927 } 1928 1929 // Emit boilerplate. 1930 OS << "SDNode *Select_INLINEASM(SDValue N) {\n" 1931 << " std::vector<SDValue> Ops(N.getNode()->op_begin(), N.getNode()->op_end());\n" 1932 << " SelectInlineAsmMemoryOperands(Ops);\n\n" 1933 1934 << " std::vector<MVT> VTs;\n" 1935 << " VTs.push_back(MVT::Other);\n" 1936 << " VTs.push_back(MVT::Flag);\n" 1937 << " SDValue New = CurDAG->getNode(ISD::INLINEASM, N.getDebugLoc(), " 1938 "VTs, &Ops[0], Ops.size());\n" 1939 << " return New.getNode();\n" 1940 << "}\n\n"; 1941 1942 OS << "SDNode *Select_UNDEF(const SDValue &N) {\n" 1943 << " return CurDAG->SelectNodeTo(N.getNode(), TargetInstrInfo::IMPLICIT_DEF,\n" 1944 << " N.getValueType());\n" 1945 << "}\n\n"; 1946 1947 OS << "SDNode *Select_DBG_LABEL(const SDValue &N) {\n" 1948 << " SDValue Chain = N.getOperand(0);\n" 1949 << " unsigned C = cast<LabelSDNode>(N)->getLabelID();\n" 1950 << " SDValue Tmp = CurDAG->getTargetConstant(C, MVT::i32);\n" 1951 << " return CurDAG->SelectNodeTo(N.getNode(), TargetInstrInfo::DBG_LABEL,\n" 1952 << " MVT::Other, Tmp, Chain);\n" 1953 << "}\n\n"; 1954 1955 OS << "SDNode *Select_EH_LABEL(const SDValue &N) {\n" 1956 << " SDValue Chain = N.getOperand(0);\n" 1957 << " unsigned C = cast<LabelSDNode>(N)->getLabelID();\n" 1958 << " SDValue Tmp = CurDAG->getTargetConstant(C, MVT::i32);\n" 1959 << " return CurDAG->SelectNodeTo(N.getNode(), TargetInstrInfo::EH_LABEL,\n" 1960 << " MVT::Other, Tmp, Chain);\n" 1961 << "}\n\n"; 1962 1963 OS << "SDNode *Select_DECLARE(const SDValue &N) {\n" 1964 << " SDValue Chain = N.getOperand(0);\n" 1965 << " SDValue N1 = N.getOperand(1);\n" 1966 << " SDValue N2 = N.getOperand(2);\n" 1967 << " if (!isa<FrameIndexSDNode>(N1) || !isa<GlobalAddressSDNode>(N2)) {\n" 1968 << " CannotYetSelect(N);\n" 1969 << " }\n" 1970 << " int FI = cast<FrameIndexSDNode>(N1)->getIndex();\n" 1971 << " GlobalValue *GV = cast<GlobalAddressSDNode>(N2)->getGlobal();\n" 1972 << " SDValue Tmp1 = " 1973 << "CurDAG->getTargetFrameIndex(FI, TLI.getPointerTy());\n" 1974 << " SDValue Tmp2 = " 1975 << "CurDAG->getTargetGlobalAddress(GV, TLI.getPointerTy());\n" 1976 << " return CurDAG->SelectNodeTo(N.getNode(), TargetInstrInfo::DECLARE,\n" 1977 << " MVT::Other, Tmp1, Tmp2, Chain);\n" 1978 << "}\n\n"; 1979 1980 OS << "// The main instruction selector code.\n" 1981 << "SDNode *SelectCode(SDValue N) {\n" 1982 << " MVT::SimpleValueType NVT = N.getNode()->getValueType(0).getSimpleVT();\n" 1983 << " switch (N.getOpcode()) {\n" 1984 << " default:\n" 1985 << " assert(!N.isMachineOpcode() && \"Node already selected!\");\n" 1986 << " break;\n" 1987 << " case ISD::EntryToken: // These nodes remain the same.\n" 1988 << " case ISD::MEMOPERAND:\n" 1989 << " case ISD::BasicBlock:\n" 1990 << " case ISD::Register:\n" 1991 << " case ISD::HANDLENODE:\n" 1992 << " case ISD::TargetConstant:\n" 1993 << " case ISD::TargetConstantFP:\n" 1994 << " case ISD::TargetConstantPool:\n" 1995 << " case ISD::TargetFrameIndex:\n" 1996 << " case ISD::TargetExternalSymbol:\n" 1997 << " case ISD::TargetJumpTable:\n" 1998 << " case ISD::TargetGlobalTLSAddress:\n" 1999 << " case ISD::TargetGlobalAddress:\n" 2000 << " case ISD::TokenFactor:\n" 2001 << " case ISD::CopyFromReg:\n" 2002 << " case ISD::CopyToReg: {\n" 2003 << " return NULL;\n" 2004 << " }\n" 2005 << " case ISD::AssertSext:\n" 2006 << " case ISD::AssertZext: {\n" 2007 << " ReplaceUses(N, N.getOperand(0));\n" 2008 << " return NULL;\n" 2009 << " }\n" 2010 << " case ISD::INLINEASM: return Select_INLINEASM(N);\n" 2011 << " case ISD::DBG_LABEL: return Select_DBG_LABEL(N);\n" 2012 << " case ISD::EH_LABEL: return Select_EH_LABEL(N);\n" 2013 << " case ISD::DECLARE: return Select_DECLARE(N);\n" 2014 << " case ISD::UNDEF: return Select_UNDEF(N);\n"; 2015 2016 // Loop over all of the case statements, emiting a call to each method we 2017 // emitted above. 2018 for (std::map<std::string, std::vector<const PatternToMatch*> >::iterator 2019 PBOI = PatternsByOpcode.begin(), E = PatternsByOpcode.end(); 2020 PBOI != E; ++PBOI) { 2021 const std::string &OpName = PBOI->first; 2022 // Potentially multiple versions of select for this opcode. One for each 2023 // ValueType of the node (or its first true operand if it doesn't produce a 2024 // result. 2025 std::map<std::string, std::vector<std::string> >::iterator OpVTI = 2026 OpcodeVTMap.find(OpName); 2027 std::vector<std::string> &OpVTs = OpVTI->second; 2028 OS << " case " << OpName << ": {\n"; 2029 // If we have only one variant and it's the default, elide the 2030 // switch. Marginally faster, and makes MSVC happier. 2031 if (OpVTs.size()==1 && OpVTs[0].empty()) { 2032 OS << " return Select_" << getLegalCName(OpName) << "(N);\n"; 2033 OS << " break;\n"; 2034 OS << " }\n"; 2035 continue; 2036 } 2037 // Keep track of whether we see a pattern that has an iPtr result. 2038 bool HasPtrPattern = false; 2039 bool HasDefaultPattern = false; 2040 2041 OS << " switch (NVT) {\n"; 2042 for (unsigned i = 0, e = OpVTs.size(); i < e; ++i) { 2043 std::string &VTStr = OpVTs[i]; 2044 if (VTStr.empty()) { 2045 HasDefaultPattern = true; 2046 continue; 2047 } 2048 2049 // If this is a match on iPTR: don't emit it directly, we need special 2050 // code. 2051 if (VTStr == "_iPTR") { 2052 HasPtrPattern = true; 2053 continue; 2054 } 2055 OS << " case MVT::" << VTStr.substr(1) << ":\n" 2056 << " return Select_" << getLegalCName(OpName) 2057 << VTStr << "(N);\n"; 2058 } 2059 OS << " default:\n"; 2060 2061 // If there is an iPTR result version of this pattern, emit it here. 2062 if (HasPtrPattern) { 2063 OS << " if (TLI.getPointerTy() == NVT)\n"; 2064 OS << " return Select_" << getLegalCName(OpName) <<"_iPTR(N);\n"; 2065 } 2066 if (HasDefaultPattern) { 2067 OS << " return Select_" << getLegalCName(OpName) << "(N);\n"; 2068 } 2069 OS << " break;\n"; 2070 OS << " }\n"; 2071 OS << " break;\n"; 2072 OS << " }\n"; 2073 } 2074 2075 OS << " } // end of big switch.\n\n" 2076 << " if (N.getOpcode() != ISD::INTRINSIC_W_CHAIN &&\n" 2077 << " N.getOpcode() != ISD::INTRINSIC_WO_CHAIN &&\n" 2078 << " N.getOpcode() != ISD::INTRINSIC_VOID) {\n" 2079 << " CannotYetSelect(N);\n" 2080 << " } else {\n" 2081 << " CannotYetSelectIntrinsic(N);\n" 2082 << " }\n" 2083 << " return NULL;\n" 2084 << "}\n\n"; 2085 2086 OS << "void CannotYetSelect(SDValue N) DISABLE_INLINE {\n" 2087 << " std::string msg;\n" 2088 << " raw_string_ostream Msg(msg);\n" 2089 << " Msg << \"Cannot yet select: \";\n" 2090 << " N.getNode()->print(Msg, CurDAG);\n" 2091 << " llvm_report_error(Msg.str());\n" 2092 << "}\n\n"; 2093 2094 OS << "void CannotYetSelectIntrinsic(SDValue N) DISABLE_INLINE {\n" 2095 << " cerr << \"Cannot yet select: \";\n" 2096 << " unsigned iid = cast<ConstantSDNode>(N.getOperand(" 2097 << "N.getOperand(0).getValueType() == MVT::Other))->getZExtValue();\n" 2098 << " llvm_report_error(\"Cannot yet select: intrinsic %\" +\n" 2099 << "Intrinsic::getName((Intrinsic::ID)iid));\n" 2100 << "}\n\n"; 2101 } 2102 2103 void DAGISelEmitter::run(raw_ostream &OS) { 2104 EmitSourceFileHeader("DAG Instruction Selector for the " + 2105 CGP.getTargetInfo().getName() + " target", OS); 2106 2107 OS << "// *** NOTE: This file is #included into the middle of the target\n" 2108 << "// *** instruction selector class. These functions are really " 2109 << "methods.\n\n"; 2110 2111 OS << "// Include standard, target-independent definitions and methods used\n" 2112 << "// by the instruction selector.\n"; 2113 OS << "#include \"llvm/CodeGen/DAGISelHeader.h\"\n\n"; 2114 2115 EmitNodeTransforms(OS); 2116 EmitPredicateFunctions(OS); 2117 2118 DOUT << "\n\nALL PATTERNS TO MATCH:\n\n"; 2119 for (CodeGenDAGPatterns::ptm_iterator I = CGP.ptm_begin(), E = CGP.ptm_end(); 2120 I != E; ++I) { 2121 DOUT << "PATTERN: "; DEBUG(I->getSrcPattern()->dump()); 2122 DOUT << "\nRESULT: "; DEBUG(I->getDstPattern()->dump()); 2123 DOUT << "\n"; 2124 } 2125 2126 // At this point, we have full information about the 'Patterns' we need to 2127 // parse, both implicitly from instructions as well as from explicit pattern 2128 // definitions. Emit the resultant instruction selector. 2129 EmitInstructionSelector(OS); 2130 2131 } 2132