[llvm-commits] CVS: llvm/utils/TableGen/DAGISelEmitter.cpp DAGISelEmitter.h
Chris Lattner
lattner at cs.uiuc.edu
Fri Sep 23 16:17:03 PDT 2005
Changes in directory llvm/utils/TableGen:
DAGISelEmitter.cpp updated: 1.37 -> 1.38
DAGISelEmitter.h updated: 1.23 -> 1.24
---
Log message:
Emit better code (no more copies for var references), and support DAG patterns
(e.g. things like rotates).
---
Diffs of the changes: (+25 -8)
DAGISelEmitter.cpp | 32 ++++++++++++++++++++++++--------
DAGISelEmitter.h | 1 +
2 files changed, 25 insertions(+), 8 deletions(-)
Index: llvm/utils/TableGen/DAGISelEmitter.cpp
diff -u llvm/utils/TableGen/DAGISelEmitter.cpp:1.37 llvm/utils/TableGen/DAGISelEmitter.cpp:1.38
--- llvm/utils/TableGen/DAGISelEmitter.cpp:1.37 Fri Sep 23 16:53:45 2005
+++ llvm/utils/TableGen/DAGISelEmitter.cpp Fri Sep 23 18:16:51 2005
@@ -989,7 +989,8 @@
/// if the match fails. At this point, we already know that the opcode for N
/// matches, and the SDNode for the result has the RootName specified name.
void DAGISelEmitter::EmitMatchForPattern(TreePatternNode *N,
- const std::string &RootName,
+ const std::string &RootName,
+ std::map<std::string,std::string> &VarMap,
unsigned PatternNo, std::ostream &OS) {
assert(!N->isLeaf() && "Cannot match against a leaf!");
// Emit code to load the child nodes and match their contents recursively.
@@ -997,12 +998,30 @@
OS << " SDOperand " << RootName << i <<" = " << RootName
<< ".getOperand(" << i << ");\n";
TreePatternNode *Child = N->getChild(i);
+
+ // If this child has a name associated with it, capture it in VarMap. If
+ // we already saw this in the pattern, emit code to verify dagness.
+ if (!Child->getName().empty()) {
+ std::string &VarMapEntry = VarMap[Child->getName()];
+ if (VarMapEntry.empty()) {
+ VarMapEntry = RootName + utostr(i);
+ } else {
+ // If we get here, this is a second reference to a specific name. Since
+ // we already have checked that the first reference is valid, we don't
+ // have to recursively match it, just check that it's the same as the
+ // previously named thing.
+ OS << " if (" << VarMapEntry << " != " << RootName << i
+ << ") goto P" << PatternNo << "Fail;\n";
+ continue;
+ }
+ }
+
if (!Child->isLeaf()) {
// If it's not a leaf, recursively match.
const SDNodeInfo &CInfo = getSDNodeInfo(Child->getOperator());
OS << " if (" << RootName << i << ".getOpcode() != "
<< CInfo.getEnumName() << ") goto P" << PatternNo << "Fail;\n";
- EmitMatchForPattern(Child, RootName + utostr(i), PatternNo, OS);
+ EmitMatchForPattern(Child, RootName + utostr(i), VarMap, PatternNo, OS);
} else {
// Handle leaves of various types.
Init *LeafVal = Child->getLeafValue();
@@ -1019,11 +1038,6 @@
assert(0 && "Unknown leaf type!");
}
}
-
- // If this child has a name associated with it, capture it as a variable.
- if (!Child->getName().empty())
- OS << " SDOperand op" << Child->getName() << " = " << RootName
- << i << ";\n";
}
// If there is a node predicate for this, emit the call.
@@ -1043,7 +1057,9 @@
Pattern.first->print(OS);
OS << "\n";
- EmitMatchForPattern(Pattern.first, "N", PatternNo, OS);
+ // Emit the matcher, capturing named arguments in VariableMap.
+ std::map<std::string,std::string> VariableMap;
+ EmitMatchForPattern(Pattern.first, "N", VariableMap, PatternNo, OS);
OS << " // Emit: ";
Pattern.second->print(OS);
Index: llvm/utils/TableGen/DAGISelEmitter.h
diff -u llvm/utils/TableGen/DAGISelEmitter.h:1.23 llvm/utils/TableGen/DAGISelEmitter.h:1.24
--- llvm/utils/TableGen/DAGISelEmitter.h:1.23 Fri Sep 23 16:33:23 2005
+++ llvm/utils/TableGen/DAGISelEmitter.h Fri Sep 23 18:16:51 2005
@@ -366,6 +366,7 @@
TreePatternNode*> &InstInputs,
std::map<std::string, Record*> &InstResults);
void EmitMatchForPattern(TreePatternNode *N, const std::string &RootName,
+ std::map<std::string,std::string> &VarMap,
unsigned PatternNo, std::ostream &OS);
void EmitCodeForPattern(PatternToMatch &Pattern, std::ostream &OS);
void EmitInstructionSelector(std::ostream &OS);
More information about the llvm-commits
mailing list