[llvm-commits] [llvm] r96824 - /llvm/trunk/utils/TableGen/DAGISelMatcherGen.cpp

Chris Lattner sabre at nondot.org
Mon Feb 22 15:33:44 PST 2010


Author: lattner
Date: Mon Feb 22 17:33:44 2010
New Revision: 96824

URL: http://llvm.org/viewvc/llvm-project?rev=96824&view=rev
Log:
Change ComplexPattern handling to push the node being matched as
well as the operands produced when the pattern is matched.  This
allows CheckSame to work correctly when matching replicated 
names involving ComplexPatterns.  This fixes a bunch of MSP430 
failures, we're down to 13 failures, two of which are
due to a sched bug.

Modified:
    llvm/trunk/utils/TableGen/DAGISelMatcherGen.cpp

Modified: llvm/trunk/utils/TableGen/DAGISelMatcherGen.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/DAGISelMatcherGen.cpp?rev=96824&r1=96823&r2=96824&view=diff
==============================================================================
--- llvm/trunk/utils/TableGen/DAGISelMatcherGen.cpp (original)
+++ llvm/trunk/utils/TableGen/DAGISelMatcherGen.cpp Mon Feb 22 17:33:44 2010
@@ -259,8 +259,15 @@
       }
     }
     
+    // Emit a CheckComplexPat operation, which does the match (aborting if it
+    // fails) and pushes the matched operands onto the recorded nodes list.
     AddMatcherNode(new CheckComplexPatMatcherNode(CP));
     
+    // Record the right number of operands.
+    NextRecordedOperandNo += CP.getNumOperands();
+    if (CP.hasProperty(SDNPHasChain))
+      ++NextRecordedOperandNo; // Chained node operand.
+    
     // 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.
@@ -442,26 +449,9 @@
   if (!N->getName().empty()) {
     unsigned &VarMapEntry = VariableMap[N->getName()];
     if (VarMapEntry == 0) {
-      VarMapEntry = NextRecordedOperandNo+1;
-      
-      unsigned NumRecorded;
-      
-      // If this is a complex pattern, the match operation for it will
-      // implicitly record all of the outputs of it (which may be more than
-      // one).
-      if (const ComplexPattern *CP = N->getComplexPatternInfo(CGP)) {
-        // Record the right number of operands.
-        NumRecorded = CP->getNumOperands();
-        
-        if (CP->hasProperty(SDNPHasChain))
-          ++NumRecorded; // Chained node operand.
-      } else {
-        // If it is a normal named node, we must emit a 'Record' opcode.
-        AddMatcherNode(new RecordMatcherNode("$" + N->getName()));
-        NumRecorded = 1;
-      }
-      NextRecordedOperandNo += NumRecorded;
-      
+      // If it is a named node, we must emit a 'Record' opcode.
+      VarMapEntry = ++NextRecordedOperandNo;
+      AddMatcherNode(new RecordMatcherNode("$" + N->getName()));
     } else {
       // If we get here, this is a second reference to a specific name.  Since
       // we already have checked that the first reference is valid, we don't
@@ -503,8 +493,10 @@
   // A reference to a complex pattern gets all of the results of the complex
   // pattern's match.
   if (const ComplexPattern *CP = N->getComplexPatternInfo(CGP)) {
+    // The first slot entry is the node itself, the subsequent entries are the
+    // matched values.
     for (unsigned i = 0, e = CP->getNumOperands(); i != e; ++i)
-      ResultOps.push_back(SlotNo+i);
+      ResultOps.push_back(SlotNo+i+1);
     return;
   }
 





More information about the llvm-commits mailing list