Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(255)

Side by Side Diff: test/cctest/compiler/test-node-algorithm.cc

Issue 426233002: Land the Fan (disabled) (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright 2013 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include <vector>
6
7 #include "src/v8.h"
8
9 #include "graph-tester.h"
10 #include "src/compiler/common-operator.h"
11 #include "src/compiler/generic-node.h"
12 #include "src/compiler/generic-node-inl.h"
13 #include "src/compiler/graph.h"
14 #include "src/compiler/graph-inl.h"
15 #include "src/compiler/graph-visualizer.h"
16 #include "src/compiler/operator.h"
17
18 using namespace v8::internal;
19 using namespace v8::internal::compiler;
20
21 static SimpleOperator dummy_operator(IrOpcode::kParameter, Operator::kNoWrite,
22 0, 0, "dummy");
23
24 class PreNodeVisitor : public NullNodeVisitor {
25 public:
26 GenericGraphVisit::Control Pre(Node* node) {
27 printf("NODE ID: %d\n", node->id());
28 nodes_.push_back(node);
29 return GenericGraphVisit::CONTINUE;
30 }
31 std::vector<Node*> nodes_;
32 };
33
34
35 class PostNodeVisitor : public NullNodeVisitor {
36 public:
37 GenericGraphVisit::Control Post(Node* node) {
38 printf("NODE ID: %d\n", node->id());
39 nodes_.push_back(node);
40 return GenericGraphVisit::CONTINUE;
41 }
42 std::vector<Node*> nodes_;
43 };
44
45
46 TEST(TestUseNodeVisitEmpty) {
47 GraphWithStartNodeTester graph;
48
49 PreNodeVisitor node_visitor;
50 graph.VisitNodeUsesFromStart(&node_visitor);
51
52 CHECK_EQ(1, node_visitor.nodes_.size());
53 }
54
55
56 TEST(TestUseNodePreOrderVisitSimple) {
57 GraphWithStartNodeTester graph;
58 Node* n2 = graph.NewNode(&dummy_operator, graph.start());
59 Node* n3 = graph.NewNode(&dummy_operator, n2);
60 Node* n4 = graph.NewNode(&dummy_operator, n2, n3);
61 Node* n5 = graph.NewNode(&dummy_operator, n4, n2);
62 graph.SetEnd(n5);
63
64 PreNodeVisitor node_visitor;
65 graph.VisitNodeUsesFromStart(&node_visitor);
66
67 CHECK_EQ(5, node_visitor.nodes_.size());
68 CHECK(graph.start()->id() == node_visitor.nodes_[0]->id());
69 CHECK(n2->id() == node_visitor.nodes_[1]->id());
70 CHECK(n3->id() == node_visitor.nodes_[2]->id());
71 CHECK(n4->id() == node_visitor.nodes_[3]->id());
72 CHECK(n5->id() == node_visitor.nodes_[4]->id());
73 }
74
75
76 TEST(TestInputNodePreOrderVisitSimple) {
77 GraphWithStartNodeTester graph;
78 Node* n2 = graph.NewNode(&dummy_operator, graph.start());
79 Node* n3 = graph.NewNode(&dummy_operator, n2);
80 Node* n4 = graph.NewNode(&dummy_operator, n2, n3);
81 Node* n5 = graph.NewNode(&dummy_operator, n4, n2);
82 graph.SetEnd(n5);
83
84 PreNodeVisitor node_visitor;
85 graph.VisitNodeInputsFromEnd(&node_visitor);
86 CHECK_EQ(5, node_visitor.nodes_.size());
87 CHECK(n5->id() == node_visitor.nodes_[0]->id());
88 CHECK(n4->id() == node_visitor.nodes_[1]->id());
89 CHECK(n2->id() == node_visitor.nodes_[2]->id());
90 CHECK(graph.start()->id() == node_visitor.nodes_[3]->id());
91 CHECK(n3->id() == node_visitor.nodes_[4]->id());
92 }
93
94
95 TEST(TestUseNodePostOrderVisitSimple) {
96 GraphWithStartNodeTester graph;
97 Node* n2 = graph.NewNode(&dummy_operator, graph.start());
98 Node* n3 = graph.NewNode(&dummy_operator, graph.start());
99 Node* n4 = graph.NewNode(&dummy_operator, n2);
100 Node* n5 = graph.NewNode(&dummy_operator, n2);
101 Node* n6 = graph.NewNode(&dummy_operator, n2);
102 Node* n7 = graph.NewNode(&dummy_operator, n3);
103 Node* end_dependencies[4] = {n4, n5, n6, n7};
104 Node* n8 = graph.NewNode(&dummy_operator, 4, end_dependencies);
105 graph.SetEnd(n8);
106
107 PostNodeVisitor node_visitor;
108 graph.VisitNodeUsesFromStart(&node_visitor);
109
110 CHECK_EQ(8, node_visitor.nodes_.size());
111 CHECK(graph.end()->id() == node_visitor.nodes_[0]->id());
112 CHECK(n4->id() == node_visitor.nodes_[1]->id());
113 CHECK(n5->id() == node_visitor.nodes_[2]->id());
114 CHECK(n6->id() == node_visitor.nodes_[3]->id());
115 CHECK(n2->id() == node_visitor.nodes_[4]->id());
116 CHECK(n7->id() == node_visitor.nodes_[5]->id());
117 CHECK(n3->id() == node_visitor.nodes_[6]->id());
118 CHECK(graph.start()->id() == node_visitor.nodes_[7]->id());
119 }
120
121
122 TEST(TestUseNodePostOrderVisitLong) {
123 GraphWithStartNodeTester graph;
124 Node* n2 = graph.NewNode(&dummy_operator, graph.start());
125 Node* n3 = graph.NewNode(&dummy_operator, graph.start());
126 Node* n4 = graph.NewNode(&dummy_operator, n2);
127 Node* n5 = graph.NewNode(&dummy_operator, n2);
128 Node* n6 = graph.NewNode(&dummy_operator, n3);
129 Node* n7 = graph.NewNode(&dummy_operator, n3);
130 Node* n8 = graph.NewNode(&dummy_operator, n5);
131 Node* n9 = graph.NewNode(&dummy_operator, n5);
132 Node* n10 = graph.NewNode(&dummy_operator, n9);
133 Node* n11 = graph.NewNode(&dummy_operator, n9);
134 Node* end_dependencies[6] = {n4, n8, n10, n11, n6, n7};
135 Node* n12 = graph.NewNode(&dummy_operator, 6, end_dependencies);
136 graph.SetEnd(n12);
137
138 PostNodeVisitor node_visitor;
139 graph.VisitNodeUsesFromStart(&node_visitor);
140
141 CHECK_EQ(12, node_visitor.nodes_.size());
142 CHECK(graph.end()->id() == node_visitor.nodes_[0]->id());
143 CHECK(n4->id() == node_visitor.nodes_[1]->id());
144 CHECK(n8->id() == node_visitor.nodes_[2]->id());
145 CHECK(n10->id() == node_visitor.nodes_[3]->id());
146 CHECK(n11->id() == node_visitor.nodes_[4]->id());
147 CHECK(n9->id() == node_visitor.nodes_[5]->id());
148 CHECK(n5->id() == node_visitor.nodes_[6]->id());
149 CHECK(n2->id() == node_visitor.nodes_[7]->id());
150 CHECK(n6->id() == node_visitor.nodes_[8]->id());
151 CHECK(n7->id() == node_visitor.nodes_[9]->id());
152 CHECK(n3->id() == node_visitor.nodes_[10]->id());
153 CHECK(graph.start()->id() == node_visitor.nodes_[11]->id());
154 }
155
156
157 TEST(TestUseNodePreOrderVisitCycle) {
158 GraphWithStartNodeTester graph;
159 Node* n0 = graph.start_node();
160 Node* n1 = graph.NewNode(&dummy_operator, n0);
161 Node* n2 = graph.NewNode(&dummy_operator, n1);
162 n0->AppendInput(graph.main_zone(), n2);
163 graph.SetStart(n0);
164 graph.SetEnd(n2);
165
166 PreNodeVisitor node_visitor;
167 graph.VisitNodeUsesFromStart(&node_visitor);
168
169 CHECK_EQ(3, node_visitor.nodes_.size());
170 CHECK(n0->id() == node_visitor.nodes_[0]->id());
171 CHECK(n1->id() == node_visitor.nodes_[1]->id());
172 CHECK(n2->id() == node_visitor.nodes_[2]->id());
173 }
174
175
176 struct ReenterNodeVisitor : NullNodeVisitor {
177 GenericGraphVisit::Control Pre(Node* node) {
178 printf("[%d] PRE NODE: %d\n", static_cast<int>(nodes_.size()), node->id());
179 nodes_.push_back(node->id());
180 int size = nodes_.size();
181 switch (node->id()) {
182 case 0:
183 return size < 6 ?
184 GenericGraphVisit::REENTER : GenericGraphVisit::SKIP;
185 case 1:
186 return size < 4 ?
187 GenericGraphVisit::DEFER : GenericGraphVisit::CONTINUE;
188 default:
189 return GenericGraphVisit::REENTER;
190 }
191 }
192
193 GenericGraphVisit::Control Post(Node* node) {
194 printf("[%d] POST NODE: %d\n", static_cast<int>(nodes_.size()), node->id());
195 nodes_.push_back(-node->id());
196 return node->id() == 4
197 ? GenericGraphVisit::REENTER : GenericGraphVisit::CONTINUE;
198 }
199
200 void PreEdge(Node* from, int index, Node* to) {
201 printf("[%d] PRE EDGE: %d-%d\n",
202 static_cast<int>(edges_.size()), from->id(), to->id());
203 edges_.push_back(std::make_pair(from->id(), to->id()));
204 }
205
206 void PostEdge(Node* from, int index, Node* to) {
207 printf("[%d] POST EDGE: %d-%d\n",
208 static_cast<int>(edges_.size()), from->id(), to->id());
209 edges_.push_back(std::make_pair(-from->id(), -to->id()));
210 }
211
212 std::vector<int> nodes_;
213 std::vector<std::pair<int, int> > edges_;
214 };
215
216
217 TEST(TestUseNodeReenterVisit) {
218 GraphWithStartNodeTester graph;
219 Node* n0 = graph.start_node();
220 Node* n1 = graph.NewNode(&dummy_operator, n0);
221 Node* n2 = graph.NewNode(&dummy_operator, n0);
222 Node* n3 = graph.NewNode(&dummy_operator, n2);
223 Node* n4 = graph.NewNode(&dummy_operator, n0);
224 Node* n5 = graph.NewNode(&dummy_operator, n4);
225 n0->AppendInput(graph.main_zone(), n3);
226 graph.SetStart(n0);
227 graph.SetEnd(n5);
228
229 ReenterNodeVisitor visitor;
230 graph.VisitNodeUsesFromStart(&visitor);
231
232 CHECK_EQ(22, visitor.nodes_.size());
233 CHECK_EQ(24, visitor.edges_.size());
234
235 CHECK(n0->id() == visitor.nodes_[0]);
236 CHECK(n0->id() == visitor.edges_[0].first);
237 CHECK(n1->id() == visitor.edges_[0].second);
238 CHECK(n1->id() == visitor.nodes_[1]);
239 // N1 is deferred.
240 CHECK(-n1->id() == visitor.edges_[1].second);
241 CHECK(-n0->id() == visitor.edges_[1].first);
242 CHECK(n0->id() == visitor.edges_[2].first);
243 CHECK(n2->id() == visitor.edges_[2].second);
244 CHECK(n2->id() == visitor.nodes_[2]);
245 CHECK(n2->id() == visitor.edges_[3].first);
246 CHECK(n3->id() == visitor.edges_[3].second);
247 CHECK(n3->id() == visitor.nodes_[3]);
248 // Circle back to N0, which we may reenter for now.
249 CHECK(n3->id() == visitor.edges_[4].first);
250 CHECK(n0->id() == visitor.edges_[4].second);
251 CHECK(n0->id() == visitor.nodes_[4]);
252 CHECK(n0->id() == visitor.edges_[5].first);
253 CHECK(n1->id() == visitor.edges_[5].second);
254 CHECK(n1->id() == visitor.nodes_[5]);
255 // This time N1 is no longer deferred.
256 CHECK(-n1->id() == visitor.nodes_[6]);
257 CHECK(-n1->id() == visitor.edges_[6].second);
258 CHECK(-n0->id() == visitor.edges_[6].first);
259 CHECK(n0->id() == visitor.edges_[7].first);
260 CHECK(n2->id() == visitor.edges_[7].second);
261 CHECK(n2->id() == visitor.nodes_[7]);
262 CHECK(n2->id() == visitor.edges_[8].first);
263 CHECK(n3->id() == visitor.edges_[8].second);
264 CHECK(n3->id() == visitor.nodes_[8]);
265 CHECK(n3->id() == visitor.edges_[9].first);
266 CHECK(n0->id() == visitor.edges_[9].second);
267 CHECK(n0->id() == visitor.nodes_[9]);
268 // This time we break at N0 and skip it.
269 CHECK(-n0->id() == visitor.edges_[10].second);
270 CHECK(-n3->id() == visitor.edges_[10].first);
271 CHECK(-n3->id() == visitor.nodes_[10]);
272 CHECK(-n3->id() == visitor.edges_[11].second);
273 CHECK(-n2->id() == visitor.edges_[11].first);
274 CHECK(-n2->id() == visitor.nodes_[11]);
275 CHECK(-n2->id() == visitor.edges_[12].second);
276 CHECK(-n0->id() == visitor.edges_[12].first);
277 CHECK(n0->id() == visitor.edges_[13].first);
278 CHECK(n4->id() == visitor.edges_[13].second);
279 CHECK(n4->id() == visitor.nodes_[12]);
280 CHECK(n4->id() == visitor.edges_[14].first);
281 CHECK(n5->id() == visitor.edges_[14].second);
282 CHECK(n5->id() == visitor.nodes_[13]);
283 CHECK(-n5->id() == visitor.nodes_[14]);
284 CHECK(-n5->id() == visitor.edges_[15].second);
285 CHECK(-n4->id() == visitor.edges_[15].first);
286 CHECK(-n4->id() == visitor.nodes_[15]);
287 CHECK(-n4->id() == visitor.edges_[16].second);
288 CHECK(-n0->id() == visitor.edges_[16].first);
289 CHECK(-n0->id() == visitor.nodes_[16]);
290 CHECK(-n0->id() == visitor.edges_[17].second);
291 CHECK(-n3->id() == visitor.edges_[17].first);
292 CHECK(-n3->id() == visitor.nodes_[17]);
293 CHECK(-n3->id() == visitor.edges_[18].second);
294 CHECK(-n2->id() == visitor.edges_[18].first);
295 CHECK(-n2->id() == visitor.nodes_[18]);
296 CHECK(-n2->id() == visitor.edges_[19].second);
297 CHECK(-n0->id() == visitor.edges_[19].first);
298 // N4 may be reentered.
299 CHECK(n0->id() == visitor.edges_[20].first);
300 CHECK(n4->id() == visitor.edges_[20].second);
301 CHECK(n4->id() == visitor.nodes_[19]);
302 CHECK(n4->id() == visitor.edges_[21].first);
303 CHECK(n5->id() == visitor.edges_[21].second);
304 CHECK(-n5->id() == visitor.edges_[22].second);
305 CHECK(-n4->id() == visitor.edges_[22].first);
306 CHECK(-n4->id() == visitor.nodes_[20]);
307 CHECK(-n4->id() == visitor.edges_[23].second);
308 CHECK(-n0->id() == visitor.edges_[23].first);
309 CHECK(-n0->id() == visitor.nodes_[21]);
310 }
311
312
313 TEST(TestPrintNodeGraphToNodeGraphviz) {
314 GraphWithStartNodeTester graph;
315 Node* n2 = graph.NewNode(&dummy_operator, graph.start());
316 Node* n3 = graph.NewNode(&dummy_operator, graph.start());
317 Node* n4 = graph.NewNode(&dummy_operator, n2);
318 Node* n5 = graph.NewNode(&dummy_operator, n2);
319 Node* n6 = graph.NewNode(&dummy_operator, n3);
320 Node* n7 = graph.NewNode(&dummy_operator, n3);
321 Node* n8 = graph.NewNode(&dummy_operator, n5);
322 Node* n9 = graph.NewNode(&dummy_operator, n5);
323 Node* n10 = graph.NewNode(&dummy_operator, n9);
324 Node* n11 = graph.NewNode(&dummy_operator, n9);
325 Node* end_dependencies[6] = {n4, n8, n10, n11, n6, n7};
326 Node* n12 = graph.NewNode(&dummy_operator, 6, end_dependencies);
327 graph.SetEnd(n12);
328
329 OFStream os(stdout);
330 os << AsDOT(graph);
331 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698