forked from OSchip/llvm-project
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
This commit is contained in:
parent
528b1465e5
commit
9f960c2d3a
|
@ -283,8 +283,8 @@ struct MatchScope {
|
||||||
/// FailIndex - If this match fails, this is the index to continue with.
|
/// FailIndex - If this match fails, this is the index to continue with.
|
||||||
unsigned FailIndex;
|
unsigned FailIndex;
|
||||||
|
|
||||||
/// NodeStackSize - The size of the node stack when the scope was formed.
|
/// NodeStack - The node stack when the scope was formed.
|
||||||
unsigned NodeStackSize;
|
SmallVector<SDValue, 4> NodeStack;
|
||||||
|
|
||||||
/// NumRecordedNodes - The number of recorded nodes when the scope was formed.
|
/// NumRecordedNodes - The number of recorded nodes when the scope was formed.
|
||||||
unsigned NumRecordedNodes;
|
unsigned NumRecordedNodes;
|
||||||
|
@ -383,7 +383,7 @@ SDNode *SelectCodeCommon(SDNode *NodeToMatch, const unsigned char *MatcherTable,
|
||||||
// to match.
|
// to match.
|
||||||
MatchScope NewEntry;
|
MatchScope NewEntry;
|
||||||
NewEntry.FailIndex = MatcherIndex+NumToSkip;
|
NewEntry.FailIndex = MatcherIndex+NumToSkip;
|
||||||
NewEntry.NodeStackSize = NodeStack.size();
|
NewEntry.NodeStack.append(NodeStack.begin(), NodeStack.end());
|
||||||
NewEntry.NumRecordedNodes = RecordedNodes.size();
|
NewEntry.NumRecordedNodes = RecordedNodes.size();
|
||||||
NewEntry.NumMatchedMemRefs = MatchedMemRefs.size();
|
NewEntry.NumMatchedMemRefs = MatchedMemRefs.size();
|
||||||
NewEntry.InputChain = InputChain;
|
NewEntry.InputChain = InputChain;
|
||||||
|
@ -935,7 +935,8 @@ SDNode *SelectCodeCommon(SDNode *NodeToMatch, const unsigned char *MatcherTable,
|
||||||
// formed.
|
// formed.
|
||||||
MatchScope &LastScope = MatchScopes.back();
|
MatchScope &LastScope = MatchScopes.back();
|
||||||
RecordedNodes.resize(LastScope.NumRecordedNodes);
|
RecordedNodes.resize(LastScope.NumRecordedNodes);
|
||||||
NodeStack.resize(LastScope.NodeStackSize);
|
NodeStack.clear();
|
||||||
|
NodeStack.append(LastScope.NodeStack.begin(), LastScope.NodeStack.end());
|
||||||
N = NodeStack.back();
|
N = NodeStack.back();
|
||||||
|
|
||||||
DEBUG(errs() << " Match failed at index " << MatcherIndex
|
DEBUG(errs() << " Match failed at index " << MatcherIndex
|
||||||
|
|
Loading…
Reference in New Issue