Don't forget to promote xform function to an explicit node for def : Pat<>
authorEvan Cheng <evan.cheng@apple.com>
Tue, 21 Mar 2006 20:44:17 +0000 (20:44 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Tue, 21 Mar 2006 20:44:17 +0000 (20:44 +0000)
patterns.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@26929 91177308-0d34-0410-b5e6-96231b3b80d8

utils/TableGen/DAGISelEmitter.cpp

index dc170a57bcb48d3077798ba2930338d6297a90b3..ae2fcc75400e4fbc2aae3409806d89961a9f98a8 100644 (file)
@@ -1446,6 +1446,25 @@ void DAGISelEmitter::ParsePatterns() {
       Result->error("Cannot handle instructions producing instructions "
                     "with temporaries yet!");
 
+    // Promote the xform function to be an explicit node if set.
+    std::vector<TreePatternNode*> ResultNodeOperands;
+    TreePatternNode *DstPattern = Result->getOnlyTree();
+    for (unsigned ii = 0, ee = DstPattern->getNumChildren(); ii != ee; ++ii) {
+      TreePatternNode *OpNode = DstPattern->getChild(ii);
+      if (Record *Xform = OpNode->getTransformFn()) {
+        OpNode->setTransformFn(0);
+        std::vector<TreePatternNode*> Children;
+        Children.push_back(OpNode);
+        OpNode = new TreePatternNode(Xform, Children);
+      }
+      ResultNodeOperands.push_back(OpNode);
+    }
+    DstPattern = new TreePatternNode(Result->getOnlyTree()->getOperator(),
+                                     ResultNodeOperands);
+    DstPattern->setTypes(Result->getOnlyTree()->getExtTypes());
+    TreePattern Temp(Result->getRecord(), DstPattern, false, *this);
+    Temp.InferAllTypes();
+
     std::string Reason;
     if (!Pattern->getOnlyTree()->canPatternMatch(Reason, *this))
       Pattern->error("Pattern can never match: " + Reason);
@@ -1453,7 +1472,7 @@ void DAGISelEmitter::ParsePatterns() {
     PatternsToMatch.
       push_back(PatternToMatch(Patterns[i]->getValueAsListInit("Predicates"),
                                Pattern->getOnlyTree(),
-                               Result->getOnlyTree()));
+                               Temp.getOnlyTree()));
   }
 }