mirror of
https://github.com/RPCSX/llvm.git
synced 2025-02-02 18:42:36 +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 << ")";
|
||||
}
|
||||
|
||||
void TreePatternNode::dump() const { std::cerr << *this; }
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
@ -126,11 +127,33 @@ static MVT::ValueType getIntrinsicType(Record *R) {
|
||||
|
||||
TreePatternNode *Pattern::ParseTreePattern(DagInit *DI) {
|
||||
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))
|
||||
error("Unrecognized node '" + Operator->getName() + "'!");
|
||||
|
||||
const std::vector<Init*> &Args = DI->getArgs();
|
||||
std::vector<TreePatternNode*> Children;
|
||||
|
||||
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 << ")";
|
||||
}
|
||||
|
||||
void TreePatternNode::dump() const { std::cerr << *this; }
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
@ -126,11 +127,33 @@ static MVT::ValueType getIntrinsicType(Record *R) {
|
||||
|
||||
TreePatternNode *Pattern::ParseTreePattern(DagInit *DI) {
|
||||
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))
|
||||
error("Unrecognized node '" + Operator->getName() + "'!");
|
||||
|
||||
const std::vector<Init*> &Args = DI->getArgs();
|
||||
std::vector<TreePatternNode*> Children;
|
||||
|
||||
for (unsigned i = 0, e = Args.size(); i != e; ++i) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user