[llvm-commits] CVS: llvm/utils/TableGen/DAGISelEmitter.cpp
Chris Lattner
lattner at cs.uiuc.edu
Sat Jan 28 18:57:50 PST 2006
Changes in directory llvm/utils/TableGen:
DAGISelEmitter.cpp updated: 1.151 -> 1.152
---
Log message:
Split out code generation from analysis from emission
---
Diffs of the changes: (+36 -14)
DAGISelEmitter.cpp | 50 ++++++++++++++++++++++++++++++++++++--------------
1 files changed, 36 insertions(+), 14 deletions(-)
Index: llvm/utils/TableGen/DAGISelEmitter.cpp
diff -u llvm/utils/TableGen/DAGISelEmitter.cpp:1.151 llvm/utils/TableGen/DAGISelEmitter.cpp:1.152
--- llvm/utils/TableGen/DAGISelEmitter.cpp:1.151 Sat Jan 28 20:43:35 2006
+++ llvm/utils/TableGen/DAGISelEmitter.cpp Sat Jan 28 20:57:39 2006
@@ -2647,16 +2647,43 @@
std::stable_sort(Patterns.begin(), Patterns.end(),
PatternSortingPredicate(*this));
- bool mightNotMatch = true;
+ typedef std::vector<std::pair<bool, std::string> > CodeList;
+
+ std::vector<std::pair<PatternToMatch*, CodeList> > CodeForPatterns;
for (unsigned i = 0, e = Patterns.size(); i != e; ++i) {
- PatternToMatch &Pattern = *Patterns[i];
- std::vector<std::pair<bool, std::string> > GeneratedCode;
- EmitCodeForPattern(Pattern, GeneratedCode);
+ CodeList GeneratedCode;
+ EmitCodeForPattern(*Patterns[i], GeneratedCode);
+ CodeForPatterns.push_back(std::make_pair(Patterns[i], GeneratedCode));
+ }
+
+ // Scan the code to see if all of the patterns are reachable and if it is
+ // possible that the last one might not match.
+ bool mightNotMatch = true;
+ for (unsigned i = 0, e = CodeForPatterns.size(); i != e; ++i) {
+ CodeList &GeneratedCode = CodeForPatterns[i].second;
+ mightNotMatch = false;
- static unsigned PatternCount = 0;
- unsigned PatternNo = PatternCount++;
+ for (unsigned j = 0, e = GeneratedCode.size(); j != e; ++j) {
+ if (GeneratedCode[j].first) { // predicate.
+ mightNotMatch = true;
+ break;
+ }
+ }
+
+ // If this pattern definitely matches, and if it isn't the last one, the
+ // patterns after it CANNOT ever match. Error out.
+ if (mightNotMatch == false && i != CodeForPatterns.size()-1) {
+ std::cerr << "Pattern '";
+ CodeForPatterns[i+1].first->getSrcPattern()->print(OS);
+ std::cerr << "' is impossible to select!\n";
+ exit(1);
+ }
+ }
- OS << " { // Pattern #" << PatternNo << ": ";
+ for (unsigned i = 0, e = CodeForPatterns.size(); i != e; ++i) {
+ CodeList &GeneratedCode = CodeForPatterns[i].second;
+ PatternToMatch &Pattern = *CodeForPatterns[i].first;
+ OS << " { // Pattern: ";
Pattern.getSrcPattern()->print(OS);
OS << "\n // Emits: ";
Pattern.getDstPattern()->print(OS);
@@ -2683,15 +2710,10 @@
OS << std::string(Indent-2, ' ') << "}\n";
OS << " }\n";
-
- if (!mightNotMatch && i != Patterns.size()-1) {
- std::cerr << "Pattern "
- << Patterns[i+1]->getDstPattern()->getOperator()->getName()
- << " is impossible to select!\n";
- exit(1);
- }
}
+ // If the last pattern has predicates (which could fail) emit code to catch
+ // the case where nothing handles a pattern.
if (mightNotMatch)
OS << " std::cerr << \"Cannot yet select: \";\n"
<< " N.Val->dump(CurDAG);\n"
More information about the llvm-commits
mailing list