diff options
author | Evan Cheng <evan.cheng@apple.com> | 2006-03-21 20:44:17 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2006-03-21 20:44:17 +0000 |
commit | 3a7a14b0ae08ae318ace037807577fc273a91639 (patch) | |
tree | 16029a7243d228214a6637f3934648948f2dc5a8 /utils | |
parent | 384504cea6c392125a2318d8bbb7f25aa0bbff7e (diff) | |
download | external_llvm-3a7a14b0ae08ae318ace037807577fc273a91639.zip external_llvm-3a7a14b0ae08ae318ace037807577fc273a91639.tar.gz external_llvm-3a7a14b0ae08ae318ace037807577fc273a91639.tar.bz2 |
Don't forget to promote xform function to an explicit node for def : Pat<>
patterns.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@26929 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils')
-rw-r--r-- | utils/TableGen/DAGISelEmitter.cpp | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/utils/TableGen/DAGISelEmitter.cpp b/utils/TableGen/DAGISelEmitter.cpp index dc170a5..ae2fcc7 100644 --- a/utils/TableGen/DAGISelEmitter.cpp +++ b/utils/TableGen/DAGISelEmitter.cpp @@ -1446,6 +1446,25 @@ void DAGISelEmitter::ParsePatterns() { Result->error("Cannot handle instructions producing instructions " "with temporaries yet!"); + // Promote the xform function to be an explicit node if set. + std::vector<TreePatternNode*> ResultNodeOperands; + TreePatternNode *DstPattern = Result->getOnlyTree(); + for (unsigned ii = 0, ee = DstPattern->getNumChildren(); ii != ee; ++ii) { + TreePatternNode *OpNode = DstPattern->getChild(ii); + if (Record *Xform = OpNode->getTransformFn()) { + OpNode->setTransformFn(0); + std::vector<TreePatternNode*> Children; + Children.push_back(OpNode); + OpNode = new TreePatternNode(Xform, Children); + } + ResultNodeOperands.push_back(OpNode); + } + DstPattern = new TreePatternNode(Result->getOnlyTree()->getOperator(), + ResultNodeOperands); + DstPattern->setTypes(Result->getOnlyTree()->getExtTypes()); + TreePattern Temp(Result->getRecord(), DstPattern, false, *this); + Temp.InferAllTypes(); + std::string Reason; if (!Pattern->getOnlyTree()->canPatternMatch(Reason, *this)) Pattern->error("Pattern can never match: " + Reason); @@ -1453,7 +1472,7 @@ void DAGISelEmitter::ParsePatterns() { PatternsToMatch. push_back(PatternToMatch(Patterns[i]->getValueAsListInit("Predicates"), Pattern->getOnlyTree(), - Result->getOnlyTree())); + Temp.getOnlyTree())); } } |