diff options
author | Chris Lattner <sabre@nondot.org> | 2008-01-05 22:43:57 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2008-01-05 22:43:57 +0000 |
commit | 7fdd9342e067eb9150798a6b107838a2053ccba6 (patch) | |
tree | ed4b8d1183f9ab5e465fa90960b215f9ad1674e1 /utils/TableGen/DAGISelEmitter.cpp | |
parent | 8191575233fdbcc51252dc6f98ffc5b3a982c1a9 (diff) | |
download | external_llvm-7fdd9342e067eb9150798a6b107838a2053ccba6.zip external_llvm-7fdd9342e067eb9150798a6b107838a2053ccba6.tar.gz external_llvm-7fdd9342e067eb9150798a6b107838a2053ccba6.tar.bz2 |
move predicate printing code from CodeGenDAGPatterns -> DAGISelEmitter.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@45634 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils/TableGen/DAGISelEmitter.cpp')
-rw-r--r-- | utils/TableGen/DAGISelEmitter.cpp | 54 |
1 files changed, 52 insertions, 2 deletions
diff --git a/utils/TableGen/DAGISelEmitter.cpp b/utils/TableGen/DAGISelEmitter.cpp index 8632bc5..89b41a4 100644 --- a/utils/TableGen/DAGISelEmitter.cpp +++ b/utils/TableGen/DAGISelEmitter.cpp @@ -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 @@ static bool PatternHasProperty(TreePatternNode *N, SDNP Property, 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 @@ OS << " unsigned NumKilled = ISelKilled.size();\n"; 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) { |