properly record chain inputs to complex patterns,
authorChris Lattner <sabre@nondot.org>
Wed, 17 Feb 2010 06:08:25 +0000 (06:08 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 17 Feb 2010 06:08:25 +0000 (06:08 +0000)
resolving a fixme.

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

utils/TableGen/DAGISelMatcherGen.cpp

index b104660cb00907b4c50163afc2d90f6ef59bda28..e2ffb8e7171dac7a66cfea42797e1ac0bf26d8ce 100644 (file)
@@ -155,7 +155,18 @@ void MatcherGen::EmitLeafMatchCode(const TreePatternNode *N) {
     
     // Handle complex pattern.
     const ComplexPattern &CP = CGP.getComplexPattern(LeafRec);
-    return AddMatcherNode(new CheckComplexPatMatcherNode(CP));
+    AddMatcherNode(new CheckComplexPatMatcherNode(CP));
+    
+    // If the complex pattern has a chain, then we need to keep track of the
+    // fact that we just recorded a chain input.  The chain input will be
+    // matched as the last operand of the predicate if it was successful.
+    if (CP.hasProperty(SDNPHasChain)) {
+      // It is the last operand recorded.
+      assert(NextRecordedOperandNo > 1 &&
+             "Should have recorded input/result chains at least!");
+      InputChains.push_back(NextRecordedOperandNo-1);
+    }
+    return;
   }
   
   errs() << "Unknown leaf kind: " << *N << "\n";
@@ -203,9 +214,6 @@ void MatcherGen::EmitOperatorMatchCode(const TreePatternNode *N,
   // the child numbers of the node are all offset by one.
   unsigned OpNo = 0;
   if (N->NodeHasProperty(SDNPHasChain, CGP)) {
-    // FIXME: Not correct for complex patterns, they need to push their own
-    // *matched* input chain.
-    
     // Record the input chain, which is always input #0 of the SDNode.
     AddMatcherNode(new MoveChildMatcherNode(0));
     AddMatcherNode(new RecordMatcherNode("'" + N->getOperator()->getName() +
@@ -222,8 +230,7 @@ void MatcherGen::EmitOperatorMatchCode(const TreePatternNode *N,
     // happen if there were an intermediate node between the indbr and load, for
     // example.
     
-    // FIXME: Emit "lastchain.getNode() == CurrentNode ||
-    //               IsChainCompatible(lastchain.getNode(), CurrentNode)".
+    // FIXME: Emit "IsChainCompatible(lastchain.getNode(), CurrentNode)".
     // Rename IsChainCompatible -> IsChainUnreachable, add comment about
     // complexity.