aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2003-08-07 19:59:42 +0000
committerChris Lattner <sabre@nondot.org>2003-08-07 19:59:42 +0000
commit90825b4b4b6f98e6723423ac1a26f5174202782f (patch)
tree8ce4837a79aac079ae4dc98c1851170cf78bc73d
parentab05e2aa4cfd1ba326ce218f22448e1173889700 (diff)
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
-rw-r--r--support/tools/TableGen/InstrSelectorEmitter.cpp25
-rw-r--r--utils/TableGen/InstrSelectorEmitter.cpp25
2 files changed, 48 insertions, 2 deletions
diff --git a/support/tools/TableGen/InstrSelectorEmitter.cpp b/support/tools/TableGen/InstrSelectorEmitter.cpp
index b9f0d6e240..b33888acda 100644
--- a/support/tools/TableGen/InstrSelectorEmitter.cpp
+++ b/support/tools/TableGen/InstrSelectorEmitter.cpp
@@ -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) {
diff --git a/utils/TableGen/InstrSelectorEmitter.cpp b/utils/TableGen/InstrSelectorEmitter.cpp
index b9f0d6e240..b33888acda 100644
--- a/utils/TableGen/InstrSelectorEmitter.cpp
+++ b/utils/TableGen/InstrSelectorEmitter.cpp
@@ -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) {