mirror of
https://github.com/RPCSX/llvm.git
synced 2025-02-09 05:57:23 +00:00
Add support for "cast" nodes, which are required when there is not enough information
to infer type type of all nodes, e.g. (ret imm) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7684 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
ab05e2aa4c
commit
90825b4b4b
@ -52,6 +52,7 @@ std::ostream &operator<<(std::ostream &OS, const TreePatternNode &N) {
|
|||||||
}
|
}
|
||||||
return OS << ")";
|
return OS << ")";
|
||||||
}
|
}
|
||||||
|
|
||||||
void TreePatternNode::dump() const { std::cerr << *this; }
|
void TreePatternNode::dump() const { std::cerr << *this; }
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
@ -126,11 +127,33 @@ static MVT::ValueType getIntrinsicType(Record *R) {
|
|||||||
|
|
||||||
TreePatternNode *Pattern::ParseTreePattern(DagInit *DI) {
|
TreePatternNode *Pattern::ParseTreePattern(DagInit *DI) {
|
||||||
Record *Operator = DI->getNodeType();
|
Record *Operator = DI->getNodeType();
|
||||||
|
const std::vector<Init*> &Args = DI->getArgs();
|
||||||
|
|
||||||
|
if (Operator->isSubClassOf("ValueType")) {
|
||||||
|
// If the operator is a ValueType, then this must be "type cast" of a leaf
|
||||||
|
// node.
|
||||||
|
if (Args.size() != 1)
|
||||||
|
error("Type cast only valid for a leaf node!");
|
||||||
|
|
||||||
|
Init *Arg = Args[0];
|
||||||
|
TreePatternNode *New;
|
||||||
|
if (DefInit *DI = dynamic_cast<DefInit*>(Arg)) {
|
||||||
|
New = new TreePatternNode(DI);
|
||||||
|
// If it's a regclass or something else known, set the type.
|
||||||
|
New->setType(getIntrinsicType(DI->getDef()));
|
||||||
|
} else {
|
||||||
|
Arg->dump();
|
||||||
|
error("Unknown leaf value for tree pattern!");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apply the type cast...
|
||||||
|
New->updateNodeType(getValueType(Operator), TheRecord->getName());
|
||||||
|
return New;
|
||||||
|
}
|
||||||
|
|
||||||
if (!ISE.getNodeTypes().count(Operator))
|
if (!ISE.getNodeTypes().count(Operator))
|
||||||
error("Unrecognized node '" + Operator->getName() + "'!");
|
error("Unrecognized node '" + Operator->getName() + "'!");
|
||||||
|
|
||||||
const std::vector<Init*> &Args = DI->getArgs();
|
|
||||||
std::vector<TreePatternNode*> Children;
|
std::vector<TreePatternNode*> Children;
|
||||||
|
|
||||||
for (unsigned i = 0, e = Args.size(); i != e; ++i) {
|
for (unsigned i = 0, e = Args.size(); i != e; ++i) {
|
||||||
|
@ -52,6 +52,7 @@ std::ostream &operator<<(std::ostream &OS, const TreePatternNode &N) {
|
|||||||
}
|
}
|
||||||
return OS << ")";
|
return OS << ")";
|
||||||
}
|
}
|
||||||
|
|
||||||
void TreePatternNode::dump() const { std::cerr << *this; }
|
void TreePatternNode::dump() const { std::cerr << *this; }
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
@ -126,11 +127,33 @@ static MVT::ValueType getIntrinsicType(Record *R) {
|
|||||||
|
|
||||||
TreePatternNode *Pattern::ParseTreePattern(DagInit *DI) {
|
TreePatternNode *Pattern::ParseTreePattern(DagInit *DI) {
|
||||||
Record *Operator = DI->getNodeType();
|
Record *Operator = DI->getNodeType();
|
||||||
|
const std::vector<Init*> &Args = DI->getArgs();
|
||||||
|
|
||||||
|
if (Operator->isSubClassOf("ValueType")) {
|
||||||
|
// If the operator is a ValueType, then this must be "type cast" of a leaf
|
||||||
|
// node.
|
||||||
|
if (Args.size() != 1)
|
||||||
|
error("Type cast only valid for a leaf node!");
|
||||||
|
|
||||||
|
Init *Arg = Args[0];
|
||||||
|
TreePatternNode *New;
|
||||||
|
if (DefInit *DI = dynamic_cast<DefInit*>(Arg)) {
|
||||||
|
New = new TreePatternNode(DI);
|
||||||
|
// If it's a regclass or something else known, set the type.
|
||||||
|
New->setType(getIntrinsicType(DI->getDef()));
|
||||||
|
} else {
|
||||||
|
Arg->dump();
|
||||||
|
error("Unknown leaf value for tree pattern!");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apply the type cast...
|
||||||
|
New->updateNodeType(getValueType(Operator), TheRecord->getName());
|
||||||
|
return New;
|
||||||
|
}
|
||||||
|
|
||||||
if (!ISE.getNodeTypes().count(Operator))
|
if (!ISE.getNodeTypes().count(Operator))
|
||||||
error("Unrecognized node '" + Operator->getName() + "'!");
|
error("Unrecognized node '" + Operator->getName() + "'!");
|
||||||
|
|
||||||
const std::vector<Init*> &Args = DI->getArgs();
|
|
||||||
std::vector<TreePatternNode*> Children;
|
std::vector<TreePatternNode*> Children;
|
||||||
|
|
||||||
for (unsigned i = 0, e = Args.size(); i != e; ++i) {
|
for (unsigned i = 0, e = Args.size(); i != e; ++i) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user