[llvm-commits] CVS: llvm/utils/TableGen/InstrSelectorEmitter.cpp
Chris Lattner
lattner at cs.uiuc.edu
Sun Aug 10 15:35:01 PDT 2003
Changes in directory llvm/utils/TableGen:
InstrSelectorEmitter.cpp updated: 1.16 -> 1.17
---
Log message:
First cut at emitting the reducer. This reducer just prints out the patterns
selected, but it seems to work great!
---
Diffs of the changes:
Index: llvm/utils/TableGen/InstrSelectorEmitter.cpp
diff -u llvm/utils/TableGen/InstrSelectorEmitter.cpp:1.16 llvm/utils/TableGen/InstrSelectorEmitter.cpp:1.17
--- llvm/utils/TableGen/InstrSelectorEmitter.cpp:1.16 Sun Aug 10 14:50:51 2003
+++ llvm/utils/TableGen/InstrSelectorEmitter.cpp Sun Aug 10 15:34:13 2003
@@ -774,6 +774,24 @@
}
}
+static void ReduceAllOperands(TreePatternNode *N, const std::string &Name,
+ std::vector<std::pair<TreePatternNode*, std::string> > &Operands,
+ std::ostream &OS) {
+ if (!N->isLeaf()) {
+ for (unsigned i = 0, e = N->getNumChildren(); i != e; ++i) {
+ std::string ChildName = Name + "_Op" + utostr(i);
+ OS << " SelectionDAGNode *" << ChildName << " = " << Name
+ << "->getUse(" << i << ");\n";
+ ReduceAllOperands(N->getChild(i), ChildName, Operands, OS);
+ }
+ } else {
+ std::string SlotName = Pattern::getSlotName(N->getValueRecord());
+ OS << " ReducedValue_" << SlotName << " *" << Name << "Val = Reduce_"
+ << SlotName << "(" << Name << ", MBB);\n";
+ Operands.push_back(std::make_pair(N, Name+"Val"));
+ }
+}
+
void InstrSelectorEmitter::run(std::ostream &OS) {
// Type-check all of the node types to ensure we "understand" them.
ReadNodeTypes();
@@ -832,7 +850,9 @@
}
OS << "};\n\n";
- // Start emitting the class...
+ //===--------------------------------------------------------------------===//
+ // Emit the class definition...
+ //
OS << "namespace {\n"
<< " class " << Target.getName() << "ISel {\n"
<< " SelectionDAG &DAG;\n"
@@ -873,6 +893,7 @@
<< "MachineBasicBlock *MBB);\n";
OS << " };\n}\n\n";
+ // Emit the generateCode entry-point...
OS << "void X86ISel::generateCode() {\n"
<< " SelectionDAGNode *Root = DAG.getRoot();\n"
<< " assert(Root->getValueType() == MVT::isVoid && "
@@ -891,6 +912,9 @@
<< "// Matching methods...\n"
<< "//\n\n";
+ //===--------------------------------------------------------------------===//
+ // Emit all of the matcher methods...
+ //
for (PatternOrganizer::iterator I = ComputableValues.begin(),
E = ComputableValues.end(); I != E; ++I) {
const std::string &SlotName = I->first;
@@ -950,6 +974,50 @@
<< "}\n";
}
}
+ }
+
+ //===--------------------------------------------------------------------===//
+ // Emit all of the reducer methods...
+ //
+ OS << "\n\n//===" << std::string(70, '-') << "===//\n"
+ << "// Reducer methods...\n"
+ << "//\n";
+
+ for (PatternOrganizer::iterator I = ComputableValues.begin(),
+ E = ComputableValues.end(); I != E; ++I) {
+ const std::string &SlotName = I->first;
+ OS << "ReducedValue_" << SlotName << " *" << Target.getName()
+ << "ISel::Reduce_" << SlotName
+ << "(SelectionDAGNode *N, MachineBasicBlock *MBB) {\n"
+ << " ReducedValue_" << SlotName << " *Val = N->hasValue<ReducedValue_"
+ << SlotName << ">(" << SlotName << "_Slot);\n"
+ << " if (Val) return Val;\n"
+ << " if (N->getBB()) MBB = N->getBB();\n\n"
+ << " switch (N->getPatternFor(" << SlotName << "_Slot)) {\n";
+
+ // Loop over all of the patterns that can produce a value for this slot...
+ PatternOrganizer::NodesForSlot &NodesForSlot = I->second;
+ for (PatternOrganizer::NodesForSlot::iterator J = NodesForSlot.begin(),
+ E = NodesForSlot.end(); J != E; ++J)
+ for (unsigned i = 0, e = J->second.size(); i != e; ++i) {
+ Pattern *P = J->second[i];
+ OS << " case " << P->getRecord()->getName() << "_Pattern: {\n"
+ << " // " << *P << "\n";
+ // Loop over the operands, reducing them...
+ std::vector<std::pair<TreePatternNode*, std::string> > Operands;
+ ReduceAllOperands(P->getTree(), "N", Operands, OS);
+
+
+ OS << " std::cerr << \" " << P->getRecord()->getName()<< "\\n\";\n";
+ OS << " Val = new ReducedValue_" << SlotName << "(0);\n"
+ << " break;\n"
+ << " }\n";
+ }
+
+
+ OS << " default: assert(0 && \"Unknown " << SlotName << " pattern!\");\n"
+ << " }\n\n N->addValue(Val); // Do not ever recalculate this\n"
+ << " return Val;\n}\n\n";
}
}
More information about the llvm-commits
mailing list