Skip to content

Commit

Permalink
First cut at emitting the reducer. This reducer just prints out the p…
Browse files Browse the repository at this point in the history
…atterns

selected, but it seems to work great!


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7709 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
lattner committed Aug 10, 2003
1 parent f8dfa6f commit 6167004
Show file tree
Hide file tree
Showing 2 changed files with 138 additions and 2 deletions.
70 changes: 69 additions & 1 deletion support/tools/TableGen/InstrSelectorEmitter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -774,6 +774,24 @@ void InstrSelectorEmitter::EmitMatchCosters(std::ostream &OS,
}
}

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();
Expand Down Expand Up @@ -832,7 +850,9 @@ void InstrSelectorEmitter::run(std::ostream &OS) {
}
OS << "};\n\n";

// Start emitting the class...
//===--------------------------------------------------------------------===//
// Emit the class definition...
//
OS << "namespace {\n"
<< " class " << Target.getName() << "ISel {\n"
<< " SelectionDAG &DAG;\n"
Expand Down Expand Up @@ -873,6 +893,7 @@ void InstrSelectorEmitter::run(std::ostream &OS) {
<< "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 && "
Expand All @@ -891,6 +912,9 @@ void InstrSelectorEmitter::run(std::ostream &OS) {
<< "// 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;
Expand Down Expand Up @@ -951,5 +975,49 @@ void InstrSelectorEmitter::run(std::ostream &OS) {
}
}
}

//===--------------------------------------------------------------------===//
// 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";
}
}

70 changes: 69 additions & 1 deletion utils/TableGen/InstrSelectorEmitter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -774,6 +774,24 @@ void InstrSelectorEmitter::EmitMatchCosters(std::ostream &OS,
}
}

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();
Expand Down Expand Up @@ -832,7 +850,9 @@ void InstrSelectorEmitter::run(std::ostream &OS) {
}
OS << "};\n\n";

// Start emitting the class...
//===--------------------------------------------------------------------===//
// Emit the class definition...
//
OS << "namespace {\n"
<< " class " << Target.getName() << "ISel {\n"
<< " SelectionDAG &DAG;\n"
Expand Down Expand Up @@ -873,6 +893,7 @@ void InstrSelectorEmitter::run(std::ostream &OS) {
<< "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 && "
Expand All @@ -891,6 +912,9 @@ void InstrSelectorEmitter::run(std::ostream &OS) {
<< "// 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;
Expand Down Expand Up @@ -951,5 +975,49 @@ void InstrSelectorEmitter::run(std::ostream &OS) {
}
}
}

//===--------------------------------------------------------------------===//
// 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";
}
}

0 comments on commit 6167004

Please sign in to comment.