forked from OSchip/llvm-project
Start parsing node transformation information
llvm-svn: 23337
This commit is contained in:
parent
ae939eb6bb
commit
2617de498d
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue