From 9f960c2d3aa9eaa404530da341f30c81d61de6a0 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Fri, 26 Feb 2010 07:28:20 +0000 Subject: [PATCH] fix the matcher in the presence of multiple scopes: we need to save 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. llvm-svn: 97212 --- llvm/include/llvm/CodeGen/DAGISelHeader.h | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/llvm/include/llvm/CodeGen/DAGISelHeader.h b/llvm/include/llvm/CodeGen/DAGISelHeader.h index 003caf1b9eb9..67b4155cf4bb 100644 --- a/llvm/include/llvm/CodeGen/DAGISelHeader.h +++ b/llvm/include/llvm/CodeGen/DAGISelHeader.h @@ -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 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