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.
9 #include "graph-tester.h"
10 #include "src/compiler/generic-node-inl.h"
11 #include "src/compiler/node.h"
12 #include "src/compiler/operator.h"
14 using namespace v8::internal;
15 using namespace v8::internal::compiler;
17 static SimpleOperator dummy_operator(IrOpcode::kParameter, Operator::kNoWrite,
20 TEST(NodeAllocation) {
22 Node* n1 = graph.NewNode(&dummy_operator);
23 Node* n2 = graph.NewNode(&dummy_operator);
24 CHECK(n2->id() != n1->id());
28 TEST(NodeWithOpcode) {
30 Node* n1 = graph.NewNode(&dummy_operator);
31 Node* n2 = graph.NewNode(&dummy_operator);
32 CHECK(n1->op() == &dummy_operator);
33 CHECK(n2->op() == &dummy_operator);
39 Node* n0 = graph.NewNode(&dummy_operator);
40 Node* n2 = graph.NewNode(&dummy_operator, n0);
41 CHECK_EQ(1, n2->InputCount());
42 CHECK(n0 == n2->InputAt(0));
48 Node* n0 = graph.NewNode(&dummy_operator);
49 Node* n1 = graph.NewNode(&dummy_operator);
50 Node* n2 = graph.NewNode(&dummy_operator, n0, n1);
51 CHECK_EQ(2, n2->InputCount());
52 CHECK(n0 == n2->InputAt(0));
53 CHECK(n1 == n2->InputAt(1));
59 Node* n0 = graph.NewNode(&dummy_operator);
60 Node* n1 = graph.NewNode(&dummy_operator);
61 Node* n2 = graph.NewNode(&dummy_operator, n0, n1, n1);
62 CHECK_EQ(3, n2->InputCount());
63 CHECK(n0 == n2->InputAt(0));
64 CHECK(n1 == n2->InputAt(1));
65 CHECK(n1 == n2->InputAt(2));
69 TEST(NodeInputIteratorEmpty) {
71 Node* n1 = graph.NewNode(&dummy_operator);
72 Node::Inputs::iterator i(n1->inputs().begin());
74 for (; i != n1->inputs().end(); ++i) {
77 CHECK_EQ(0, input_count);
81 TEST(NodeInputIteratorOne) {
83 Node* n0 = graph.NewNode(&dummy_operator);
84 Node* n1 = graph.NewNode(&dummy_operator, n0);
85 Node::Inputs::iterator i(n1->inputs().begin());
86 CHECK_EQ(1, n1->InputCount());
89 CHECK(n1->inputs().end() == i);
93 TEST(NodeUseIteratorEmpty) {
95 Node* n1 = graph.NewNode(&dummy_operator);
96 Node::Uses::iterator i(n1->uses().begin());
98 for (; i != n1->uses().end(); ++i) {
99 Node::Edge edge(i.edge());
103 CHECK_EQ(0, use_count);
107 TEST(NodeUseIteratorOne) {
109 Node* n0 = graph.NewNode(&dummy_operator);
110 Node* n1 = graph.NewNode(&dummy_operator, n0);
111 Node::Uses::iterator i(n0->uses().begin());
114 CHECK(n0->uses().end() == i);
118 TEST(NodeUseIteratorReplaceNoUses) {
120 Node* n0 = graph.NewNode(&dummy_operator);
121 Node* n3 = graph.NewNode(&dummy_operator);
123 CHECK(n0->uses().begin() == n0->uses().end());
127 TEST(NodeUseIteratorReplaceUses) {
129 Node* n0 = graph.NewNode(&dummy_operator);
130 Node* n1 = graph.NewNode(&dummy_operator, n0);
131 Node* n2 = graph.NewNode(&dummy_operator, n0);
132 Node* n3 = graph.NewNode(&dummy_operator);
133 Node::Uses::iterator i1(n0->uses().begin());
138 Node::Uses::iterator i2(n3->uses().begin());
142 Node::Inputs::iterator i3(n1->inputs().begin());
145 CHECK(n1->inputs().end() == i3);
146 Node::Inputs::iterator i4(n2->inputs().begin());
149 CHECK(n2->inputs().end() == i4);
153 TEST(NodeUseIteratorReplaceUsesSelf) {
155 Node* n0 = graph.NewNode(&dummy_operator);
156 Node* n1 = graph.NewNode(&dummy_operator, n0);
157 Node* n3 = graph.NewNode(&dummy_operator);
159 n1->ReplaceInput(0, n1); // Create self-reference.
161 Node::Uses::iterator i1(n1->uses().begin());
166 CHECK(n1->uses().begin() == n1->uses().end());
168 Node::Uses::iterator i2(n3->uses().begin());
171 CHECK(n1->uses().end() == i2);
177 Node* n0 = graph.NewNode(&dummy_operator);
178 Node* n1 = graph.NewNode(&dummy_operator);
179 Node* n2 = graph.NewNode(&dummy_operator);
180 Node* n3 = graph.NewNode(&dummy_operator, n0, n1, n2);
181 Node::Inputs::iterator i1(n3->inputs().begin());
183 CHECK_EQ(n0, n3->InputAt(0));
186 CHECK_EQ(n1, n3->InputAt(1));
189 CHECK_EQ(n2, n3->InputAt(2));
191 CHECK(i1 == n3->inputs().end());
193 Node::Uses::iterator i2(n1->uses().begin());
196 CHECK(i2 == n1->uses().end());
198 Node* n4 = graph.NewNode(&dummy_operator);
199 Node::Uses::iterator i3(n4->uses().begin());
200 CHECK(i3 == n4->uses().end());
202 n3->ReplaceInput(1, n4);
204 Node::Uses::iterator i4(n1->uses().begin());
205 CHECK(i4 == n1->uses().end());
207 Node::Uses::iterator i5(n4->uses().begin());
210 CHECK(i5 == n4->uses().end());
212 Node::Inputs::iterator i6(n3->inputs().begin());
214 CHECK_EQ(n0, n3->InputAt(0));
217 CHECK_EQ(n4, n3->InputAt(1));
220 CHECK_EQ(n2, n3->InputAt(2));
222 CHECK(i6 == n3->inputs().end());
230 Node* n0 = graph.NewNode(&dummy_operator);
231 Node* n1 = graph.NewNode(&dummy_operator);
233 CHECK(!n0->OwnedBy(n1));
234 CHECK(!n1->OwnedBy(n0));
236 Node* n2 = graph.NewNode(&dummy_operator, n0);
237 CHECK(n0->OwnedBy(n2));
238 CHECK(!n2->OwnedBy(n0));
240 Node* n3 = graph.NewNode(&dummy_operator, n0);
241 CHECK(!n0->OwnedBy(n2));
242 CHECK(!n0->OwnedBy(n3));
243 CHECK(!n2->OwnedBy(n0));
244 CHECK(!n3->OwnedBy(n0));
248 Node* n0 = graph.NewNode(&dummy_operator);
249 Node* n1 = graph.NewNode(&dummy_operator, n0);
250 CHECK(n0->OwnedBy(n1));
251 CHECK(!n1->OwnedBy(n0));
252 Node* n2 = graph.NewNode(&dummy_operator, n0);
253 CHECK(!n0->OwnedBy(n1));
254 CHECK(!n0->OwnedBy(n2));
255 CHECK(!n1->OwnedBy(n0));
256 CHECK(!n1->OwnedBy(n2));
257 CHECK(!n2->OwnedBy(n0));
258 CHECK(!n2->OwnedBy(n1));
260 Node* n3 = graph.NewNode(&dummy_operator);
261 n2->ReplaceInput(0, n3);
263 CHECK(n0->OwnedBy(n1));
264 CHECK(!n1->OwnedBy(n0));
265 CHECK(!n1->OwnedBy(n0));
266 CHECK(!n1->OwnedBy(n2));
267 CHECK(!n2->OwnedBy(n0));
268 CHECK(!n2->OwnedBy(n1));
269 CHECK(n3->OwnedBy(n2));
270 CHECK(!n2->OwnedBy(n3));
278 Node* n0 = graph.NewNode(&dummy_operator);
279 Node* n1 = graph.NewNode(&dummy_operator, n0);
280 CHECK_EQ(1, n0->UseCount());
281 printf("A: %d vs %d\n", n0->UseAt(0)->id(), n1->id());
282 CHECK(n0->UseAt(0) == n1);
283 Node* n2 = graph.NewNode(&dummy_operator, n0);
284 CHECK_EQ(2, n0->UseCount());
285 printf("B: %d vs %d\n", n0->UseAt(1)->id(), n2->id());
286 CHECK(n0->UseAt(1) == n2);
287 Node* n3 = graph.NewNode(&dummy_operator, n0);
288 CHECK_EQ(3, n0->UseCount());
289 CHECK(n0->UseAt(2) == n3);
296 Node* n0 = graph.NewNode(&dummy_operator);
297 Node* n1 = graph.NewNode(&dummy_operator, n0);
298 Node* n2 = graph.NewNode(&dummy_operator, n0);
299 Node* n3 = graph.NewNode(&dummy_operator, n0, n1, n2);
300 CHECK_EQ(3, n3->InputCount());
301 CHECK(n3->InputAt(0) == n0);
302 CHECK(n3->InputAt(1) == n1);
303 CHECK(n3->InputAt(2) == n2);
304 Node* n4 = graph.NewNode(&dummy_operator, n0, n1, n2);
305 n3->AppendInput(graph.zone(), n4);
306 CHECK_EQ(4, n3->InputCount());
307 CHECK(n3->InputAt(0) == n0);
308 CHECK(n3->InputAt(1) == n1);
309 CHECK(n3->InputAt(2) == n2);
310 CHECK(n3->InputAt(3) == n4);
311 Node* n5 = graph.NewNode(&dummy_operator, n4);
312 n3->AppendInput(graph.zone(), n4);
313 CHECK_EQ(5, n3->InputCount());
314 CHECK(n3->InputAt(0) == n0);
315 CHECK(n3->InputAt(1) == n1);
316 CHECK(n3->InputAt(2) == n2);
317 CHECK(n3->InputAt(3) == n4);
318 CHECK(n3->InputAt(4) == n4);
320 // Make sure uses have been hooked op correctly.
321 Node::Uses uses(n4->uses());
322 Node::Uses::iterator current = uses.begin();
323 CHECK(current != uses.end());
324 CHECK(*current == n3);
326 CHECK(current != uses.end());
327 CHECK(*current == n5);
329 CHECK(current != uses.end());
330 CHECK(*current == n3);
332 CHECK(current == uses.end());
336 TEST(AppendInputsAndIterator) {
339 Node* n0 = graph.NewNode(&dummy_operator);
340 Node* n1 = graph.NewNode(&dummy_operator, n0);
341 Node* n2 = graph.NewNode(&dummy_operator, n0, n1);
343 Node::Inputs inputs(n2->inputs());
344 Node::Inputs::iterator current = inputs.begin();
345 CHECK(current != inputs.end());
346 CHECK(*current == n0);
348 CHECK(current != inputs.end());
349 CHECK(*current == n1);
351 CHECK(current == inputs.end());
353 Node* n3 = graph.NewNode(&dummy_operator);
354 n2->AppendInput(graph.zone(), n3);
355 inputs = n2->inputs();
356 current = inputs.begin();
357 CHECK(current != inputs.end());
358 CHECK(*current == n0);
359 CHECK_EQ(0, current.index());
361 CHECK(current != inputs.end());
362 CHECK(*current == n1);
363 CHECK_EQ(1, current.index());
365 CHECK(current != inputs.end());
366 CHECK(*current == n3);
367 CHECK_EQ(2, current.index());
369 CHECK(current == inputs.end());
373 TEST(NullInputsSimple) {
376 Node* n0 = graph.NewNode(&dummy_operator);
377 Node* n1 = graph.NewNode(&dummy_operator, n0);
378 Node* n2 = graph.NewNode(&dummy_operator, n0, n1);
379 CHECK_EQ(2, n2->InputCount());
381 CHECK(n0 == n2->InputAt(0));
382 CHECK(n1 == n2->InputAt(1));
383 CHECK_EQ(2, n0->UseCount());
384 n2->ReplaceInput(0, NULL);
385 CHECK(NULL == n2->InputAt(0));
386 CHECK(n1 == n2->InputAt(1));
387 CHECK_EQ(1, n0->UseCount());
391 TEST(NullInputsAppended) {
394 Node* n0 = graph.NewNode(&dummy_operator);
395 Node* n1 = graph.NewNode(&dummy_operator, n0);
396 Node* n2 = graph.NewNode(&dummy_operator, n0);
397 Node* n3 = graph.NewNode(&dummy_operator, n0);
398 n3->AppendInput(graph.zone(), n1);
399 n3->AppendInput(graph.zone(), n2);
400 CHECK_EQ(3, n3->InputCount());
402 CHECK(n0 == n3->InputAt(0));
403 CHECK(n1 == n3->InputAt(1));
404 CHECK(n2 == n3->InputAt(2));
405 CHECK_EQ(1, n1->UseCount());
406 n3->ReplaceInput(1, NULL);
407 CHECK(n0 == n3->InputAt(0));
408 CHECK(NULL == n3->InputAt(1));
409 CHECK(n2 == n3->InputAt(2));
410 CHECK_EQ(0, n1->UseCount());
414 TEST(ReplaceUsesFromAppendedInputs) {
417 Node* n0 = graph.NewNode(&dummy_operator);
418 Node* n1 = graph.NewNode(&dummy_operator, n0);
419 Node* n2 = graph.NewNode(&dummy_operator, n0);
420 Node* n3 = graph.NewNode(&dummy_operator);
421 n2->AppendInput(graph.zone(), n1);
422 n2->AppendInput(graph.zone(), n0);
423 CHECK_EQ(0, n3->UseCount());
424 CHECK_EQ(3, n0->UseCount());
426 CHECK_EQ(0, n0->UseCount());
427 CHECK_EQ(3, n3->UseCount());
429 Node::Uses uses(n3->uses());
430 Node::Uses::iterator current = uses.begin();
431 CHECK(current != uses.end());
432 CHECK(*current == n1);
434 CHECK(current != uses.end());
435 CHECK(*current == n2);
437 CHECK(current != uses.end());
438 CHECK(*current == n2);
440 CHECK(current == uses.end());
444 template <bool result>
445 struct FixedPredicate {
446 bool operator()(const Node* node) const { return result; }
450 TEST(ReplaceUsesIfWithFixedPredicate) {
453 Node* n0 = graph.NewNode(&dummy_operator);
454 Node* n1 = graph.NewNode(&dummy_operator, n0);
455 Node* n2 = graph.NewNode(&dummy_operator, n0);
456 Node* n3 = graph.NewNode(&dummy_operator);
458 CHECK_EQ(0, n2->UseCount());
459 n2->ReplaceUsesIf(FixedPredicate<true>(), n1);
460 CHECK_EQ(0, n2->UseCount());
461 n2->ReplaceUsesIf(FixedPredicate<false>(), n1);
462 CHECK_EQ(0, n2->UseCount());
464 CHECK_EQ(0, n3->UseCount());
465 n3->ReplaceUsesIf(FixedPredicate<true>(), n1);
466 CHECK_EQ(0, n3->UseCount());
467 n3->ReplaceUsesIf(FixedPredicate<false>(), n1);
468 CHECK_EQ(0, n3->UseCount());
470 CHECK_EQ(2, n0->UseCount());
471 CHECK_EQ(0, n1->UseCount());
472 n0->ReplaceUsesIf(FixedPredicate<false>(), n1);
473 CHECK_EQ(2, n0->UseCount());
474 CHECK_EQ(0, n1->UseCount());
475 n0->ReplaceUsesIf(FixedPredicate<true>(), n1);
476 CHECK_EQ(0, n0->UseCount());
477 CHECK_EQ(2, n1->UseCount());
479 n1->AppendInput(graph.zone(), n1);
480 CHECK_EQ(3, n1->UseCount());
481 n1->AppendInput(graph.zone(), n3);
482 CHECK_EQ(1, n3->UseCount());
483 n3->ReplaceUsesIf(FixedPredicate<true>(), n1);
484 CHECK_EQ(4, n1->UseCount());
485 CHECK_EQ(0, n3->UseCount());
486 n1->ReplaceUsesIf(FixedPredicate<false>(), n3);
487 CHECK_EQ(4, n1->UseCount());
488 CHECK_EQ(0, n3->UseCount());
492 TEST(ReplaceUsesIfWithEqualTo) {
495 Node* n0 = graph.NewNode(&dummy_operator);
496 Node* n1 = graph.NewNode(&dummy_operator, n0);
497 Node* n2 = graph.NewNode(&dummy_operator, n0, n1);
499 CHECK_EQ(0, n2->UseCount());
500 n2->ReplaceUsesIf(std::bind1st(std::equal_to<Node*>(), n1), n0);
501 CHECK_EQ(0, n2->UseCount());
503 CHECK_EQ(2, n0->UseCount());
504 CHECK_EQ(1, n1->UseCount());
505 n1->ReplaceUsesIf(std::bind1st(std::equal_to<Node*>(), n0), n0);
506 CHECK_EQ(2, n0->UseCount());
507 CHECK_EQ(1, n1->UseCount());
508 n0->ReplaceUsesIf(std::bind2nd(std::equal_to<Node*>(), n2), n1);
509 CHECK_EQ(1, n0->UseCount());
510 CHECK_EQ(2, n1->UseCount());
514 TEST(ReplaceInputMultipleUses) {
517 Node* n0 = graph.NewNode(&dummy_operator);
518 Node* n1 = graph.NewNode(&dummy_operator);
519 Node* n2 = graph.NewNode(&dummy_operator, n0);
520 n2->ReplaceInput(0, n1);
521 CHECK_EQ(0, n0->UseCount());
522 CHECK_EQ(1, n1->UseCount());
524 Node* n3 = graph.NewNode(&dummy_operator, n0);
525 n3->ReplaceInput(0, n1);
526 CHECK_EQ(0, n0->UseCount());
527 CHECK_EQ(2, n1->UseCount());
531 TEST(TrimInputCountInline) {
535 Node* n0 = graph.NewNode(&dummy_operator);
536 Node* n1 = graph.NewNode(&dummy_operator, n0);
537 n1->TrimInputCount(1);
538 CHECK_EQ(1, n1->InputCount());
539 CHECK_EQ(n0, n1->InputAt(0));
540 CHECK_EQ(1, n0->UseCount());
544 Node* n0 = graph.NewNode(&dummy_operator);
545 Node* n1 = graph.NewNode(&dummy_operator, n0);
546 n1->TrimInputCount(0);
547 CHECK_EQ(0, n1->InputCount());
548 CHECK_EQ(0, n0->UseCount());
552 Node* n0 = graph.NewNode(&dummy_operator);
553 Node* n1 = graph.NewNode(&dummy_operator);
554 Node* n2 = graph.NewNode(&dummy_operator, n0, n1);
555 n2->TrimInputCount(2);
556 CHECK_EQ(2, n2->InputCount());
557 CHECK_EQ(1, n0->UseCount());
558 CHECK_EQ(1, n1->UseCount());
559 CHECK_EQ(0, n2->UseCount());
563 Node* n0 = graph.NewNode(&dummy_operator);
564 Node* n1 = graph.NewNode(&dummy_operator);
565 Node* n2 = graph.NewNode(&dummy_operator, n0, n1);
566 n2->TrimInputCount(1);
567 CHECK_EQ(1, n2->InputCount());
568 CHECK_EQ(1, n0->UseCount());
569 CHECK_EQ(0, n1->UseCount());
570 CHECK_EQ(0, n2->UseCount());
574 Node* n0 = graph.NewNode(&dummy_operator);
575 Node* n1 = graph.NewNode(&dummy_operator);
576 Node* n2 = graph.NewNode(&dummy_operator, n0, n1);
577 n2->TrimInputCount(0);
578 CHECK_EQ(0, n2->InputCount());
579 CHECK_EQ(0, n0->UseCount());
580 CHECK_EQ(0, n1->UseCount());
581 CHECK_EQ(0, n2->UseCount());
585 Node* n0 = graph.NewNode(&dummy_operator);
586 Node* n2 = graph.NewNode(&dummy_operator, n0, n0);
587 n2->TrimInputCount(1);
588 CHECK_EQ(1, n2->InputCount());
589 CHECK_EQ(1, n0->UseCount());
590 CHECK_EQ(0, n2->UseCount());
594 Node* n0 = graph.NewNode(&dummy_operator);
595 Node* n2 = graph.NewNode(&dummy_operator, n0, n0);
596 n2->TrimInputCount(0);
597 CHECK_EQ(0, n2->InputCount());
598 CHECK_EQ(0, n0->UseCount());
599 CHECK_EQ(0, n2->UseCount());
604 TEST(TrimInputCountOutOfLine1) {
608 Node* n0 = graph.NewNode(&dummy_operator);
609 Node* n1 = graph.NewNode(&dummy_operator);
610 n1->AppendInput(graph.zone(), n0);
611 n1->TrimInputCount(1);
612 CHECK_EQ(1, n1->InputCount());
613 CHECK_EQ(n0, n1->InputAt(0));
614 CHECK_EQ(1, n0->UseCount());
618 Node* n0 = graph.NewNode(&dummy_operator);
619 Node* n1 = graph.NewNode(&dummy_operator);
620 n1->AppendInput(graph.zone(), n0);
621 CHECK_EQ(1, n1->InputCount());
622 n1->TrimInputCount(0);
623 CHECK_EQ(0, n1->InputCount());
624 CHECK_EQ(0, n0->UseCount());
628 Node* n0 = graph.NewNode(&dummy_operator);
629 Node* n1 = graph.NewNode(&dummy_operator);
630 Node* n2 = graph.NewNode(&dummy_operator);
631 n2->AppendInput(graph.zone(), n0);
632 n2->AppendInput(graph.zone(), n1);
633 CHECK_EQ(2, n2->InputCount());
634 n2->TrimInputCount(2);
635 CHECK_EQ(2, n2->InputCount());
636 CHECK_EQ(n0, n2->InputAt(0));
637 CHECK_EQ(n1, n2->InputAt(1));
638 CHECK_EQ(1, n0->UseCount());
639 CHECK_EQ(1, n1->UseCount());
640 CHECK_EQ(0, n2->UseCount());
644 Node* n0 = graph.NewNode(&dummy_operator);
645 Node* n1 = graph.NewNode(&dummy_operator);
646 Node* n2 = graph.NewNode(&dummy_operator);
647 n2->AppendInput(graph.zone(), n0);
648 n2->AppendInput(graph.zone(), n1);
649 CHECK_EQ(2, n2->InputCount());
650 n2->TrimInputCount(1);
651 CHECK_EQ(1, n2->InputCount());
652 CHECK_EQ(n0, n2->InputAt(0));
653 CHECK_EQ(1, n0->UseCount());
654 CHECK_EQ(0, n1->UseCount());
655 CHECK_EQ(0, n2->UseCount());
659 Node* n0 = graph.NewNode(&dummy_operator);
660 Node* n1 = graph.NewNode(&dummy_operator);
661 Node* n2 = graph.NewNode(&dummy_operator);
662 n2->AppendInput(graph.zone(), n0);
663 n2->AppendInput(graph.zone(), n1);
664 CHECK_EQ(2, n2->InputCount());
665 n2->TrimInputCount(0);
666 CHECK_EQ(0, n2->InputCount());
667 CHECK_EQ(0, n0->UseCount());
668 CHECK_EQ(0, n1->UseCount());
669 CHECK_EQ(0, n2->UseCount());
673 Node* n0 = graph.NewNode(&dummy_operator);
674 Node* n2 = graph.NewNode(&dummy_operator);
675 n2->AppendInput(graph.zone(), n0);
676 n2->AppendInput(graph.zone(), n0);
677 CHECK_EQ(2, n2->InputCount());
678 CHECK_EQ(2, n0->UseCount());
679 n2->TrimInputCount(1);
680 CHECK_EQ(1, n2->InputCount());
681 CHECK_EQ(1, n0->UseCount());
682 CHECK_EQ(0, n2->UseCount());
686 Node* n0 = graph.NewNode(&dummy_operator);
687 Node* n2 = graph.NewNode(&dummy_operator);
688 n2->AppendInput(graph.zone(), n0);
689 n2->AppendInput(graph.zone(), n0);
690 CHECK_EQ(2, n2->InputCount());
691 CHECK_EQ(2, n0->UseCount());
692 n2->TrimInputCount(0);
693 CHECK_EQ(0, n2->InputCount());
694 CHECK_EQ(0, n0->UseCount());
695 CHECK_EQ(0, n2->UseCount());
700 TEST(TrimInputCountOutOfLine2) {
704 Node* n0 = graph.NewNode(&dummy_operator);
705 Node* n1 = graph.NewNode(&dummy_operator);
706 Node* n2 = graph.NewNode(&dummy_operator, n0);
707 n2->AppendInput(graph.zone(), n1);
708 CHECK_EQ(2, n2->InputCount());
709 n2->TrimInputCount(2);
710 CHECK_EQ(2, n2->InputCount());
711 CHECK_EQ(n0, n2->InputAt(0));
712 CHECK_EQ(n1, n2->InputAt(1));
713 CHECK_EQ(1, n0->UseCount());
714 CHECK_EQ(1, n1->UseCount());
715 CHECK_EQ(0, n2->UseCount());
719 Node* n0 = graph.NewNode(&dummy_operator);
720 Node* n1 = graph.NewNode(&dummy_operator);
721 Node* n2 = graph.NewNode(&dummy_operator, n0);
722 n2->AppendInput(graph.zone(), n1);
723 CHECK_EQ(2, n2->InputCount());
724 n2->TrimInputCount(1);
725 CHECK_EQ(1, n2->InputCount());
726 CHECK_EQ(n0, n2->InputAt(0));
727 CHECK_EQ(1, n0->UseCount());
728 CHECK_EQ(0, n1->UseCount());
729 CHECK_EQ(0, n2->UseCount());
733 Node* n0 = graph.NewNode(&dummy_operator);
734 Node* n1 = graph.NewNode(&dummy_operator);
735 Node* n2 = graph.NewNode(&dummy_operator, n0);
736 n2->AppendInput(graph.zone(), n1);
737 CHECK_EQ(2, n2->InputCount());
738 n2->TrimInputCount(0);
739 CHECK_EQ(0, n2->InputCount());
740 CHECK_EQ(0, n0->UseCount());
741 CHECK_EQ(0, n1->UseCount());
742 CHECK_EQ(0, n2->UseCount());
746 Node* n0 = graph.NewNode(&dummy_operator);
747 Node* n2 = graph.NewNode(&dummy_operator, n0);
748 n2->AppendInput(graph.zone(), n0);
749 CHECK_EQ(2, n2->InputCount());
750 CHECK_EQ(2, n0->UseCount());
751 n2->TrimInputCount(1);
752 CHECK_EQ(1, n2->InputCount());
753 CHECK_EQ(1, n0->UseCount());
754 CHECK_EQ(0, n2->UseCount());
758 Node* n0 = graph.NewNode(&dummy_operator);
759 Node* n2 = graph.NewNode(&dummy_operator, n0);
760 n2->AppendInput(graph.zone(), n0);
761 CHECK_EQ(2, n2->InputCount());
762 CHECK_EQ(2, n0->UseCount());
763 n2->TrimInputCount(0);
764 CHECK_EQ(0, n2->InputCount());
765 CHECK_EQ(0, n0->UseCount());
766 CHECK_EQ(0, n2->UseCount());
771 TEST(RemoveAllInputs) {
774 for (int i = 0; i < 2; i++) {
775 Node* n0 = graph.NewNode(&dummy_operator);
776 Node* n1 = graph.NewNode(&dummy_operator, n0);
779 n2 = graph.NewNode(&dummy_operator, n0, n1);
781 n2 = graph.NewNode(&dummy_operator, n0);
782 n2->AppendInput(graph.zone(), n1); // with out-of-line input.
785 n0->RemoveAllInputs();
786 CHECK_EQ(0, n0->InputCount());
788 CHECK_EQ(2, n0->UseCount());
789 n1->RemoveAllInputs();
790 CHECK_EQ(1, n1->InputCount());
791 CHECK_EQ(1, n0->UseCount());
792 CHECK_EQ(NULL, n1->InputAt(0));
794 CHECK_EQ(1, n1->UseCount());
795 n2->RemoveAllInputs();
796 CHECK_EQ(2, n2->InputCount());
797 CHECK_EQ(0, n0->UseCount());
798 CHECK_EQ(0, n1->UseCount());
799 CHECK_EQ(NULL, n2->InputAt(0));
800 CHECK_EQ(NULL, n2->InputAt(1));
804 Node* n0 = graph.NewNode(&dummy_operator);
805 Node* n1 = graph.NewNode(&dummy_operator, n0);
806 n1->ReplaceInput(0, n1); // self-reference.
808 CHECK_EQ(0, n0->UseCount());
809 CHECK_EQ(1, n1->UseCount());
810 n1->RemoveAllInputs();
811 CHECK_EQ(1, n1->InputCount());
812 CHECK_EQ(0, n1->UseCount());
813 CHECK_EQ(NULL, n1->InputAt(0));