From 90825b4b4b6f98e6723423ac1a26f5174202782f Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Thu, 7 Aug 2003 19:59:42 +0000 Subject: [PATCH] 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 --- support/tools/TableGen/InstrSelectorEmitter.cpp | 25 ++++++++++++++++++++++++- utils/TableGen/InstrSelectorEmitter.cpp | 25 ++++++++++++++++++++++++- 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/support/tools/TableGen/InstrSelectorEmitter.cpp b/support/tools/TableGen/InstrSelectorEmitter.cpp index b9f0d6e240d..b33888acda3 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 &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(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 &Args = DI->getArgs(); std::vector Children; for (unsigned i = 0, e = Args.size(); i != e; ++i) { diff --git a/utils/TableGen/InstrSelectorEmitter.cpp b/utils/TableGen/InstrSelectorEmitter.cpp index b9f0d6e240d..b33888acda3 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 &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(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 &Args = DI->getArgs(); std::vector Children; for (unsigned i = 0, e = Args.size(); i != e; ++i) { -- 2.11.0