diff options
| author | Chris Lattner <sabre@nondot.org> | 2010-03-01 02:33:14 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2010-03-01 02:33:14 +0000 |
| commit | db5b73a77fc5a553b11440a28effea62c113297c (patch) | |
| tree | d407f54af8b30c7d6ffccd7bbd777bfff44c08b3 /llvm/utils/TableGen | |
| parent | 4634d9beef1279b9992d9fddec20d5b2ebc1c27c (diff) | |
| download | bcm5719-llvm-db5b73a77fc5a553b11440a28effea62c113297c.tar.gz bcm5719-llvm-db5b73a77fc5a553b11440a28effea62c113297c.zip | |
pull MarkFlagResult out from between an EmitNode/CompleteMatch
pair. This encourages MorphNodeTo formation, this gets us 200
more MorphNodeTo's on X86 and shrinks the table a bit.
llvm-svn: 97434
Diffstat (limited to 'llvm/utils/TableGen')
| -rw-r--r-- | llvm/utils/TableGen/DAGISelMatcherOpt.cpp | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/llvm/utils/TableGen/DAGISelMatcherOpt.cpp b/llvm/utils/TableGen/DAGISelMatcherOpt.cpp index f8dfe6d82c5..5fe21f67389 100644 --- a/llvm/utils/TableGen/DAGISelMatcherOpt.cpp +++ b/llvm/utils/TableGen/DAGISelMatcherOpt.cpp @@ -67,7 +67,23 @@ static void ContractNodes(OwningPtr<Matcher> &MatcherPtr, return ContractNodes(MatcherPtr, CGP); } - // FIXME: Handle OPC_MarkFlagResults. + // Turn EmitNode->MarkFlagResults->CompleteMatch into + // MarkFlagResults->EmitNode->CompleteMatch when we can to encourage + // MorphNodeTo formation. This is safe because MarkFlagResults never refers + // to the root of the pattern. + if (isa<EmitNodeMatcher>(N) && isa<MarkFlagResultsMatcher>(N->getNext()) && + isa<CompleteMatchMatcher>(N->getNext()->getNext())) { + // Unlink the two nodes from the list. + Matcher *EmitNode = MatcherPtr.take(); + Matcher *MFR = EmitNode->takeNext(); + Matcher *Tail = MFR->takeNext(); + + // Relink them. + MatcherPtr.reset(MFR); + MFR->setNext(EmitNode); + EmitNode->setNext(Tail); + return ContractNodes(MatcherPtr, CGP); + } // Turn EmitNode->CompleteMatch into MorphNodeTo if we can. if (EmitNodeMatcher *EN = dyn_cast<EmitNodeMatcher>(N)) |

