diff options
author | Chris Lattner <sabre@nondot.org> | 2010-02-24 20:15:25 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2010-02-24 20:15:25 +0000 |
commit | 23cfda719e059ce7d761b08fbfb89e676d6c9737 (patch) | |
tree | c621ccf90d7f04d0612aece15a69c1068e923ad2 /utils/TableGen/DAGISelMatcherOpt.cpp | |
parent | d88360495a6eed8853b4eead04e163f3e5aa632f (diff) | |
download | external_llvm-23cfda719e059ce7d761b08fbfb89e676d6c9737.zip external_llvm-23cfda719e059ce7d761b08fbfb89e676d6c9737.tar.gz external_llvm-23cfda719e059ce7d761b08fbfb89e676d6c9737.tar.bz2 |
contract movechild+checktype into a new checkchild node, shrinking the
x86 table by 1200 bytes.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@97053 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils/TableGen/DAGISelMatcherOpt.cpp')
-rw-r--r-- | utils/TableGen/DAGISelMatcherOpt.cpp | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/utils/TableGen/DAGISelMatcherOpt.cpp b/utils/TableGen/DAGISelMatcherOpt.cpp index 408bd63..796b815 100644 --- a/utils/TableGen/DAGISelMatcherOpt.cpp +++ b/utils/TableGen/DAGISelMatcherOpt.cpp @@ -26,12 +26,19 @@ static void ContractNodes(OwningPtr<MatcherNode> &Matcher) { // If we found a movechild node with a node that comes in a 'foochild' form, // transform it. if (MoveChildMatcherNode *MC = dyn_cast<MoveChildMatcherNode>(N)) { - if (RecordMatcherNode *RM = dyn_cast<RecordMatcherNode>(MC->getNext())) { - MatcherNode *New - = new RecordChildMatcherNode(MC->getChildNo(), RM->getWhatFor()); + MatcherNode *New = 0; + if (RecordMatcherNode *RM = dyn_cast<RecordMatcherNode>(MC->getNext())) + New = new RecordChildMatcherNode(MC->getChildNo(), RM->getWhatFor()); + + if (CheckTypeMatcherNode *CT= dyn_cast<CheckTypeMatcherNode>(MC->getNext())) + New = new CheckChildTypeMatcherNode(MC->getChildNo(), CT->getType()); + + if (New) { + // Insert the new node. New->setNext(Matcher.take()); Matcher.reset(New); - MC->setNext(RM->takeNext()); + // Remove the old one. + MC->setNext(MC->getNext()->takeNext()); return ContractNodes(Matcher); } } |