fix the matcher in the presence of multiple scopes: we need to save
[oota-llvm.git] / include / llvm / CodeGen / DAGISelHeader.h
index 003caf1b9eb93cb8183ffbb72936dc1930ad4940..67b4155cf4bbf92bf87d8d49c672e833b48f5481 100644 (file)
@@ -283,8 +283,8 @@ struct MatchScope {
   /// FailIndex - If this match fails, this is the index to continue with.
   unsigned FailIndex;
   
-  /// NodeStackSize - The size of the node stack when the scope was formed.
-  unsigned NodeStackSize;
+  /// NodeStack - The node stack when the scope was formed.
+  SmallVector<SDValue, 4> NodeStack;
   
   /// NumRecordedNodes - The number of recorded nodes when the scope was formed.
   unsigned NumRecordedNodes;
@@ -383,7 +383,7 @@ SDNode *SelectCodeCommon(SDNode *NodeToMatch, const unsigned char *MatcherTable,
       // to match.
       MatchScope NewEntry;
       NewEntry.FailIndex = MatcherIndex+NumToSkip;
-      NewEntry.NodeStackSize = NodeStack.size();
+      NewEntry.NodeStack.append(NodeStack.begin(), NodeStack.end());
       NewEntry.NumRecordedNodes = RecordedNodes.size();
       NewEntry.NumMatchedMemRefs = MatchedMemRefs.size();
       NewEntry.InputChain = InputChain;
@@ -935,7 +935,8 @@ SDNode *SelectCodeCommon(SDNode *NodeToMatch, const unsigned char *MatcherTable,
       // formed.
       MatchScope &LastScope = MatchScopes.back();
       RecordedNodes.resize(LastScope.NumRecordedNodes);
-      NodeStack.resize(LastScope.NodeStackSize);
+      NodeStack.clear();
+      NodeStack.append(LastScope.NodeStack.begin(), LastScope.NodeStack.end());
       N = NodeStack.back();
 
       DEBUG(errs() << "  Match failed at index " << MatcherIndex