Author: lattner Date: Sat Jan 5 16:43:57 2008 New Revision: 45634 URL: http://llvm.org/viewvc/llvm-project?rev=45634&view=rev Log: move predicate printing code from CodeGenDAGPatterns -> DAGISelEmitter.
Modified: llvm/trunk/utils/TableGen/CodeGenDAGPatterns.cpp llvm/trunk/utils/TableGen/CodeGenDAGPatterns.h llvm/trunk/utils/TableGen/DAGISelEmitter.cpp llvm/trunk/utils/TableGen/DAGISelEmitter.h Modified: llvm/trunk/utils/TableGen/CodeGenDAGPatterns.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/CodeGenDAGPatterns.cpp?rev=45634&r1=45633&r2=45634&view=diff ============================================================================== --- llvm/trunk/utils/TableGen/CodeGenDAGPatterns.cpp (original) +++ llvm/trunk/utils/TableGen/CodeGenDAGPatterns.cpp Sat Jan 5 16:43:57 2008 @@ -1119,7 +1119,7 @@ ParseNodeInfo(); ParseNodeTransforms(OS); ParseComplexPatterns(); - ParsePatternFragments(OS); + ParsePatternFragments(); ParseDefaultOperands(); ParseInstructions(); ParsePatterns(); @@ -1200,23 +1200,20 @@ /// inline fragments together as necessary, so that there are no references left /// inside a pattern fragment to a pattern fragment. /// -/// This also emits all of the predicate functions to the output file. -/// -void CodegenDAGPatterns::ParsePatternFragments(std::ostream &OS) { +void CodegenDAGPatterns::ParsePatternFragments() { std::vector<Record*> Fragments = Records.getAllDerivedDefinitions("PatFrag"); - // First step, parse all of the fragments and emit predicate functions. - OS << "\n// Predicate functions.\n"; + // First step, parse all of the fragments. for (unsigned i = 0, e = Fragments.size(); i != e; ++i) { DagInit *Tree = Fragments[i]->getValueAsDag("Fragment"); TreePattern *P = new TreePattern(Fragments[i], Tree, true, *this); PatternFragments[Fragments[i]] = P; - // Validate the argument list, converting it to map, to discard duplicates. + // Validate the argument list, converting it to set, to discard duplicates. std::vector<std::string> &Args = P->getArgList(); - std::set<std::string> OperandsMap(Args.begin(), Args.end()); + std::set<std::string> OperandsSet(Args.begin(), Args.end()); - if (OperandsMap.count("")) + if (OperandsSet.count("")) P->error("Cannot have unnamed 'node' values in pattern fragment!"); // Parse the operands list. @@ -1239,37 +1236,22 @@ P->error("Operands list should all be 'node' values."); if (OpsList->getArgName(j).empty()) P->error("Operands list should have names for each operand!"); - if (!OperandsMap.count(OpsList->getArgName(j))) + if (!OperandsSet.count(OpsList->getArgName(j))) P->error("'" + OpsList->getArgName(j) + "' does not occur in pattern or was multiply specified!"); - OperandsMap.erase(OpsList->getArgName(j)); + OperandsSet.erase(OpsList->getArgName(j)); Args.push_back(OpsList->getArgName(j)); } - if (!OperandsMap.empty()) + if (!OperandsSet.empty()) P->error("Operands list does not contain an entry for operand '" + - *OperandsMap.begin() + "'!"); + *OperandsSet.begin() + "'!"); - // If there is a code init for this fragment, emit the predicate code and - // keep track of the fact that this fragment uses it. + // If there is a code init for this fragment, keep track of the fact that + // this fragment uses it. std::string Code = Fragments[i]->getValueAsCode("Predicate"); - if (!Code.empty()) { - if (P->getOnlyTree()->isLeaf()) - OS << "inline bool Predicate_" << Fragments[i]->getName() - << "(SDNode *N) {\n"; - else { - std::string ClassName = - getSDNodeInfo(P->getOnlyTree()->getOperator()).getSDClassName(); - const char *C2 = ClassName == "SDNode" ? "N" : "inN"; - - OS << "inline bool Predicate_" << Fragments[i]->getName() - << "(SDNode *" << C2 << ") {\n"; - if (ClassName != "SDNode") - OS << " " << ClassName << " *N = cast<" << ClassName << ">(inN);\n"; - } - OS << Code << "\n}\n"; + if (!Code.empty()) P->getOnlyTree()->setPredicateFn("Predicate_"+Fragments[i]->getName()); - } // If there is a node transformation corresponding to this, keep track of // it. @@ -1278,8 +1260,6 @@ P->getOnlyTree()->setTransformFn(Transform); } - OS << "\n\n"; - // Now that we've parsed all of the tree fragments, do a closure on them so // that there are not references to PatFrags left inside of them. for (std::map<Record*, TreePattern*>::iterator I = PatternFragments.begin(), Modified: llvm/trunk/utils/TableGen/CodeGenDAGPatterns.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/CodeGenDAGPatterns.h?rev=45634&r1=45633&r2=45634&view=diff ============================================================================== --- llvm/trunk/utils/TableGen/CodeGenDAGPatterns.h (original) +++ llvm/trunk/utils/TableGen/CodeGenDAGPatterns.h Sat Jan 5 16:43:57 2008 @@ -532,7 +532,7 @@ void ParseNodeInfo(); void ParseNodeTransforms(std::ostream &OS); void ParseComplexPatterns(); - void ParsePatternFragments(std::ostream &OS); + void ParsePatternFragments(); void ParseDefaultOperands(); void ParseInstructions(); void ParsePatterns(); Modified: llvm/trunk/utils/TableGen/DAGISelEmitter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/DAGISelEmitter.cpp?rev=45634&r1=45633&r2=45634&view=diff ============================================================================== --- llvm/trunk/utils/TableGen/DAGISelEmitter.cpp (original) +++ llvm/trunk/utils/TableGen/DAGISelEmitter.cpp Sat Jan 5 16:43:57 2008 @@ -21,10 +21,9 @@ using namespace llvm; //===----------------------------------------------------------------------===// -// DAGISelEmitter implementation +// DAGISelEmitter Helper methods // - /// NodeIsComplexPattern - return true if N is a leaf node and a subclass of /// ComplexPattern. static bool NodeIsComplexPattern(TreePatternNode *N) { @@ -207,6 +206,55 @@ return false; } +//===----------------------------------------------------------------------===// +// Predicate emitter implementation. +// + +void DAGISelEmitter::EmitPredicateFunctions(std::ostream &OS) { + OS << "\n// Predicate functions.\n"; + + // Walk the pattern fragments, adding them to a map, which sorts them by + // name. + typedef std::map<std::string, std::pair<Record*, TreePattern*> > PFsByNameTy; + PFsByNameTy PFsByName; + + for (CodegenDAGPatterns::pf_iterator I = CGP->pf_begin(), E = CGP->pf_end(); + I != E; ++I) + PFsByName.insert(std::make_pair(I->first->getName(), *I)); + + + for (PFsByNameTy::iterator I = PFsByName.begin(), E = PFsByName.end(); + I != E; ++I) { + Record *PatFragRecord = I->second.first;// Record that derives from PatFrag. + TreePattern *P = I->second.second; + + // If there is a code init for this fragment, emit the predicate code. + std::string Code = PatFragRecord->getValueAsCode("Predicate"); + if (Code.empty()) continue; + + if (P->getOnlyTree()->isLeaf()) + OS << "inline bool Predicate_" << PatFragRecord->getName() + << "(SDNode *N) {\n"; + else { + std::string ClassName = + CGP->getSDNodeInfo(P->getOnlyTree()->getOperator()).getSDClassName(); + const char *C2 = ClassName == "SDNode" ? "N" : "inN"; + + OS << "inline bool Predicate_" << PatFragRecord->getName() + << "(SDNode *" << C2 << ") {\n"; + if (ClassName != "SDNode") + OS << " " << ClassName << " *N = cast<" << ClassName << ">(inN);\n"; + } + OS << Code << "\n}\n"; + } + + OS << "\n\n"; +} + + +//===----------------------------------------------------------------------===// +// PatternCodeEmitter implementation. +// class PatternCodeEmitter { private: CodegenDAGPatterns &CGP; @@ -1966,6 +2014,8 @@ this->CGP = &CGP; + EmitPredicateFunctions(OS); + DOUT << "\n\nALL PATTERNS TO MATCH:\n\n"; for (CodegenDAGPatterns::ptm_iterator I = CGP.ptm_begin(), E = CGP.ptm_end(); I != E; ++I) { Modified: llvm/trunk/utils/TableGen/DAGISelEmitter.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/DAGISelEmitter.h?rev=45634&r1=45633&r2=45634&view=diff ============================================================================== --- llvm/trunk/utils/TableGen/DAGISelEmitter.h (original) +++ llvm/trunk/utils/TableGen/DAGISelEmitter.h Sat Jan 5 16:43:57 2008 @@ -33,6 +33,8 @@ private: + void EmitPredicateFunctions(std::ostream &OS); + void GenerateCodeForPattern(const PatternToMatch &Pattern, std::vector<std::pair<unsigned, std::string> > &GeneratedCode, std::set<std::string> &GeneratedDecl, @@ -41,6 +43,7 @@ void EmitPatterns(std::vector<std::pair<const PatternToMatch*, std::vector<std::pair<unsigned, std::string> > > > &Patterns, unsigned Indent, std::ostream &OS); + void EmitInstructionSelector(std::ostream &OS); }; _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits