Add support for "cast" nodes, which are required when there is not enough information
authorChris Lattner <sabre@nondot.org>
Thu, 7 Aug 2003 19:59:42 +0000 (19:59 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 7 Aug 2003 19:59:42 +0000 (19:59 +0000)
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
utils/TableGen/InstrSelectorEmitter.cpp

index b9f0d6e240d4bffeb3c8d72d6e55580238fb224a..b33888acda3cdea905aa235262e9471fa6b3caaf 100644 (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) {
index b9f0d6e240d4bffeb3c8d72d6e55580238fb224a..b33888acda3cdea905aa235262e9471fa6b3caaf 100644 (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) {