diff options
author | Chris Lattner <sabre@nondot.org> | 2010-02-17 06:08:25 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2010-02-17 06:08:25 +0000 |
commit | e2eead8ea7ca1d881eae547a44ae393b1848aac6 (patch) | |
tree | 704a9678c2eec79446263d8c244211567463ddc2 /utils | |
parent | 52b513d6cd99ed47eae70b33b3f7425b6a36e425 (diff) | |
download | external_llvm-e2eead8ea7ca1d881eae547a44ae393b1848aac6.zip external_llvm-e2eead8ea7ca1d881eae547a44ae393b1848aac6.tar.gz external_llvm-e2eead8ea7ca1d881eae547a44ae393b1848aac6.tar.bz2 |
properly record chain inputs to complex patterns,
resolving a fixme.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@96457 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils')
-rw-r--r-- | utils/TableGen/DAGISelMatcherGen.cpp | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/utils/TableGen/DAGISelMatcherGen.cpp b/utils/TableGen/DAGISelMatcherGen.cpp index b104660..e2ffb8e 100644 --- a/utils/TableGen/DAGISelMatcherGen.cpp +++ b/utils/TableGen/DAGISelMatcherGen.cpp @@ -155,7 +155,18 @@ void MatcherGen::EmitLeafMatchCode(const TreePatternNode *N) { // Handle complex pattern. const ComplexPattern &CP = CGP.getComplexPattern(LeafRec); - return AddMatcherNode(new CheckComplexPatMatcherNode(CP)); + AddMatcherNode(new CheckComplexPatMatcherNode(CP)); + + // 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. + if (CP.hasProperty(SDNPHasChain)) { + // It is the last operand recorded. + assert(NextRecordedOperandNo > 1 && + "Should have recorded input/result chains at least!"); + InputChains.push_back(NextRecordedOperandNo-1); + } + return; } errs() << "Unknown leaf kind: " << *N << "\n"; @@ -203,9 +214,6 @@ void MatcherGen::EmitOperatorMatchCode(const TreePatternNode *N, // the child numbers of the node are all offset by one. unsigned OpNo = 0; if (N->NodeHasProperty(SDNPHasChain, CGP)) { - // FIXME: Not correct for complex patterns, they need to push their own - // *matched* input chain. - // Record the input chain, which is always input #0 of the SDNode. AddMatcherNode(new MoveChildMatcherNode(0)); AddMatcherNode(new RecordMatcherNode("'" + N->getOperator()->getName() + @@ -222,8 +230,7 @@ void MatcherGen::EmitOperatorMatchCode(const TreePatternNode *N, // happen if there were an intermediate node between the indbr and load, for // example. - // FIXME: Emit "lastchain.getNode() == CurrentNode || - // IsChainCompatible(lastchain.getNode(), CurrentNode)". + // FIXME: Emit "IsChainCompatible(lastchain.getNode(), CurrentNode)". // Rename IsChainCompatible -> IsChainUnreachable, add comment about // complexity. |