From 53a2f60062500a9be3fd73b401712568e2bb01f5 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Tue, 16 Feb 2010 23:16:25 +0000 Subject: [PATCH] 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 --- utils/TableGen/DAGISelMatcherGen.cpp | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/utils/TableGen/DAGISelMatcherGen.cpp b/utils/TableGen/DAGISelMatcherGen.cpp index d32d3a7b132..e622eecd3c2 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