Start parsing node transformation information

llvm-svn: 23337
This commit is contained in:
Chris Lattner 2005-09-13 21:51:00 +00:00
parent ae939eb6bb
commit 2617de498d
2 changed files with 46 additions and 6 deletions

View File

@ -202,7 +202,9 @@ void TreePatternNode::print(std::ostream &OS) const {
} }
if (!PredicateFn.empty()) if (!PredicateFn.empty())
OS << "<<" << PredicateFn << ">>"; OS << "<<P:" << PredicateFn << ">>";
if (!TransformFn.empty())
OS << "<<X:" << TransformFn << ">>";
if (!getName().empty()) if (!getName().empty())
OS << ":$" << getName(); OS << ":$" << getName();
@ -227,6 +229,7 @@ TreePatternNode *TreePatternNode::clone() const {
New->setName(getName()); New->setName(getName());
New->setType(getType()); New->setType(getType());
New->setPredicateFn(getPredicateFn()); New->setPredicateFn(getPredicateFn());
New->setTransformFn(getTransformFn());
return New; return New;
} }
@ -494,6 +497,35 @@ void DAGISelEmitter::ParseNodeInfo() {
} }
} }
/// ParseNodeTransforms - Parse all SDNodeXForm instances into the SDNodeXForms
/// map, and emit them to the file as functions.
void DAGISelEmitter::ParseNodeTransforms(std::ostream &OS) {
OS << "\n// Node transformations.\n";
std::vector<Record*> Xforms = Records.getAllDerivedDefinitions("SDNodeXForm");
while (!Xforms.empty()) {
Record *XFormNode = Xforms.back();
Record *SDNode = XFormNode->getValueAsDef("Opcode");
std::string Code = XFormNode->getValueAsCode("XFormFunction");
SDNodeXForms.insert(std::make_pair(XFormNode,
std::make_pair(SDNode, Code)));
if (!Code.empty()) {
std::string ClassName = getSDNodeInfo(SDNode).getSDClassName();
const char *C2 = ClassName == "SDNode" ? "N" : "inN";
OS << "static inline SDOperand Transform_" << XFormNode->getName()
<< "(SDNode *" << C2 << ") {\n";
if (ClassName != "SDNode")
OS << " " << ClassName << " *N = cast<" << ClassName << ">(inN);\n";
OS << Code << "\n}\n";
}
Xforms.pop_back();
}
}
/// ParseAndResolvePatternFragments - Parse all of the PatFrag definitions in /// ParseAndResolvePatternFragments - Parse all of the PatFrag definitions in
/// the .td file, building up the PatternFragments map. After we've collected /// the .td file, building up the PatternFragments map. After we've collected
/// them all, inline fragments together as necessary, so that there are no /// them all, inline fragments together as necessary, so that there are no
@ -546,9 +578,8 @@ void DAGISelEmitter::ParseAndResolvePatternFragments(std::ostream &OS) {
// If there is a code init for this fragment, emit the predicate code and // If there is a code init for this fragment, emit the predicate code and
// keep track of the fact that this fragment uses it. // keep track of the fact that this fragment uses it.
CodeInit *CI = std::string Code = Fragments[i]->getValueAsCode("Predicate");
dynamic_cast<CodeInit*>(Fragments[i]->getValueInit("Predicate")); if (!Code.empty()) {
if (!CI->getValue().empty()) {
assert(!P->getOnlyTree()->isLeaf() && "Can't be a leaf!"); assert(!P->getOnlyTree()->isLeaf() && "Can't be a leaf!");
std::string ClassName = std::string ClassName =
getSDNodeInfo(P->getOnlyTree()->getOperator()).getSDClassName(); getSDNodeInfo(P->getOnlyTree()->getOperator()).getSDClassName();
@ -558,7 +589,7 @@ void DAGISelEmitter::ParseAndResolvePatternFragments(std::ostream &OS) {
<< "(SDNode *" << C2 << ") {\n"; << "(SDNode *" << C2 << ") {\n";
if (ClassName != "SDNode") if (ClassName != "SDNode")
OS << " " << ClassName << " *N = cast<" << ClassName << ">(inN);\n"; OS << " " << ClassName << " *N = cast<" << ClassName << ">(inN);\n";
OS << CI->getValue() << "\n}\n"; OS << Code << "\n}\n";
P->getOnlyTree()->setPredicateFn("Predicate_"+Fragments[i]->getName()); P->getOnlyTree()->setPredicateFn("Predicate_"+Fragments[i]->getName());
} }
} }
@ -657,12 +688,12 @@ void DAGISelEmitter::EmitInstructionSelector(std::ostream &OS) {
<< "}\n"; << "}\n";
} }
void DAGISelEmitter::run(std::ostream &OS) { void DAGISelEmitter::run(std::ostream &OS) {
EmitSourceFileHeader("DAG Instruction Selector for the " + Target.getName() + EmitSourceFileHeader("DAG Instruction Selector for the " + Target.getName() +
" target", OS); " target", OS);
ParseNodeInfo(); ParseNodeInfo();
ParseNodeTransforms(OS);
ParseAndResolvePatternFragments(OS); ParseAndResolvePatternFragments(OS);
ParseAndResolveInstructions(); ParseAndResolveInstructions();

View File

@ -120,6 +120,10 @@ namespace llvm {
/// for a match. If this string is empty, no predicate is involved. /// for a match. If this string is empty, no predicate is involved.
std::string PredicateFn; std::string PredicateFn;
/// TransformFn - The transformation function to execute on this node before
/// it can be substituted into the resulting instruction on a pattern match.
std::string TransformFn;
std::vector<TreePatternNode*> Children; std::vector<TreePatternNode*> Children;
public: public:
TreePatternNode(Record *Op, const std::vector<TreePatternNode*> &Ch) TreePatternNode(Record *Op, const std::vector<TreePatternNode*> &Ch)
@ -147,6 +151,9 @@ namespace llvm {
const std::string &getPredicateFn() const { return PredicateFn; } const std::string &getPredicateFn() const { return PredicateFn; }
void setPredicateFn(const std::string &Fn) { PredicateFn = Fn; } void setPredicateFn(const std::string &Fn) { PredicateFn = Fn; }
const std::string &getTransformFn() const { return TransformFn; }
void setTransformFn(const std::string &Fn) { TransformFn = Fn; }
void print(std::ostream &OS) const; void print(std::ostream &OS) const;
void dump() const; void dump() const;
@ -276,6 +283,7 @@ class DAGISelEmitter : public TableGenBackend {
CodeGenTarget Target; CodeGenTarget Target;
std::map<Record*, SDNodeInfo> SDNodes; std::map<Record*, SDNodeInfo> SDNodes;
std::map<Record*, std::pair<Record*, std::string> > SDNodeXForms;
std::map<Record*, TreePattern*> PatternFragments; std::map<Record*, TreePattern*> PatternFragments;
std::vector<TreePattern*> Instructions; std::vector<TreePattern*> Instructions;
public: public:
@ -296,6 +304,7 @@ public:
private: private:
void ParseNodeInfo(); void ParseNodeInfo();
void ParseNodeTransforms(std::ostream &OS);
void ParseAndResolvePatternFragments(std::ostream &OS); void ParseAndResolvePatternFragments(std::ostream &OS);
void ParseAndResolveInstructions(); void ParseAndResolveInstructions();
void EmitInstructionSelector(std::ostream &OS); void EmitInstructionSelector(std::ostream &OS);