1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-21 12:02:58 +02: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)

llvm-svn: 7684
This commit is contained in:
Chris Lattner 2003-08-07 19:59:42 +00:00
parent 6fc628b98f
commit 096a2cc522

View File

@ -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) {