mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-26 13:10:34 +00:00
Implement autopromotion of leaf trees from arguments to nodes of their own,
making it easier to write patterns without lots of extraneous parens git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7714 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
91290d7e9a
commit
990db46e9a
@ -167,19 +167,20 @@ MVT::ValueType Pattern::getIntrinsicType(Record *R) const {
|
|||||||
return MVT::Other;
|
return MVT::Other;
|
||||||
}
|
}
|
||||||
|
|
||||||
throw "Error: Unknown value used: " + R->getName();
|
error("Unknown value used: " + R->getName());
|
||||||
|
return MVT::Other;
|
||||||
}
|
}
|
||||||
|
|
||||||
TreePatternNode *Pattern::ParseTreePattern(DagInit *DI) {
|
TreePatternNode *Pattern::ParseTreePattern(DagInit *Dag) {
|
||||||
Record *Operator = DI->getNodeType();
|
Record *Operator = Dag->getNodeType();
|
||||||
|
|
||||||
if (Operator->isSubClassOf("ValueType")) {
|
if (Operator->isSubClassOf("ValueType")) {
|
||||||
// If the operator is a ValueType, then this must be "type cast" of a leaf
|
// If the operator is a ValueType, then this must be "type cast" of a leaf
|
||||||
// node.
|
// node.
|
||||||
if (DI->getNumArgs() != 1)
|
if (Dag->getNumArgs() != 1)
|
||||||
error("Type cast only valid for a leaf node!");
|
error("Type cast only valid for a leaf node!");
|
||||||
|
|
||||||
Init *Arg = DI->getArg(0);
|
Init *Arg = Dag->getArg(0);
|
||||||
TreePatternNode *New;
|
TreePatternNode *New;
|
||||||
if (DefInit *DI = dynamic_cast<DefInit*>(Arg)) {
|
if (DefInit *DI = dynamic_cast<DefInit*>(Arg)) {
|
||||||
New = new TreePatternNode(DI);
|
New = new TreePatternNode(DI);
|
||||||
@ -200,14 +201,22 @@ TreePatternNode *Pattern::ParseTreePattern(DagInit *DI) {
|
|||||||
|
|
||||||
std::vector<TreePatternNode*> Children;
|
std::vector<TreePatternNode*> Children;
|
||||||
|
|
||||||
for (unsigned i = 0, e = DI->getNumArgs(); i != e; ++i) {
|
for (unsigned i = 0, e = Dag->getNumArgs(); i != e; ++i) {
|
||||||
Init *Arg = DI->getArg(i);
|
Init *Arg = Dag->getArg(i);
|
||||||
if (DagInit *DI = dynamic_cast<DagInit*>(Arg)) {
|
if (DagInit *DI = dynamic_cast<DagInit*>(Arg)) {
|
||||||
Children.push_back(ParseTreePattern(DI));
|
Children.push_back(ParseTreePattern(DI));
|
||||||
} else if (DefInit *DI = dynamic_cast<DefInit*>(Arg)) {
|
} else if (DefInit *DefI = dynamic_cast<DefInit*>(Arg)) {
|
||||||
Children.push_back(new TreePatternNode(DI));
|
Record *R = DefI->getDef();
|
||||||
// If it's a regclass or something else known, set the type.
|
// Direct reference to a leaf DagNode? Turn it into a DagNode if its own.
|
||||||
Children.back()->setType(getIntrinsicType(DI->getDef()));
|
if (R->isSubClassOf("DagNode")) {
|
||||||
|
Dag->setArg(i, new DagInit(R,
|
||||||
|
std::vector<std::pair<Init*, std::string> >()));
|
||||||
|
--i; // Revisit this node...
|
||||||
|
} else {
|
||||||
|
Children.push_back(new TreePatternNode(DefI));
|
||||||
|
// If it's a regclass or something else known, set the type.
|
||||||
|
Children.back()->setType(getIntrinsicType(R));
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
Arg->dump();
|
Arg->dump();
|
||||||
error("Unknown leaf value for tree pattern!");
|
error("Unknown leaf value for tree pattern!");
|
||||||
@ -524,8 +533,15 @@ void InstrSelectorEmitter::CalculateComputableValues() {
|
|||||||
// Loop over all of the patterns, adding them to the ComputableValues map
|
// Loop over all of the patterns, adding them to the ComputableValues map
|
||||||
for (std::map<Record*, Pattern*>::iterator I = Patterns.begin(),
|
for (std::map<Record*, Pattern*>::iterator I = Patterns.begin(),
|
||||||
E = Patterns.end(); I != E; ++I)
|
E = Patterns.end(); I != E; ++I)
|
||||||
if (I->second->isResolved())
|
if (I->second->isResolved()) {
|
||||||
ComputableValues.addPattern(I->second);
|
// We don't want to add patterns like R32 = R32. This is a hack working
|
||||||
|
// around a special case of a general problem, but for now we explicitly
|
||||||
|
// forbid these patterns. They can never match anyway.
|
||||||
|
Pattern *P = I->second;
|
||||||
|
if (!P->getResult() || !P->getTree()->isLeaf() ||
|
||||||
|
P->getResult() != P->getTree()->getValueRecord())
|
||||||
|
ComputableValues.addPattern(P);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
|
@ -619,6 +619,11 @@ public:
|
|||||||
return ArgNames[Num];
|
return ArgNames[Num];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void setArg(unsigned Num, Init *I) {
|
||||||
|
assert(Num < Args.size() && "Arg number out of range!");
|
||||||
|
Args[Num] = I;
|
||||||
|
}
|
||||||
|
|
||||||
virtual void print(std::ostream &OS) const;
|
virtual void print(std::ostream &OS) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -167,19 +167,20 @@ MVT::ValueType Pattern::getIntrinsicType(Record *R) const {
|
|||||||
return MVT::Other;
|
return MVT::Other;
|
||||||
}
|
}
|
||||||
|
|
||||||
throw "Error: Unknown value used: " + R->getName();
|
error("Unknown value used: " + R->getName());
|
||||||
|
return MVT::Other;
|
||||||
}
|
}
|
||||||
|
|
||||||
TreePatternNode *Pattern::ParseTreePattern(DagInit *DI) {
|
TreePatternNode *Pattern::ParseTreePattern(DagInit *Dag) {
|
||||||
Record *Operator = DI->getNodeType();
|
Record *Operator = Dag->getNodeType();
|
||||||
|
|
||||||
if (Operator->isSubClassOf("ValueType")) {
|
if (Operator->isSubClassOf("ValueType")) {
|
||||||
// If the operator is a ValueType, then this must be "type cast" of a leaf
|
// If the operator is a ValueType, then this must be "type cast" of a leaf
|
||||||
// node.
|
// node.
|
||||||
if (DI->getNumArgs() != 1)
|
if (Dag->getNumArgs() != 1)
|
||||||
error("Type cast only valid for a leaf node!");
|
error("Type cast only valid for a leaf node!");
|
||||||
|
|
||||||
Init *Arg = DI->getArg(0);
|
Init *Arg = Dag->getArg(0);
|
||||||
TreePatternNode *New;
|
TreePatternNode *New;
|
||||||
if (DefInit *DI = dynamic_cast<DefInit*>(Arg)) {
|
if (DefInit *DI = dynamic_cast<DefInit*>(Arg)) {
|
||||||
New = new TreePatternNode(DI);
|
New = new TreePatternNode(DI);
|
||||||
@ -200,14 +201,22 @@ TreePatternNode *Pattern::ParseTreePattern(DagInit *DI) {
|
|||||||
|
|
||||||
std::vector<TreePatternNode*> Children;
|
std::vector<TreePatternNode*> Children;
|
||||||
|
|
||||||
for (unsigned i = 0, e = DI->getNumArgs(); i != e; ++i) {
|
for (unsigned i = 0, e = Dag->getNumArgs(); i != e; ++i) {
|
||||||
Init *Arg = DI->getArg(i);
|
Init *Arg = Dag->getArg(i);
|
||||||
if (DagInit *DI = dynamic_cast<DagInit*>(Arg)) {
|
if (DagInit *DI = dynamic_cast<DagInit*>(Arg)) {
|
||||||
Children.push_back(ParseTreePattern(DI));
|
Children.push_back(ParseTreePattern(DI));
|
||||||
} else if (DefInit *DI = dynamic_cast<DefInit*>(Arg)) {
|
} else if (DefInit *DefI = dynamic_cast<DefInit*>(Arg)) {
|
||||||
Children.push_back(new TreePatternNode(DI));
|
Record *R = DefI->getDef();
|
||||||
// If it's a regclass or something else known, set the type.
|
// Direct reference to a leaf DagNode? Turn it into a DagNode if its own.
|
||||||
Children.back()->setType(getIntrinsicType(DI->getDef()));
|
if (R->isSubClassOf("DagNode")) {
|
||||||
|
Dag->setArg(i, new DagInit(R,
|
||||||
|
std::vector<std::pair<Init*, std::string> >()));
|
||||||
|
--i; // Revisit this node...
|
||||||
|
} else {
|
||||||
|
Children.push_back(new TreePatternNode(DefI));
|
||||||
|
// If it's a regclass or something else known, set the type.
|
||||||
|
Children.back()->setType(getIntrinsicType(R));
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
Arg->dump();
|
Arg->dump();
|
||||||
error("Unknown leaf value for tree pattern!");
|
error("Unknown leaf value for tree pattern!");
|
||||||
@ -524,8 +533,15 @@ void InstrSelectorEmitter::CalculateComputableValues() {
|
|||||||
// Loop over all of the patterns, adding them to the ComputableValues map
|
// Loop over all of the patterns, adding them to the ComputableValues map
|
||||||
for (std::map<Record*, Pattern*>::iterator I = Patterns.begin(),
|
for (std::map<Record*, Pattern*>::iterator I = Patterns.begin(),
|
||||||
E = Patterns.end(); I != E; ++I)
|
E = Patterns.end(); I != E; ++I)
|
||||||
if (I->second->isResolved())
|
if (I->second->isResolved()) {
|
||||||
ComputableValues.addPattern(I->second);
|
// We don't want to add patterns like R32 = R32. This is a hack working
|
||||||
|
// around a special case of a general problem, but for now we explicitly
|
||||||
|
// forbid these patterns. They can never match anyway.
|
||||||
|
Pattern *P = I->second;
|
||||||
|
if (!P->getResult() || !P->getTree()->isLeaf() ||
|
||||||
|
P->getResult() != P->getTree()->getValueRecord())
|
||||||
|
ComputableValues.addPattern(P);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
|
@ -619,6 +619,11 @@ public:
|
|||||||
return ArgNames[Num];
|
return ArgNames[Num];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void setArg(unsigned Num, Init *I) {
|
||||||
|
assert(Num < Args.size() && "Arg number out of range!");
|
||||||
|
Args[Num] = I;
|
||||||
|
}
|
||||||
|
|
||||||
virtual void print(std::ostream &OS) const;
|
virtual void print(std::ostream &OS) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user