blob: de1c2c02a26eeb9fae63811fa9006b47010f6b1e [file] [log] [blame]
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001// 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 <functional>
6
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00007#include "src/compiler/graph.h"
Ben Murdochb8a8cc12014-11-26 15:28:44 +00008#include "src/compiler/node.h"
9#include "src/compiler/operator.h"
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000010#include "test/cctest/cctest.h"
Ben Murdochb8a8cc12014-11-26 15:28:44 +000011
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000012namespace v8 {
13namespace internal {
14namespace compiler {
Ben Murdochb8a8cc12014-11-26 15:28:44 +000015
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000016#define NONE reinterpret_cast<Node*>(1)
Ben Murdochb8a8cc12014-11-26 15:28:44 +000017
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000018static Operator dummy_operator0(IrOpcode::kParameter, Operator::kNoWrite,
19 "dummy", 0, 0, 0, 1, 0, 0);
20static Operator dummy_operator1(IrOpcode::kParameter, Operator::kNoWrite,
21 "dummy", 1, 0, 0, 1, 0, 0);
22static Operator dummy_operator2(IrOpcode::kParameter, Operator::kNoWrite,
23 "dummy", 2, 0, 0, 1, 0, 0);
24static Operator dummy_operator3(IrOpcode::kParameter, Operator::kNoWrite,
25 "dummy", 3, 0, 0, 1, 0, 0);
26
27#define CHECK_USES(node, ...) \
28 do { \
29 Node* __array[] = {__VA_ARGS__}; \
30 int __size = \
31 __array[0] != NONE ? static_cast<int>(arraysize(__array)) : 0; \
32 CheckUseChain(node, __array, __size); \
33 } while (false)
Ben Murdochb8a8cc12014-11-26 15:28:44 +000034
35
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000036namespace {
37
38typedef std::multiset<Node*, std::less<Node*>> NodeMSet;
Ben Murdochb8a8cc12014-11-26 15:28:44 +000039
40
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000041void CheckUseChain(Node* node, Node** uses, int use_count) {
42 // Check ownership.
43 if (use_count == 1) CHECK(node->OwnedBy(uses[0]));
44 if (use_count > 1) {
45 for (int i = 0; i < use_count; i++) {
46 CHECK(!node->OwnedBy(uses[i]));
47 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000048 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000049
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000050 // Check the self-reported use count.
51 CHECK_EQ(use_count, node->UseCount());
Ben Murdochb8a8cc12014-11-26 15:28:44 +000052
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000053 // Build the expectation set.
54 NodeMSet expect_set;
55 for (int i = 0; i < use_count; i++) {
56 expect_set.insert(uses[i]);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000057 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000058
59 {
60 // Check that iterating over the uses gives the right counts.
61 NodeMSet use_set;
62 for (auto use : node->uses()) {
63 use_set.insert(use);
64 }
65 CHECK(expect_set == use_set);
66 }
67
68 {
69 // Check that iterating over the use edges gives the right counts,
70 // input indices, from(), and to() pointers.
71 NodeMSet use_set;
72 for (auto edge : node->use_edges()) {
73 CHECK_EQ(node, edge.to());
74 CHECK_EQ(node, edge.from()->InputAt(edge.index()));
75 use_set.insert(edge.from());
76 }
77 CHECK(expect_set == use_set);
78 }
79
80 {
81 // Check the use nodes actually have the node as inputs.
82 for (Node* use : node->uses()) {
83 size_t count = 0;
84 for (Node* input : use->inputs()) {
85 if (input == node) count++;
86 }
87 CHECK_EQ(count, expect_set.count(use));
88 }
89 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000090}
91
92
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000093void CheckInputs(Node* node, Node** inputs, int input_count) {
94 CHECK_EQ(input_count, node->InputCount());
95 // Check InputAt().
96 for (int i = 0; i < static_cast<int>(input_count); i++) {
97 CHECK_EQ(inputs[i], node->InputAt(i));
98 }
99
100 // Check input iterator.
101 int index = 0;
102 for (Node* input : node->inputs()) {
103 CHECK_EQ(inputs[index], input);
104 index++;
105 }
106
107 // Check use lists of inputs.
108 for (int i = 0; i < static_cast<int>(input_count); i++) {
109 Node* input = inputs[i];
110 if (!input) continue; // skip null inputs
111 bool found = false;
112 // Check regular use list.
113 for (Node* use : input->uses()) {
114 if (use == node) {
115 found = true;
116 break;
117 }
118 }
119 CHECK(found);
120 int count = 0;
121 // Check use edge list.
122 for (auto edge : input->use_edges()) {
123 if (edge.from() == node && edge.to() == input && edge.index() == i) {
124 count++;
125 }
126 }
127 CHECK_EQ(1, count);
128 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000129}
130
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000131} // namespace
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000132
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000133
134#define CHECK_INPUTS(node, ...) \
135 do { \
136 Node* __array[] = {__VA_ARGS__}; \
137 int __size = \
138 __array[0] != NONE ? static_cast<int>(arraysize(__array)) : 0; \
139 CheckInputs(node, __array, __size); \
140 } while (false)
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000141
142
143TEST(NodeUseIteratorReplaceUses) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000144 Zone zone;
145 Graph graph(&zone);
146 Node* n0 = graph.NewNode(&dummy_operator0);
147 Node* n1 = graph.NewNode(&dummy_operator1, n0);
148 Node* n2 = graph.NewNode(&dummy_operator1, n0);
149 Node* n3 = graph.NewNode(&dummy_operator0);
150
151 CHECK_USES(n0, n1, n2);
152
153 CHECK_INPUTS(n1, n0);
154 CHECK_INPUTS(n2, n0);
155
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000156 n0->ReplaceUses(n3);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000157
158 CHECK_USES(n0, NONE);
159 CHECK_USES(n1, NONE);
160 CHECK_USES(n2, NONE);
161 CHECK_USES(n3, n1, n2);
162
163 CHECK_INPUTS(n1, n3);
164 CHECK_INPUTS(n2, n3);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000165}
166
167
168TEST(NodeUseIteratorReplaceUsesSelf) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000169 Zone zone;
170 Graph graph(&zone);
171 Node* n0 = graph.NewNode(&dummy_operator0);
172 Node* n1 = graph.NewNode(&dummy_operator1, n0);
173
174 CHECK_USES(n0, n1);
175 CHECK_USES(n1, NONE);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000176
177 n1->ReplaceInput(0, n1); // Create self-reference.
178
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000179 CHECK_USES(n0, NONE);
180 CHECK_USES(n1, n1);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000181
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000182 Node* n2 = graph.NewNode(&dummy_operator0);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000183
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000184 n1->ReplaceUses(n2);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000185
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000186 CHECK_USES(n0, NONE);
187 CHECK_USES(n1, NONE);
188 CHECK_USES(n2, n1);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000189}
190
191
192TEST(ReplaceInput) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000193 Zone zone;
194 Graph graph(&zone);
195 Node* n0 = graph.NewNode(&dummy_operator0);
196 Node* n1 = graph.NewNode(&dummy_operator0);
197 Node* n2 = graph.NewNode(&dummy_operator0);
198 Node* n3 = graph.NewNode(&dummy_operator3, n0, n1, n2);
199 Node* n4 = graph.NewNode(&dummy_operator0);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000200
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000201 CHECK_USES(n0, n3);
202 CHECK_USES(n1, n3);
203 CHECK_USES(n2, n3);
204 CHECK_USES(n3, NONE);
205 CHECK_USES(n4, NONE);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000206
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000207 CHECK_INPUTS(n3, n0, n1, n2);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000208
209 n3->ReplaceInput(1, n4);
210
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000211 CHECK_USES(n1, NONE);
212 CHECK_USES(n4, n3);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000213
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000214 CHECK_INPUTS(n3, n0, n4, n2);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000215}
216
217
218TEST(OwnedBy) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000219 Zone zone;
220 Graph graph(&zone);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000221
222 {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000223 Node* n0 = graph.NewNode(&dummy_operator0);
224 Node* n1 = graph.NewNode(&dummy_operator0);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000225
226 CHECK(!n0->OwnedBy(n1));
227 CHECK(!n1->OwnedBy(n0));
228
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000229 Node* n2 = graph.NewNode(&dummy_operator1, n0);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000230 CHECK(n0->OwnedBy(n2));
231 CHECK(!n2->OwnedBy(n0));
232
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000233 Node* n3 = graph.NewNode(&dummy_operator1, n0);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000234 CHECK(!n0->OwnedBy(n2));
235 CHECK(!n0->OwnedBy(n3));
236 CHECK(!n2->OwnedBy(n0));
237 CHECK(!n3->OwnedBy(n0));
238 }
239
240 {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000241 Node* n0 = graph.NewNode(&dummy_operator0);
242 Node* n1 = graph.NewNode(&dummy_operator1, n0);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000243 CHECK(n0->OwnedBy(n1));
244 CHECK(!n1->OwnedBy(n0));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000245 Node* n2 = graph.NewNode(&dummy_operator1, n0);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000246 CHECK(!n0->OwnedBy(n1));
247 CHECK(!n0->OwnedBy(n2));
248 CHECK(!n1->OwnedBy(n0));
249 CHECK(!n1->OwnedBy(n2));
250 CHECK(!n2->OwnedBy(n0));
251 CHECK(!n2->OwnedBy(n1));
252
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000253 Node* n3 = graph.NewNode(&dummy_operator0);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000254 n2->ReplaceInput(0, n3);
255
256 CHECK(n0->OwnedBy(n1));
257 CHECK(!n1->OwnedBy(n0));
258 CHECK(!n1->OwnedBy(n0));
259 CHECK(!n1->OwnedBy(n2));
260 CHECK(!n2->OwnedBy(n0));
261 CHECK(!n2->OwnedBy(n1));
262 CHECK(n3->OwnedBy(n2));
263 CHECK(!n2->OwnedBy(n3));
264 }
265}
266
267
268TEST(Uses) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000269 Zone zone;
270 Graph graph(&zone);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000271
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000272 Node* n0 = graph.NewNode(&dummy_operator0);
273 Node* n1 = graph.NewNode(&dummy_operator1, n0);
274
275 CHECK_USES(n0, n1);
276 CHECK_USES(n1, NONE);
277
278 Node* n2 = graph.NewNode(&dummy_operator1, n0);
279
280 CHECK_USES(n0, n1, n2);
281 CHECK_USES(n2, NONE);
282
283 Node* n3 = graph.NewNode(&dummy_operator1, n0);
284
285 CHECK_USES(n0, n1, n2, n3);
286 CHECK_USES(n3, NONE);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000287}
288
289
290TEST(Inputs) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000291 Zone zone;
292 Graph graph(&zone);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000293
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000294 Node* n0 = graph.NewNode(&dummy_operator0);
295 Node* n1 = graph.NewNode(&dummy_operator1, n0);
296 Node* n2 = graph.NewNode(&dummy_operator1, n0);
297 Node* n3 = graph.NewNode(&dummy_operator3, n0, n1, n2);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000298
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000299 CHECK_INPUTS(n3, n0, n1, n2);
300
301 Node* n4 = graph.NewNode(&dummy_operator3, n0, n1, n2);
302 n3->AppendInput(graph.zone(), n4);
303
304 CHECK_INPUTS(n3, n0, n1, n2, n4);
305 CHECK_USES(n4, n3);
306
307 n3->AppendInput(graph.zone(), n4);
308
309 CHECK_INPUTS(n3, n0, n1, n2, n4, n4);
310 CHECK_USES(n4, n3, n3);
311
312 Node* n5 = graph.NewNode(&dummy_operator1, n4);
313
314 CHECK_USES(n4, n3, n3, n5);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000315}
316
317
318TEST(RemoveInput) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000319 Zone zone;
320 Graph graph(&zone);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000321
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000322 Node* n0 = graph.NewNode(&dummy_operator0);
323 Node* n1 = graph.NewNode(&dummy_operator1, n0);
324 Node* n2 = graph.NewNode(&dummy_operator2, n0, n1);
325
326 CHECK_INPUTS(n0, NONE);
327 CHECK_INPUTS(n1, n0);
328 CHECK_INPUTS(n2, n0, n1);
329 CHECK_USES(n0, n1, n2);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000330
331 n1->RemoveInput(0);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000332 CHECK_INPUTS(n1, NONE);
333 CHECK_USES(n0, n2);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000334
335 n2->RemoveInput(0);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000336 CHECK_INPUTS(n2, n1);
337 CHECK_USES(n0, NONE);
338 CHECK_USES(n1, n2);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000339
340 n2->RemoveInput(0);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000341 CHECK_INPUTS(n2, NONE);
342 CHECK_USES(n0, NONE);
343 CHECK_USES(n1, NONE);
344 CHECK_USES(n2, NONE);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000345}
346
347
348TEST(AppendInputsAndIterator) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000349 Zone zone;
350 Graph graph(&zone);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000351
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000352 Node* n0 = graph.NewNode(&dummy_operator0);
353 Node* n1 = graph.NewNode(&dummy_operator1, n0);
354 Node* n2 = graph.NewNode(&dummy_operator2, n0, n1);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000355
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000356 CHECK_INPUTS(n0, NONE);
357 CHECK_INPUTS(n1, n0);
358 CHECK_INPUTS(n2, n0, n1);
359 CHECK_USES(n0, n1, n2);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000360
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000361 Node* n3 = graph.NewNode(&dummy_operator0);
362
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000363 n2->AppendInput(graph.zone(), n3);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000364
365 CHECK_INPUTS(n2, n0, n1, n3);
366 CHECK_USES(n3, n2);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000367}
368
369
370TEST(NullInputsSimple) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000371 Zone zone;
372 Graph graph(&zone);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000373
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000374 Node* n0 = graph.NewNode(&dummy_operator0);
375 Node* n1 = graph.NewNode(&dummy_operator1, n0);
376 Node* n2 = graph.NewNode(&dummy_operator2, n0, n1);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000377
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000378 CHECK_INPUTS(n0, NONE);
379 CHECK_INPUTS(n1, n0);
380 CHECK_INPUTS(n2, n0, n1);
381 CHECK_USES(n0, n1, n2);
382
383 n2->ReplaceInput(0, nullptr);
384
385 CHECK_INPUTS(n2, NULL, n1);
386
387 CHECK_USES(n0, n1);
388
389 n2->ReplaceInput(1, nullptr);
390
391 CHECK_INPUTS(n2, NULL, NULL);
392
393 CHECK_USES(n1, NONE);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000394}
395
396
397TEST(NullInputsAppended) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000398 Zone zone;
399 Graph graph(&zone);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000400
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000401 Node* n0 = graph.NewNode(&dummy_operator0);
402 Node* n1 = graph.NewNode(&dummy_operator1, n0);
403 Node* n2 = graph.NewNode(&dummy_operator1, n0);
404 Node* n3 = graph.NewNode(&dummy_operator1, n0);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000405 n3->AppendInput(graph.zone(), n1);
406 n3->AppendInput(graph.zone(), n2);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000407
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000408 CHECK_INPUTS(n3, n0, n1, n2);
409 CHECK_USES(n0, n1, n2, n3);
410 CHECK_USES(n1, n3);
411 CHECK_USES(n2, n3);
412
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000413 n3->ReplaceInput(1, NULL);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000414 CHECK_USES(n1, NONE);
415
416 CHECK_INPUTS(n3, n0, NULL, n2);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000417}
418
419
420TEST(ReplaceUsesFromAppendedInputs) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000421 Zone zone;
422 Graph graph(&zone);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000423
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000424 Node* n0 = graph.NewNode(&dummy_operator0);
425 Node* n1 = graph.NewNode(&dummy_operator1, n0);
426 Node* n2 = graph.NewNode(&dummy_operator1, n0);
427 Node* n3 = graph.NewNode(&dummy_operator0);
428
429 CHECK_INPUTS(n2, n0);
430
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000431 n2->AppendInput(graph.zone(), n1);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000432 CHECK_INPUTS(n2, n0, n1);
433 CHECK_USES(n1, n2);
434
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000435 n2->AppendInput(graph.zone(), n0);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000436 CHECK_INPUTS(n2, n0, n1, n0);
437 CHECK_USES(n1, n2);
438 CHECK_USES(n0, n2, n1, n2);
439
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000440 n0->ReplaceUses(n3);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000441
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000442 CHECK_USES(n0, NONE);
443 CHECK_INPUTS(n2, n3, n1, n3);
444 CHECK_USES(n3, n2, n1, n2);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000445}
446
447
448TEST(ReplaceInputMultipleUses) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000449 Zone zone;
450 Graph graph(&zone);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000451
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000452 Node* n0 = graph.NewNode(&dummy_operator0);
453 Node* n1 = graph.NewNode(&dummy_operator0);
454 Node* n2 = graph.NewNode(&dummy_operator1, n0);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000455 n2->ReplaceInput(0, n1);
456 CHECK_EQ(0, n0->UseCount());
457 CHECK_EQ(1, n1->UseCount());
458
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000459 Node* n3 = graph.NewNode(&dummy_operator1, n0);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000460 n3->ReplaceInput(0, n1);
461 CHECK_EQ(0, n0->UseCount());
462 CHECK_EQ(2, n1->UseCount());
463}
464
465
466TEST(TrimInputCountInline) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000467 Zone zone;
468 Graph graph(&zone);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000469
470 {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000471 Node* n0 = graph.NewNode(&dummy_operator0);
472 Node* n1 = graph.NewNode(&dummy_operator1, n0);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000473 n1->TrimInputCount(1);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000474 CHECK_INPUTS(n1, n0);
475 CHECK_USES(n0, n1);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000476 }
477
478 {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000479 Node* n0 = graph.NewNode(&dummy_operator0);
480 Node* n1 = graph.NewNode(&dummy_operator1, n0);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000481 n1->TrimInputCount(0);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000482 CHECK_INPUTS(n1, NONE);
483 CHECK_USES(n0, NONE);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000484 }
485
486 {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000487 Node* n0 = graph.NewNode(&dummy_operator0);
488 Node* n1 = graph.NewNode(&dummy_operator0);
489 Node* n2 = graph.NewNode(&dummy_operator2, n0, n1);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000490 n2->TrimInputCount(2);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000491 CHECK_INPUTS(n2, n0, n1);
492 CHECK_USES(n0, n2);
493 CHECK_USES(n1, n2);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000494 }
495
496 {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000497 Node* n0 = graph.NewNode(&dummy_operator0);
498 Node* n1 = graph.NewNode(&dummy_operator0);
499 Node* n2 = graph.NewNode(&dummy_operator2, n0, n1);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000500 n2->TrimInputCount(1);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000501 CHECK_INPUTS(n2, n0);
502 CHECK_USES(n0, n2);
503 CHECK_USES(n1, NONE);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000504 }
505
506 {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000507 Node* n0 = graph.NewNode(&dummy_operator0);
508 Node* n1 = graph.NewNode(&dummy_operator0);
509 Node* n2 = graph.NewNode(&dummy_operator2, n0, n1);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000510 n2->TrimInputCount(0);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000511 CHECK_INPUTS(n2, NONE);
512 CHECK_USES(n0, NONE);
513 CHECK_USES(n1, NONE);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000514 }
515
516 {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000517 Node* n0 = graph.NewNode(&dummy_operator0);
518 Node* n2 = graph.NewNode(&dummy_operator2, n0, n0);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000519 n2->TrimInputCount(1);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000520 CHECK_INPUTS(n2, n0);
521 CHECK_USES(n0, n2);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000522 }
523
524 {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000525 Node* n0 = graph.NewNode(&dummy_operator0);
526 Node* n2 = graph.NewNode(&dummy_operator2, n0, n0);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000527 n2->TrimInputCount(0);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000528 CHECK_INPUTS(n2, NONE);
529 CHECK_USES(n0, NONE);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000530 }
531}
532
533
534TEST(TrimInputCountOutOfLine1) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000535 Zone zone;
536 Graph graph(&zone);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000537
538 {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000539 Node* n0 = graph.NewNode(&dummy_operator0);
540 Node* n1 = graph.NewNode(&dummy_operator0);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000541 n1->AppendInput(graph.zone(), n0);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000542 CHECK_INPUTS(n1, n0);
543 CHECK_USES(n0, n1);
544
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000545 n1->TrimInputCount(1);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000546 CHECK_INPUTS(n1, n0);
547 CHECK_USES(n0, n1);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000548 }
549
550 {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000551 Node* n0 = graph.NewNode(&dummy_operator0);
552 Node* n1 = graph.NewNode(&dummy_operator0);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000553 n1->AppendInput(graph.zone(), n0);
554 CHECK_EQ(1, n1->InputCount());
555 n1->TrimInputCount(0);
556 CHECK_EQ(0, n1->InputCount());
557 CHECK_EQ(0, n0->UseCount());
558 }
559
560 {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000561 Node* n0 = graph.NewNode(&dummy_operator0);
562 Node* n1 = graph.NewNode(&dummy_operator0);
563 Node* n2 = graph.NewNode(&dummy_operator0);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000564 n2->AppendInput(graph.zone(), n0);
565 n2->AppendInput(graph.zone(), n1);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000566 CHECK_INPUTS(n2, n0, n1);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000567 n2->TrimInputCount(2);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000568 CHECK_INPUTS(n2, n0, n1);
569 CHECK_USES(n0, n2);
570 CHECK_USES(n1, n2);
571 CHECK_USES(n2, NONE);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000572 }
573
574 {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000575 Node* n0 = graph.NewNode(&dummy_operator0);
576 Node* n1 = graph.NewNode(&dummy_operator0);
577 Node* n2 = graph.NewNode(&dummy_operator0);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000578 n2->AppendInput(graph.zone(), n0);
579 n2->AppendInput(graph.zone(), n1);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000580 CHECK_INPUTS(n2, n0, n1);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000581 n2->TrimInputCount(1);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000582 CHECK_INPUTS(n2, n0);
583 CHECK_USES(n0, n2);
584 CHECK_USES(n1, NONE);
585 CHECK_USES(n2, NONE);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000586 }
587
588 {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000589 Node* n0 = graph.NewNode(&dummy_operator0);
590 Node* n1 = graph.NewNode(&dummy_operator0);
591 Node* n2 = graph.NewNode(&dummy_operator0);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000592 n2->AppendInput(graph.zone(), n0);
593 n2->AppendInput(graph.zone(), n1);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000594 CHECK_INPUTS(n2, n0, n1);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000595 n2->TrimInputCount(0);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000596 CHECK_INPUTS(n2, NONE);
597 CHECK_USES(n0, NONE);
598 CHECK_USES(n1, NONE);
599 CHECK_USES(n2, NONE);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000600 }
601
602 {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000603 Node* n0 = graph.NewNode(&dummy_operator0);
604 Node* n2 = graph.NewNode(&dummy_operator0);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000605 n2->AppendInput(graph.zone(), n0);
606 n2->AppendInput(graph.zone(), n0);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000607 CHECK_INPUTS(n2, n0, n0);
608 CHECK_USES(n0, n2, n2);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000609 n2->TrimInputCount(1);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000610 CHECK_INPUTS(n2, n0);
611 CHECK_USES(n0, n2);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000612 }
613
614 {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000615 Node* n0 = graph.NewNode(&dummy_operator0);
616 Node* n2 = graph.NewNode(&dummy_operator0);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000617 n2->AppendInput(graph.zone(), n0);
618 n2->AppendInput(graph.zone(), n0);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000619 CHECK_INPUTS(n2, n0, n0);
620 CHECK_USES(n0, n2, n2);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000621 n2->TrimInputCount(0);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000622 CHECK_INPUTS(n2, NONE);
623 CHECK_USES(n0, NONE);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000624 }
625}
626
627
628TEST(TrimInputCountOutOfLine2) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000629 Zone zone;
630 Graph graph(&zone);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000631
632 {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000633 Node* n0 = graph.NewNode(&dummy_operator0);
634 Node* n1 = graph.NewNode(&dummy_operator0);
635 Node* n2 = graph.NewNode(&dummy_operator1, n0);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000636 n2->AppendInput(graph.zone(), n1);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000637 CHECK_INPUTS(n2, n0, n1);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000638 n2->TrimInputCount(2);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000639 CHECK_INPUTS(n2, n0, n1);
640 CHECK_USES(n0, n2);
641 CHECK_USES(n1, n2);
642 CHECK_USES(n2, NONE);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000643 }
644
645 {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000646 Node* n0 = graph.NewNode(&dummy_operator0);
647 Node* n1 = graph.NewNode(&dummy_operator0);
648 Node* n2 = graph.NewNode(&dummy_operator1, n0);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000649 n2->AppendInput(graph.zone(), n1);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000650 CHECK_INPUTS(n2, n0, n1);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000651 n2->TrimInputCount(1);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000652 CHECK_INPUTS(n2, n0);
653 CHECK_USES(n0, n2);
654 CHECK_USES(n1, NONE);
655 CHECK_USES(n2, NONE);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000656 }
657
658 {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000659 Node* n0 = graph.NewNode(&dummy_operator0);
660 Node* n1 = graph.NewNode(&dummy_operator0);
661 Node* n2 = graph.NewNode(&dummy_operator1, n0);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000662 n2->AppendInput(graph.zone(), n1);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000663 CHECK_INPUTS(n2, n0, n1);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000664 n2->TrimInputCount(0);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000665 CHECK_INPUTS(n2, NONE);
666 CHECK_USES(n0, NONE);
667 CHECK_USES(n1, NONE);
668 CHECK_USES(n2, NONE);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000669 }
670
671 {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000672 Node* n0 = graph.NewNode(&dummy_operator0);
673 Node* n2 = graph.NewNode(&dummy_operator1, n0);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000674 n2->AppendInput(graph.zone(), n0);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000675 CHECK_INPUTS(n2, n0, n0);
676 CHECK_USES(n0, n2, n2);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000677 n2->TrimInputCount(1);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000678 CHECK_INPUTS(n2, n0);
679 CHECK_USES(n0, n2);
680 CHECK_USES(n2, NONE);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000681 }
682
683 {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000684 Node* n0 = graph.NewNode(&dummy_operator0);
685 Node* n2 = graph.NewNode(&dummy_operator1, n0);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000686 n2->AppendInput(graph.zone(), n0);
687 CHECK_EQ(2, n2->InputCount());
688 CHECK_EQ(2, n0->UseCount());
689 n2->TrimInputCount(0);
690 CHECK_EQ(0, n2->InputCount());
691 CHECK_EQ(0, n0->UseCount());
692 CHECK_EQ(0, n2->UseCount());
693 }
694}
695
696
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000697TEST(NullAllInputs) {
698 Zone zone;
699 Graph graph(&zone);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000700
701 for (int i = 0; i < 2; i++) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000702 Node* n0 = graph.NewNode(&dummy_operator0);
703 Node* n1 = graph.NewNode(&dummy_operator1, n0);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000704 Node* n2;
705 if (i == 0) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000706 n2 = graph.NewNode(&dummy_operator2, n0, n1);
707 CHECK_INPUTS(n2, n0, n1);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000708 } else {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000709 n2 = graph.NewNode(&dummy_operator1, n0);
710 CHECK_INPUTS(n2, n0);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000711 n2->AppendInput(graph.zone(), n1); // with out-of-line input.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000712 CHECK_INPUTS(n2, n0, n1);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000713 }
714
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000715 n0->NullAllInputs();
716 CHECK_INPUTS(n0, NONE);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000717
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000718 CHECK_USES(n0, n1, n2);
719 n1->NullAllInputs();
720 CHECK_INPUTS(n1, NULL);
721 CHECK_INPUTS(n2, n0, n1);
722 CHECK_USES(n0, n2);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000723
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000724 n2->NullAllInputs();
725 CHECK_INPUTS(n1, NULL);
726 CHECK_INPUTS(n2, NULL, NULL);
727 CHECK_USES(n0, NONE);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000728 }
729
730 {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000731 Node* n0 = graph.NewNode(&dummy_operator0);
732 Node* n1 = graph.NewNode(&dummy_operator1, n0);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000733 n1->ReplaceInput(0, n1); // self-reference.
734
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000735 CHECK_INPUTS(n0, NONE);
736 CHECK_INPUTS(n1, n1);
737 CHECK_USES(n0, NONE);
738 CHECK_USES(n1, n1);
739 n1->NullAllInputs();
740
741 CHECK_INPUTS(n0, NONE);
742 CHECK_INPUTS(n1, NULL);
743 CHECK_USES(n0, NONE);
744 CHECK_USES(n1, NONE);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000745 }
746}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000747
748
749TEST(AppendAndTrim) {
750 Zone zone;
751 Graph graph(&zone);
752
753 Node* nodes[] = {
754 graph.NewNode(&dummy_operator0), graph.NewNode(&dummy_operator0),
755 graph.NewNode(&dummy_operator0), graph.NewNode(&dummy_operator0),
756 graph.NewNode(&dummy_operator0)};
757
758 int max = static_cast<int>(arraysize(nodes));
759
760 Node* last = graph.NewNode(&dummy_operator0);
761
762 for (int i = 0; i < max; i++) {
763 last->AppendInput(graph.zone(), nodes[i]);
764 CheckInputs(last, nodes, i + 1);
765
766 for (int j = 0; j < max; j++) {
767 if (j <= i) CHECK_USES(nodes[j], last);
768 if (j > i) CHECK_USES(nodes[j], NONE);
769 }
770
771 CHECK_USES(last, NONE);
772 }
773
774 for (int i = max; i >= 0; i--) {
775 last->TrimInputCount(i);
776 CheckInputs(last, nodes, i);
777
778 for (int j = 0; j < i; j++) {
779 if (j < i) CHECK_USES(nodes[j], last);
780 if (j >= i) CHECK_USES(nodes[j], NONE);
781 }
782
783 CHECK_USES(last, NONE);
784 }
785}
786
787} // namespace compiler
788} // namespace internal
789} // namespace v8