summaryrefslogtreecommitdiff
path: root/utils/TableGen/DAGISelMatcherGen.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2010-02-16 23:16:25 +0000
committerChris Lattner <sabre@nondot.org>2010-02-16 23:16:25 +0000
commit53a2f60062500a9be3fd73b401712568e2bb01f5 (patch)
treec0c19469a8452ed8c72cdaee9a20fffa8f34522a /utils/TableGen/DAGISelMatcherGen.cpp
parent05446e7d47294a91c0af4b9220c64fb355e8d7e8 (diff)
downloadllvm-53a2f60062500a9be3fd73b401712568e2bb01f5.tar.gz
llvm-53a2f60062500a9be3fd73b401712568e2bb01f5.tar.bz2
llvm-53a2f60062500a9be3fd73b401712568e2bb01f5.tar.xz
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
Diffstat (limited to 'utils/TableGen/DAGISelMatcherGen.cpp')
-rw-r--r--utils/TableGen/DAGISelMatcherGen.cpp21
1 files changed, 20 insertions, 1 deletions
diff --git a/utils/TableGen/DAGISelMatcherGen.cpp b/utils/TableGen/DAGISelMatcherGen.cpp
index d32d3a7b13..e622eecd3c 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