blob: d475dad49655df276556633d7909ed3042535ad6 [file] [log] [blame]
Chris Lattner36e646c2010-02-24 07:06:50 +00001//===- DAGISelMatcherOpt.cpp - Optimize a DAG Matcher ---------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file implements the DAG Matcher optimizer.
11//
12//===----------------------------------------------------------------------===//
13
Chris Lattnerddfd5ab2010-02-27 07:49:13 +000014#define DEBUG_TYPE "isel-opt"
Chris Lattner36e646c2010-02-24 07:06:50 +000015#include "DAGISelMatcher.h"
Chris Lattnercd632fb2010-02-25 07:45:24 +000016#include "llvm/ADT/DenseMap.h"
Chris Lattnerddfd5ab2010-02-27 07:49:13 +000017#include "llvm/Support/Debug.h"
18#include "llvm/Support/raw_ostream.h"
Chris Lattnercd632fb2010-02-25 07:45:24 +000019#include <vector>
Chris Lattner36e646c2010-02-24 07:06:50 +000020using namespace llvm;
21
Chris Lattnerf4950d02010-02-27 06:22:57 +000022/// ContractNodes - Turn multiple matcher node patterns like 'MoveChild+Record'
23/// into single compound nodes like RecordChild.
Chris Lattner9a515172010-02-25 02:04:40 +000024static void ContractNodes(OwningPtr<Matcher> &MatcherPtr) {
Chris Lattner3ee1bc42010-02-24 07:31:45 +000025 // If we reached the end of the chain, we're done.
Chris Lattner9a515172010-02-25 02:04:40 +000026 Matcher *N = MatcherPtr.get();
Chris Lattner3ee1bc42010-02-24 07:31:45 +000027 if (N == 0) return;
28
Chris Lattner42363662010-02-25 19:00:39 +000029 // If we have a scope node, walk down all of the children.
30 if (ScopeMatcher *Scope = dyn_cast<ScopeMatcher>(N)) {
31 for (unsigned i = 0, e = Scope->getNumChildren(); i != e; ++i) {
32 OwningPtr<Matcher> Child(Scope->takeChild(i));
33 ContractNodes(Child);
34 Scope->resetChild(i, Child.take());
35 }
36 return;
37 }
Chris Lattner3ee1bc42010-02-24 07:31:45 +000038
Chris Lattner9feb1e32010-02-24 19:52:48 +000039 // If we found a movechild node with a node that comes in a 'foochild' form,
40 // transform it.
Chris Lattner9a515172010-02-25 02:04:40 +000041 if (MoveChildMatcher *MC = dyn_cast<MoveChildMatcher>(N)) {
42 Matcher *New = 0;
43 if (RecordMatcher *RM = dyn_cast<RecordMatcher>(MC->getNext()))
44 New = new RecordChildMatcher(MC->getChildNo(), RM->getWhatFor());
Chris Lattner3c664b32010-02-24 20:15:25 +000045
Chris Lattner9a515172010-02-25 02:04:40 +000046 if (CheckTypeMatcher *CT= dyn_cast<CheckTypeMatcher>(MC->getNext()))
47 New = new CheckChildTypeMatcher(MC->getChildNo(), CT->getType());
Chris Lattner3c664b32010-02-24 20:15:25 +000048
49 if (New) {
50 // Insert the new node.
Chris Lattnerac10e4f2010-02-25 01:56:48 +000051 New->setNext(MatcherPtr.take());
52 MatcherPtr.reset(New);
Chris Lattner3c664b32010-02-24 20:15:25 +000053 // Remove the old one.
54 MC->setNext(MC->getNext()->takeNext());
Chris Lattnerac10e4f2010-02-25 01:56:48 +000055 return ContractNodes(MatcherPtr);
Chris Lattner9feb1e32010-02-24 19:52:48 +000056 }
Chris Lattner3ee1bc42010-02-24 07:31:45 +000057 }
Chris Lattner9feb1e32010-02-24 19:52:48 +000058
Chris Lattner9a515172010-02-25 02:04:40 +000059 if (MoveChildMatcher *MC = dyn_cast<MoveChildMatcher>(N))
60 if (MoveParentMatcher *MP =
61 dyn_cast<MoveParentMatcher>(MC->getNext())) {
Chris Lattnerac10e4f2010-02-25 01:56:48 +000062 MatcherPtr.reset(MP->takeNext());
63 return ContractNodes(MatcherPtr);
Chris Lattner9feb1e32010-02-24 19:52:48 +000064 }
65
66 ContractNodes(N->getNextPtr());
Chris Lattner3ee1bc42010-02-24 07:31:45 +000067}
68
Chris Lattnerf4950d02010-02-27 06:22:57 +000069/// SinkPatternPredicates - Pattern predicates can be checked at any level of
70/// the matching tree. The generator dumps them at the top level of the pattern
71/// though, which prevents factoring from being able to see past them. This
72/// optimization sinks them as far down into the pattern as possible.
73///
74/// Conceptually, we'd like to sink these predicates all the way to the last
75/// matcher predicate in the series. However, it turns out that some
76/// ComplexPatterns have side effects on the graph, so we really don't want to
77/// run a the complex pattern if the pattern predicate will fail. For this
78/// reason, we refuse to sink the pattern predicate past a ComplexPattern.
79///
80static void SinkPatternPredicates(OwningPtr<Matcher> &MatcherPtr) {
81 // Recursively scan for a PatternPredicate.
82 // If we reached the end of the chain, we're done.
83 Matcher *N = MatcherPtr.get();
84 if (N == 0) return;
85
86 // Walk down all members of a scope node.
87 if (ScopeMatcher *Scope = dyn_cast<ScopeMatcher>(N)) {
88 for (unsigned i = 0, e = Scope->getNumChildren(); i != e; ++i) {
89 OwningPtr<Matcher> Child(Scope->takeChild(i));
90 SinkPatternPredicates(Child);
91 Scope->resetChild(i, Child.take());
92 }
93 return;
94 }
95
96 // If this node isn't a CheckPatternPredicateMatcher we keep scanning until
97 // we find one.
98 CheckPatternPredicateMatcher *CPPM =dyn_cast<CheckPatternPredicateMatcher>(N);
99 if (CPPM == 0)
100 return SinkPatternPredicates(N->getNextPtr());
101
102 // Ok, we found one, lets try to sink it. Check if we can sink it past the
103 // next node in the chain. If not, we won't be able to change anything and
104 // might as well bail.
105 if (!CPPM->getNext()->isSafeToReorderWithPatternPredicate())
106 return;
107
108 // Okay, we know we can sink it past at least one node. Unlink it from the
109 // chain and scan for the new insertion point.
110 MatcherPtr.take(); // Don't delete CPPM.
111 MatcherPtr.reset(CPPM->takeNext());
112
113 N = MatcherPtr.get();
114 while (N->getNext()->isSafeToReorderWithPatternPredicate())
115 N = N->getNext();
116
117 // At this point, we want to insert CPPM after N.
118 CPPM->setNext(N->takeNext());
119 N->setNext(CPPM);
120}
121
122/// FactorNodes - Turn matches like this:
123/// Scope
124/// OPC_CheckType i32
125/// ABC
126/// OPC_CheckType i32
127/// XYZ
128/// into:
129/// OPC_CheckType i32
130/// Scope
131/// ABC
132/// XYZ
133///
Chris Lattner9a515172010-02-25 02:04:40 +0000134static void FactorNodes(OwningPtr<Matcher> &MatcherPtr) {
Chris Lattner0acf2ba2010-02-25 01:57:41 +0000135 // If we reached the end of the chain, we're done.
Chris Lattner9a515172010-02-25 02:04:40 +0000136 Matcher *N = MatcherPtr.get();
Chris Lattner0acf2ba2010-02-25 01:57:41 +0000137 if (N == 0) return;
138
139 // If this is not a push node, just scan for one.
Chris Lattner42363662010-02-25 19:00:39 +0000140 ScopeMatcher *Scope = dyn_cast<ScopeMatcher>(N);
141 if (Scope == 0)
Chris Lattner0acf2ba2010-02-25 01:57:41 +0000142 return FactorNodes(N->getNextPtr());
143
Chris Lattner42363662010-02-25 19:00:39 +0000144 // Okay, pull together the children of the scope node into a vector so we can
Chris Lattnercd632fb2010-02-25 07:45:24 +0000145 // inspect it more easily. While we're at it, bucket them up by the hash
146 // code of their first predicate.
Chris Lattner9a515172010-02-25 02:04:40 +0000147 SmallVector<Matcher*, 32> OptionsToMatch;
Chris Lattner0acf2ba2010-02-25 01:57:41 +0000148
Chris Lattner42363662010-02-25 19:00:39 +0000149 for (unsigned i = 0, e = Scope->getNumChildren(); i != e; ++i) {
Chris Lattnercd632fb2010-02-25 07:45:24 +0000150 // Factor the subexpression.
Chris Lattner42363662010-02-25 19:00:39 +0000151 OwningPtr<Matcher> Child(Scope->takeChild(i));
152 FactorNodes(Child);
153
Chris Lattner92a22462010-02-26 08:08:41 +0000154 if (Matcher *N = Child.take())
Chris Lattner42363662010-02-25 19:00:39 +0000155 OptionsToMatch.push_back(N);
Chris Lattnercd632fb2010-02-25 07:45:24 +0000156 }
Chris Lattner0acf2ba2010-02-25 01:57:41 +0000157
Chris Lattnercd632fb2010-02-25 07:45:24 +0000158 SmallVector<Matcher*, 32> NewOptionsToMatch;
159
Chris Lattner92a22462010-02-26 08:08:41 +0000160 // Loop over options to match, merging neighboring patterns with identical
161 // starting nodes into a shared matcher.
Chris Lattnerddfd5ab2010-02-27 07:49:13 +0000162 for (unsigned OptionIdx = 0, e = OptionsToMatch.size(); OptionIdx != e;) {
Chris Lattnercd632fb2010-02-25 07:45:24 +0000163 // Find the set of matchers that start with this node.
Chris Lattnerddfd5ab2010-02-27 07:49:13 +0000164 Matcher *Optn = OptionsToMatch[OptionIdx++];
165
166 if (OptionIdx == e) {
Chris Lattnercd632fb2010-02-25 07:45:24 +0000167 NewOptionsToMatch.push_back(Optn);
168 continue;
169 }
170
Chris Lattnerddfd5ab2010-02-27 07:49:13 +0000171 // See if the next option starts with the same matcher. If the two
172 // neighbors *do* start with the same matcher, we can factor the matcher out
173 // of at least these two patterns. See what the maximal set we can merge
174 // together is.
Chris Lattner92a22462010-02-26 08:08:41 +0000175 SmallVector<Matcher*, 8> EqualMatchers;
176 EqualMatchers.push_back(Optn);
Chris Lattner92a22462010-02-26 08:08:41 +0000177
Chris Lattnerddfd5ab2010-02-27 07:49:13 +0000178 // Factor all of the known-equal matchers after this one into the same
179 // group.
180 while (OptionIdx != e && OptionsToMatch[OptionIdx]->isEqual(Optn))
181 EqualMatchers.push_back(OptionsToMatch[OptionIdx++]);
182
183 // If we found a non-equal matcher, see if it is contradictory with the
184 // current node. If so, we know that the ordering relation between the
185 // current sets of nodes and this node don't matter. Look past it to see if
186 // we can merge anything else into this matching group.
187 unsigned Scan = OptionIdx;
188 while (1) {
189 while (Scan != e && Optn->isContradictory(OptionsToMatch[Scan]))
190 ++Scan;
191
192 // Ok, we found something that isn't known to be contradictory. If it is
193 // equal, we can merge it into the set of nodes to factor, if not, we have
194 // to cease factoring.
195 if (Scan == e || !Optn->isEqual(OptionsToMatch[Scan])) break;
196
197 // If is equal after all, add the option to EqualMatchers and remove it
198 // from OptionsToMatch.
199 EqualMatchers.push_back(OptionsToMatch[Scan]);
200 OptionsToMatch.erase(OptionsToMatch.begin()+Scan);
201 --e;
202 }
203
204 if (Scan != e) {
Chris Lattner086af322010-02-27 08:11:15 +0000205 DEBUG(errs() << "Couldn't merge this:\n";
206 Optn->print(errs(), 4);
207 errs() << "into this:\n";
208 OptionsToMatch[Scan]->print(errs(), 4);
Chris Lattnerddfd5ab2010-02-27 07:49:13 +0000209 if (OptionIdx+1 != e)
Chris Lattner086af322010-02-27 08:11:15 +0000210 OptionsToMatch[Scan+1]->printOne(errs());
Chris Lattnerddfd5ab2010-02-27 07:49:13 +0000211 if (OptionIdx+2 < e)
Chris Lattner086af322010-02-27 08:11:15 +0000212 OptionsToMatch[Scan+2]->printOne(errs());
Chris Lattnerddfd5ab2010-02-27 07:49:13 +0000213 errs() << "\n");
214 }
215
216 // If we only found one option starting with this matcher, no factoring is
217 // possible.
218 if (EqualMatchers.size() == 1) {
219 NewOptionsToMatch.push_back(EqualMatchers[0]);
220 continue;
221 }
Chris Lattner92a22462010-02-26 08:08:41 +0000222
Chris Lattnercd632fb2010-02-25 07:45:24 +0000223 // Factor these checks by pulling the first node off each entry and
Chris Lattnerb0e68102010-02-26 07:36:37 +0000224 // discarding it. Take the first one off the first entry to reuse.
225 Matcher *Shared = Optn;
226 Optn = Optn->takeNext();
227 EqualMatchers[0] = Optn;
228
Chris Lattner92a22462010-02-26 08:08:41 +0000229 // Remove and delete the first node from the other matchers we're factoring.
230 for (unsigned i = 1, e = EqualMatchers.size(); i != e; ++i) {
231 Matcher *Tmp = EqualMatchers[i]->takeNext();
232 delete EqualMatchers[i];
233 EqualMatchers[i] = Tmp;
234 }
Chris Lattnercd632fb2010-02-25 07:45:24 +0000235
Chris Lattnerb0e68102010-02-26 07:36:37 +0000236 Shared->setNext(new ScopeMatcher(&EqualMatchers[0], EqualMatchers.size()));
237
238 // Recursively factor the newly created node.
239 FactorNodes(Shared->getNextPtr());
240
241 NewOptionsToMatch.push_back(Shared);
Chris Lattnercd632fb2010-02-25 07:45:24 +0000242 }
243
244 // Reassemble a new Scope node.
Chris Lattnerb0e68102010-02-26 07:36:37 +0000245 assert(!NewOptionsToMatch.empty() && "where'd all our children go?");
246 if (NewOptionsToMatch.size() == 1)
247 MatcherPtr.reset(NewOptionsToMatch[0]);
248 else {
249 Scope->setNumChildren(NewOptionsToMatch.size());
250 for (unsigned i = 0, e = NewOptionsToMatch.size(); i != e; ++i)
251 Scope->resetChild(i, NewOptionsToMatch[i]);
252 }
Chris Lattner0acf2ba2010-02-25 01:57:41 +0000253}
254
Chris Lattner9a515172010-02-25 02:04:40 +0000255Matcher *llvm::OptimizeMatcher(Matcher *TheMatcher) {
256 OwningPtr<Matcher> MatcherPtr(TheMatcher);
Chris Lattner9feb1e32010-02-24 19:52:48 +0000257 ContractNodes(MatcherPtr);
Chris Lattnerf4950d02010-02-27 06:22:57 +0000258 SinkPatternPredicates(MatcherPtr);
Chris Lattner0acf2ba2010-02-25 01:57:41 +0000259 FactorNodes(MatcherPtr);
Chris Lattner3ee1bc42010-02-24 07:31:45 +0000260 return MatcherPtr.take();
Chris Lattner36e646c2010-02-24 07:06:50 +0000261}