diff options
author | Chris Lattner <sabre@nondot.org> | 2010-02-16 23:16:25 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2010-02-16 23:16:25 +0000 |
commit | 53a2f60062500a9be3fd73b401712568e2bb01f5 (patch) | |
tree | c0c19469a8452ed8c72cdaee9a20fffa8f34522a | |
parent | 05446e7d47294a91c0af4b9220c64fb355e8d7e8 (diff) | |
download | external_llvm-53a2f60062500a9be3fd73b401712568e2bb01f5.zip external_llvm-53a2f60062500a9be3fd73b401712568e2bb01f5.tar.gz external_llvm-53a2f60062500a9be3fd73b401712568e2bb01f5.tar.bz2 |
complex patterns don't get 'record' nodes, they implicitly
record all their results.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@96412 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | utils/TableGen/DAGISelMatcherGen.cpp | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/utils/TableGen/DAGISelMatcherGen.cpp b/utils/TableGen/DAGISelMatcherGen.cpp index d32d3a7..e622eec 100644 --- a/utils/TableGen/DAGISelMatcherGen.cpp +++ b/utils/TableGen/DAGISelMatcherGen.cpp @@ -137,6 +137,11 @@ void MatcherGen::EmitLeafMatchCode(const TreePatternNode *N) { return AddMatcherNode(new CheckCondCodeMatcherNode(LeafRec->getName())); if (LeafRec->isSubClassOf("ComplexPattern")) { + if (!N->getName().empty()) { + errs() << "We expect complex pattern uses to have names: " << *N << "\n"; + exit(1); + } + // Handle complex pattern. const ComplexPattern &CP = CGP.getComplexPattern(LeafRec); return AddMatcherNode(new CheckComplexPatMatcherNode(CP)); @@ -236,6 +241,8 @@ void MatcherGen::EmitOperatorMatchCode(const TreePatternNode *N, AddMatcherNode(new CheckFoldableChainNodeMatcherNode()); } } + + // FIXME: Need to generate IsChainCompatible checks. for (unsigned i = 0, e = N->getNumChildren(); i != e; ++i, ++OpNo) { // Get the code suitable for matching this child. Move to the child, check @@ -265,7 +272,19 @@ void MatcherGen::EmitMatchCode(const TreePatternNode *N, unsigned &VarMapEntry = VariableMap[N->getName()]; if (VarMapEntry == 0) { VarMapEntry = ++NextRecordedOperandNo; - AddMatcherNode(new RecordMatcherNode()); + + // 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 *AM = N->getComplexPatternInfo(CGP)) { + // Record the right number of operands. + // FIXME: Does this include chain? + VarMapEntry += AM->getNumOperands()-1; + } else { + // If it is a normal named node, we must emit a 'Record' opcode. + AddMatcherNode(new RecordMatcherNode()); + } + } 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 |