fix the matcher in the presence of multiple scopes: we need to save
authorChris Lattner <sabre@nondot.org>
Fri, 26 Feb 2010 07:28:20 +0000 (07:28 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 26 Feb 2010 07:28:20 +0000 (07:28 +0000)
and restore the entire matcher stack by value.  This is because children
we're testing could do moveparent or other things besides just
scribbling on additions to the stack.

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

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