Skip to content

Commit

Permalink
Change ComplexPattern handling to push the node being matched as
Browse files Browse the repository at this point in the history
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.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@96824 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
lattner committed Feb 22, 2010
1 parent 4642ad3 commit 20df242
Showing 1 changed file with 13 additions and 21 deletions.
34 changes: 13 additions & 21 deletions utils/TableGen/DAGISelMatcherGen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -259,8 +259,15 @@ void MatcherGen::EmitLeafMatchCode(const TreePatternNode *N) {
}
}

// 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.
Expand Down Expand Up @@ -442,26 +449,9 @@ void MatcherGen::EmitMatchCode(const TreePatternNode *N,
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
Expand Down Expand Up @@ -503,8 +493,10 @@ void MatcherGen::EmitResultOfNamedOperand(const TreePatternNode *N,
// 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;
}

Expand Down

0 comments on commit 20df242

Please sign in to comment.