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 Operator dummy_operator(IrOpcode::kParameter, Operator::kNoWrite,
18 "dummy", 0, 0, 0, 1, 0, 0);
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* n1 = graph.NewNode(&dummy_operator);
122 Node* n2 = graph.NewNode(&dummy_operator);
123 Node* n3 = graph.NewNode(&dummy_operator, n2);
125 CHECK(n0->uses().begin() == n0->uses().end());
127 CHECK(n0->uses().begin() == n0->uses().end());
132 TEST(NodeUseIteratorReplaceUses) {
134 Node* n0 = graph.NewNode(&dummy_operator);
135 Node* n1 = graph.NewNode(&dummy_operator, n0);
136 Node* n2 = graph.NewNode(&dummy_operator, n0);
137 Node* n3 = graph.NewNode(&dummy_operator);
138 Node::Uses::iterator i1(n0->uses().begin());
143 Node::Uses::iterator i2(n3->uses().begin());
147 Node::Inputs::iterator i3(n1->inputs().begin());
150 CHECK(n1->inputs().end() == i3);
151 Node::Inputs::iterator i4(n2->inputs().begin());
154 CHECK(n2->inputs().end() == i4);
158 TEST(NodeUseIteratorReplaceUsesSelf) {
160 Node* n0 = graph.NewNode(&dummy_operator);
161 Node* n1 = graph.NewNode(&dummy_operator, n0);
162 Node* n3 = graph.NewNode(&dummy_operator);
164 n1->ReplaceInput(0, n1); // Create self-reference.
166 Node::Uses::iterator i1(n1->uses().begin());
171 CHECK(n1->uses().begin() == n1->uses().end());
173 Node::Uses::iterator i2(n3->uses().begin());
176 CHECK(n1->uses().end() == i2);
182 Node* n0 = graph.NewNode(&dummy_operator);
183 Node* n1 = graph.NewNode(&dummy_operator);
184 Node* n2 = graph.NewNode(&dummy_operator);
185 Node* n3 = graph.NewNode(&dummy_operator, n0, n1, n2);
186 Node::Inputs::iterator i1(n3->inputs().begin());
188 CHECK_EQ(n0, n3->InputAt(0));
191 CHECK_EQ(n1, n3->InputAt(1));
194 CHECK_EQ(n2, n3->InputAt(2));
196 CHECK(i1 == n3->inputs().end());
198 Node::Uses::iterator i2(n1->uses().begin());
201 CHECK(i2 == n1->uses().end());
203 Node* n4 = graph.NewNode(&dummy_operator);
204 Node::Uses::iterator i3(n4->uses().begin());
205 CHECK(i3 == n4->uses().end());
207 n3->ReplaceInput(1, n4);
209 Node::Uses::iterator i4(n1->uses().begin());
210 CHECK(i4 == n1->uses().end());
212 Node::Uses::iterator i5(n4->uses().begin());
215 CHECK(i5 == n4->uses().end());
217 Node::Inputs::iterator i6(n3->inputs().begin());
219 CHECK_EQ(n0, n3->InputAt(0));
222 CHECK_EQ(n4, n3->InputAt(1));
225 CHECK_EQ(n2, n3->InputAt(2));
227 CHECK(i6 == n3->inputs().end());
235 Node* n0 = graph.NewNode(&dummy_operator);
236 Node* n1 = graph.NewNode(&dummy_operator);
238 CHECK(!n0->OwnedBy(n1));
239 CHECK(!n1->OwnedBy(n0));
241 Node* n2 = graph.NewNode(&dummy_operator, n0);
242 CHECK(n0->OwnedBy(n2));
243 CHECK(!n2->OwnedBy(n0));
245 Node* n3 = graph.NewNode(&dummy_operator, n0);
246 CHECK(!n0->OwnedBy(n2));
247 CHECK(!n0->OwnedBy(n3));
248 CHECK(!n2->OwnedBy(n0));
249 CHECK(!n3->OwnedBy(n0));
253 Node* n0 = graph.NewNode(&dummy_operator);
254 Node* n1 = graph.NewNode(&dummy_operator, n0);
255 CHECK(n0->OwnedBy(n1));
256 CHECK(!n1->OwnedBy(n0));
257 Node* n2 = graph.NewNode(&dummy_operator, n0);
258 CHECK(!n0->OwnedBy(n1));
259 CHECK(!n0->OwnedBy(n2));
260 CHECK(!n1->OwnedBy(n0));
261 CHECK(!n1->OwnedBy(n2));
262 CHECK(!n2->OwnedBy(n0));
263 CHECK(!n2->OwnedBy(n1));
265 Node* n3 = graph.NewNode(&dummy_operator);
266 n2->ReplaceInput(0, n3);
268 CHECK(n0->OwnedBy(n1));
269 CHECK(!n1->OwnedBy(n0));
270 CHECK(!n1->OwnedBy(n0));
271 CHECK(!n1->OwnedBy(n2));
272 CHECK(!n2->OwnedBy(n0));
273 CHECK(!n2->OwnedBy(n1));
274 CHECK(n3->OwnedBy(n2));
275 CHECK(!n2->OwnedBy(n3));
283 Node* n0 = graph.NewNode(&dummy_operator);
284 Node* n1 = graph.NewNode(&dummy_operator, n0);
285 CHECK_EQ(1, n0->UseCount());
286 printf("A: %d vs %d\n", n0->UseAt(0)->id(), n1->id());
287 CHECK(n0->UseAt(0) == n1);
288 Node* n2 = graph.NewNode(&dummy_operator, n0);
289 CHECK_EQ(2, n0->UseCount());
290 printf("B: %d vs %d\n", n0->UseAt(1)->id(), n2->id());
291 CHECK(n0->UseAt(1) == n2);
292 Node* n3 = graph.NewNode(&dummy_operator, n0);
293 CHECK_EQ(3, n0->UseCount());
294 CHECK(n0->UseAt(2) == n3);
301 Node* n0 = graph.NewNode(&dummy_operator);
302 Node* n1 = graph.NewNode(&dummy_operator, n0);
303 Node* n2 = graph.NewNode(&dummy_operator, n0);
304 Node* n3 = graph.NewNode(&dummy_operator, n0, n1, n2);
305 CHECK_EQ(3, n3->InputCount());
306 CHECK(n3->InputAt(0) == n0);
307 CHECK(n3->InputAt(1) == n1);
308 CHECK(n3->InputAt(2) == n2);
309 Node* n4 = graph.NewNode(&dummy_operator, n0, n1, n2);
310 n3->AppendInput(graph.zone(), n4);
311 CHECK_EQ(4, n3->InputCount());
312 CHECK(n3->InputAt(0) == n0);
313 CHECK(n3->InputAt(1) == n1);
314 CHECK(n3->InputAt(2) == n2);
315 CHECK(n3->InputAt(3) == n4);
316 Node* n5 = graph.NewNode(&dummy_operator, n4);
317 n3->AppendInput(graph.zone(), n4);
318 CHECK_EQ(5, n3->InputCount());
319 CHECK(n3->InputAt(0) == n0);
320 CHECK(n3->InputAt(1) == n1);
321 CHECK(n3->InputAt(2) == n2);
322 CHECK(n3->InputAt(3) == n4);
323 CHECK(n3->InputAt(4) == n4);
325 // Make sure uses have been hooked op correctly.
326 Node::Uses uses(n4->uses());
327 Node::Uses::iterator current = uses.begin();
328 CHECK(current != uses.end());
329 CHECK(*current == n3);
331 CHECK(current != uses.end());
332 CHECK(*current == n5);
334 CHECK(current != uses.end());
335 CHECK(*current == n3);
337 CHECK(current == uses.end());
344 Node* n0 = graph.NewNode(&dummy_operator);
345 Node* n1 = graph.NewNode(&dummy_operator, n0);
346 Node* n2 = graph.NewNode(&dummy_operator, n0, n1);
349 CHECK_EQ(0, n1->InputCount());
350 CHECK_EQ(1, n0->UseCount());
353 CHECK_EQ(1, n2->InputCount());
354 CHECK_EQ(0, n0->UseCount());
355 CHECK_EQ(1, n1->UseCount());
358 CHECK_EQ(0, n2->InputCount());
362 TEST(AppendInputsAndIterator) {
365 Node* n0 = graph.NewNode(&dummy_operator);
366 Node* n1 = graph.NewNode(&dummy_operator, n0);
367 Node* n2 = graph.NewNode(&dummy_operator, n0, n1);
369 Node::Inputs inputs(n2->inputs());
370 Node::Inputs::iterator current = inputs.begin();
371 CHECK(current != inputs.end());
372 CHECK(*current == n0);
374 CHECK(current != inputs.end());
375 CHECK(*current == n1);
377 CHECK(current == inputs.end());
379 Node* n3 = graph.NewNode(&dummy_operator);
380 n2->AppendInput(graph.zone(), n3);
381 inputs = n2->inputs();
382 current = inputs.begin();
383 CHECK(current != inputs.end());
384 CHECK(*current == n0);
385 CHECK_EQ(0, current.index());
387 CHECK(current != inputs.end());
388 CHECK(*current == n1);
389 CHECK_EQ(1, current.index());
391 CHECK(current != inputs.end());
392 CHECK(*current == n3);
393 CHECK_EQ(2, current.index());
395 CHECK(current == inputs.end());
399 TEST(NullInputsSimple) {
402 Node* n0 = graph.NewNode(&dummy_operator);
403 Node* n1 = graph.NewNode(&dummy_operator, n0);
404 Node* n2 = graph.NewNode(&dummy_operator, n0, n1);
405 CHECK_EQ(2, n2->InputCount());
407 CHECK(n0 == n2->InputAt(0));
408 CHECK(n1 == n2->InputAt(1));
409 CHECK_EQ(2, n0->UseCount());
410 n2->ReplaceInput(0, NULL);
411 CHECK(NULL == n2->InputAt(0));
412 CHECK(n1 == n2->InputAt(1));
413 CHECK_EQ(1, n0->UseCount());
417 TEST(NullInputsAppended) {
420 Node* n0 = graph.NewNode(&dummy_operator);
421 Node* n1 = graph.NewNode(&dummy_operator, n0);
422 Node* n2 = graph.NewNode(&dummy_operator, n0);
423 Node* n3 = graph.NewNode(&dummy_operator, n0);
424 n3->AppendInput(graph.zone(), n1);
425 n3->AppendInput(graph.zone(), n2);
426 CHECK_EQ(3, n3->InputCount());
428 CHECK(n0 == n3->InputAt(0));
429 CHECK(n1 == n3->InputAt(1));
430 CHECK(n2 == n3->InputAt(2));
431 CHECK_EQ(1, n1->UseCount());
432 n3->ReplaceInput(1, NULL);
433 CHECK(n0 == n3->InputAt(0));
434 CHECK(NULL == n3->InputAt(1));
435 CHECK(n2 == n3->InputAt(2));
436 CHECK_EQ(0, n1->UseCount());
440 TEST(ReplaceUsesFromAppendedInputs) {
443 Node* n0 = graph.NewNode(&dummy_operator);
444 Node* n1 = graph.NewNode(&dummy_operator, n0);
445 Node* n2 = graph.NewNode(&dummy_operator, n0);
446 Node* n3 = graph.NewNode(&dummy_operator);
447 n2->AppendInput(graph.zone(), n1);
448 n2->AppendInput(graph.zone(), n0);
449 CHECK_EQ(0, n3->UseCount());
450 CHECK_EQ(3, n0->UseCount());
452 CHECK_EQ(0, n0->UseCount());
453 CHECK_EQ(3, n3->UseCount());
455 Node::Uses uses(n3->uses());
456 Node::Uses::iterator current = uses.begin();
457 CHECK(current != uses.end());
458 CHECK(*current == n1);
460 CHECK(current != uses.end());
461 CHECK(*current == n2);
463 CHECK(current != uses.end());
464 CHECK(*current == n2);
466 CHECK(current == uses.end());
470 template <bool result>
471 struct FixedPredicate {
472 bool operator()(const Node* node) const { return result; }
476 TEST(ReplaceUsesIfWithFixedPredicate) {
479 Node* n0 = graph.NewNode(&dummy_operator);
480 Node* n1 = graph.NewNode(&dummy_operator, n0);
481 Node* n2 = graph.NewNode(&dummy_operator, n0);
482 Node* n3 = graph.NewNode(&dummy_operator);
484 CHECK_EQ(0, n2->UseCount());
485 n2->ReplaceUsesIf(FixedPredicate<true>(), n1);
486 CHECK_EQ(0, n2->UseCount());
487 n2->ReplaceUsesIf(FixedPredicate<false>(), n1);
488 CHECK_EQ(0, n2->UseCount());
490 CHECK_EQ(0, n3->UseCount());
491 n3->ReplaceUsesIf(FixedPredicate<true>(), n1);
492 CHECK_EQ(0, n3->UseCount());
493 n3->ReplaceUsesIf(FixedPredicate<false>(), n1);
494 CHECK_EQ(0, n3->UseCount());
496 CHECK_EQ(2, n0->UseCount());
497 CHECK_EQ(0, n1->UseCount());
498 n0->ReplaceUsesIf(FixedPredicate<false>(), n1);
499 CHECK_EQ(2, n0->UseCount());
500 CHECK_EQ(0, n1->UseCount());
501 n0->ReplaceUsesIf(FixedPredicate<true>(), n1);
502 CHECK_EQ(0, n0->UseCount());
503 CHECK_EQ(2, n1->UseCount());
505 n1->AppendInput(graph.zone(), n1);
506 CHECK_EQ(3, n1->UseCount());
507 n1->AppendInput(graph.zone(), n3);
508 CHECK_EQ(1, n3->UseCount());
509 n3->ReplaceUsesIf(FixedPredicate<true>(), n1);
510 CHECK_EQ(4, n1->UseCount());
511 CHECK_EQ(0, n3->UseCount());
512 n1->ReplaceUsesIf(FixedPredicate<false>(), n3);
513 CHECK_EQ(4, n1->UseCount());
514 CHECK_EQ(0, n3->UseCount());
518 TEST(ReplaceUsesIfWithEqualTo) {
521 Node* n0 = graph.NewNode(&dummy_operator);
522 Node* n1 = graph.NewNode(&dummy_operator, n0);
523 Node* n2 = graph.NewNode(&dummy_operator, n0, n1);
525 CHECK_EQ(0, n2->UseCount());
526 n2->ReplaceUsesIf(std::bind1st(std::equal_to<Node*>(), n1), n0);
527 CHECK_EQ(0, n2->UseCount());
529 CHECK_EQ(2, n0->UseCount());
530 CHECK_EQ(1, n1->UseCount());
531 n1->ReplaceUsesIf(std::bind1st(std::equal_to<Node*>(), n0), n0);
532 CHECK_EQ(2, n0->UseCount());
533 CHECK_EQ(1, n1->UseCount());
534 n0->ReplaceUsesIf(std::bind2nd(std::equal_to<Node*>(), n2), n1);
535 CHECK_EQ(1, n0->UseCount());
536 CHECK_EQ(2, n1->UseCount());
540 TEST(ReplaceInputMultipleUses) {
543 Node* n0 = graph.NewNode(&dummy_operator);
544 Node* n1 = graph.NewNode(&dummy_operator);
545 Node* n2 = graph.NewNode(&dummy_operator, n0);
546 n2->ReplaceInput(0, n1);
547 CHECK_EQ(0, n0->UseCount());
548 CHECK_EQ(1, n1->UseCount());
550 Node* n3 = graph.NewNode(&dummy_operator, n0);
551 n3->ReplaceInput(0, n1);
552 CHECK_EQ(0, n0->UseCount());
553 CHECK_EQ(2, n1->UseCount());
557 TEST(TrimInputCountInline) {
561 Node* n0 = graph.NewNode(&dummy_operator);
562 Node* n1 = graph.NewNode(&dummy_operator, n0);
563 n1->TrimInputCount(1);
564 CHECK_EQ(1, n1->InputCount());
565 CHECK_EQ(n0, n1->InputAt(0));
566 CHECK_EQ(1, n0->UseCount());
570 Node* n0 = graph.NewNode(&dummy_operator);
571 Node* n1 = graph.NewNode(&dummy_operator, n0);
572 n1->TrimInputCount(0);
573 CHECK_EQ(0, n1->InputCount());
574 CHECK_EQ(0, n0->UseCount());
578 Node* n0 = graph.NewNode(&dummy_operator);
579 Node* n1 = graph.NewNode(&dummy_operator);
580 Node* n2 = graph.NewNode(&dummy_operator, n0, n1);
581 n2->TrimInputCount(2);
582 CHECK_EQ(2, n2->InputCount());
583 CHECK_EQ(1, n0->UseCount());
584 CHECK_EQ(1, n1->UseCount());
585 CHECK_EQ(0, n2->UseCount());
589 Node* n0 = graph.NewNode(&dummy_operator);
590 Node* n1 = graph.NewNode(&dummy_operator);
591 Node* n2 = graph.NewNode(&dummy_operator, n0, n1);
592 n2->TrimInputCount(1);
593 CHECK_EQ(1, n2->InputCount());
594 CHECK_EQ(1, n0->UseCount());
595 CHECK_EQ(0, n1->UseCount());
596 CHECK_EQ(0, n2->UseCount());
600 Node* n0 = graph.NewNode(&dummy_operator);
601 Node* n1 = graph.NewNode(&dummy_operator);
602 Node* n2 = graph.NewNode(&dummy_operator, n0, n1);
603 n2->TrimInputCount(0);
604 CHECK_EQ(0, n2->InputCount());
605 CHECK_EQ(0, n0->UseCount());
606 CHECK_EQ(0, n1->UseCount());
607 CHECK_EQ(0, n2->UseCount());
611 Node* n0 = graph.NewNode(&dummy_operator);
612 Node* n2 = graph.NewNode(&dummy_operator, n0, n0);
613 n2->TrimInputCount(1);
614 CHECK_EQ(1, n2->InputCount());
615 CHECK_EQ(1, n0->UseCount());
616 CHECK_EQ(0, n2->UseCount());
620 Node* n0 = graph.NewNode(&dummy_operator);
621 Node* n2 = graph.NewNode(&dummy_operator, n0, n0);
622 n2->TrimInputCount(0);
623 CHECK_EQ(0, n2->InputCount());
624 CHECK_EQ(0, n0->UseCount());
625 CHECK_EQ(0, n2->UseCount());
630 TEST(TrimInputCountOutOfLine1) {
634 Node* n0 = graph.NewNode(&dummy_operator);
635 Node* n1 = graph.NewNode(&dummy_operator);
636 n1->AppendInput(graph.zone(), n0);
637 n1->TrimInputCount(1);
638 CHECK_EQ(1, n1->InputCount());
639 CHECK_EQ(n0, n1->InputAt(0));
640 CHECK_EQ(1, n0->UseCount());
644 Node* n0 = graph.NewNode(&dummy_operator);
645 Node* n1 = graph.NewNode(&dummy_operator);
646 n1->AppendInput(graph.zone(), n0);
647 CHECK_EQ(1, n1->InputCount());
648 n1->TrimInputCount(0);
649 CHECK_EQ(0, n1->InputCount());
650 CHECK_EQ(0, n0->UseCount());
654 Node* n0 = graph.NewNode(&dummy_operator);
655 Node* n1 = graph.NewNode(&dummy_operator);
656 Node* n2 = graph.NewNode(&dummy_operator);
657 n2->AppendInput(graph.zone(), n0);
658 n2->AppendInput(graph.zone(), n1);
659 CHECK_EQ(2, n2->InputCount());
660 n2->TrimInputCount(2);
661 CHECK_EQ(2, n2->InputCount());
662 CHECK_EQ(n0, n2->InputAt(0));
663 CHECK_EQ(n1, n2->InputAt(1));
664 CHECK_EQ(1, n0->UseCount());
665 CHECK_EQ(1, n1->UseCount());
666 CHECK_EQ(0, n2->UseCount());
670 Node* n0 = graph.NewNode(&dummy_operator);
671 Node* n1 = graph.NewNode(&dummy_operator);
672 Node* n2 = graph.NewNode(&dummy_operator);
673 n2->AppendInput(graph.zone(), n0);
674 n2->AppendInput(graph.zone(), n1);
675 CHECK_EQ(2, n2->InputCount());
676 n2->TrimInputCount(1);
677 CHECK_EQ(1, n2->InputCount());
678 CHECK_EQ(n0, n2->InputAt(0));
679 CHECK_EQ(1, n0->UseCount());
680 CHECK_EQ(0, n1->UseCount());
681 CHECK_EQ(0, n2->UseCount());
685 Node* n0 = graph.NewNode(&dummy_operator);
686 Node* n1 = graph.NewNode(&dummy_operator);
687 Node* n2 = graph.NewNode(&dummy_operator);
688 n2->AppendInput(graph.zone(), n0);
689 n2->AppendInput(graph.zone(), n1);
690 CHECK_EQ(2, n2->InputCount());
691 n2->TrimInputCount(0);
692 CHECK_EQ(0, n2->InputCount());
693 CHECK_EQ(0, n0->UseCount());
694 CHECK_EQ(0, n1->UseCount());
695 CHECK_EQ(0, n2->UseCount());
699 Node* n0 = graph.NewNode(&dummy_operator);
700 Node* n2 = graph.NewNode(&dummy_operator);
701 n2->AppendInput(graph.zone(), n0);
702 n2->AppendInput(graph.zone(), n0);
703 CHECK_EQ(2, n2->InputCount());
704 CHECK_EQ(2, n0->UseCount());
705 n2->TrimInputCount(1);
706 CHECK_EQ(1, n2->InputCount());
707 CHECK_EQ(1, n0->UseCount());
708 CHECK_EQ(0, n2->UseCount());
712 Node* n0 = graph.NewNode(&dummy_operator);
713 Node* n2 = graph.NewNode(&dummy_operator);
714 n2->AppendInput(graph.zone(), n0);
715 n2->AppendInput(graph.zone(), n0);
716 CHECK_EQ(2, n2->InputCount());
717 CHECK_EQ(2, n0->UseCount());
718 n2->TrimInputCount(0);
719 CHECK_EQ(0, n2->InputCount());
720 CHECK_EQ(0, n0->UseCount());
721 CHECK_EQ(0, n2->UseCount());
726 TEST(TrimInputCountOutOfLine2) {
730 Node* n0 = graph.NewNode(&dummy_operator);
731 Node* n1 = graph.NewNode(&dummy_operator);
732 Node* n2 = graph.NewNode(&dummy_operator, n0);
733 n2->AppendInput(graph.zone(), n1);
734 CHECK_EQ(2, n2->InputCount());
735 n2->TrimInputCount(2);
736 CHECK_EQ(2, n2->InputCount());
737 CHECK_EQ(n0, n2->InputAt(0));
738 CHECK_EQ(n1, n2->InputAt(1));
739 CHECK_EQ(1, n0->UseCount());
740 CHECK_EQ(1, n1->UseCount());
741 CHECK_EQ(0, n2->UseCount());
745 Node* n0 = graph.NewNode(&dummy_operator);
746 Node* n1 = graph.NewNode(&dummy_operator);
747 Node* n2 = graph.NewNode(&dummy_operator, n0);
748 n2->AppendInput(graph.zone(), n1);
749 CHECK_EQ(2, n2->InputCount());
750 n2->TrimInputCount(1);
751 CHECK_EQ(1, n2->InputCount());
752 CHECK_EQ(n0, n2->InputAt(0));
753 CHECK_EQ(1, n0->UseCount());
754 CHECK_EQ(0, n1->UseCount());
755 CHECK_EQ(0, n2->UseCount());
759 Node* n0 = graph.NewNode(&dummy_operator);
760 Node* n1 = graph.NewNode(&dummy_operator);
761 Node* n2 = graph.NewNode(&dummy_operator, n0);
762 n2->AppendInput(graph.zone(), n1);
763 CHECK_EQ(2, n2->InputCount());
764 n2->TrimInputCount(0);
765 CHECK_EQ(0, n2->InputCount());
766 CHECK_EQ(0, n0->UseCount());
767 CHECK_EQ(0, n1->UseCount());
768 CHECK_EQ(0, n2->UseCount());
772 Node* n0 = graph.NewNode(&dummy_operator);
773 Node* n2 = graph.NewNode(&dummy_operator, n0);
774 n2->AppendInput(graph.zone(), n0);
775 CHECK_EQ(2, n2->InputCount());
776 CHECK_EQ(2, n0->UseCount());
777 n2->TrimInputCount(1);
778 CHECK_EQ(1, n2->InputCount());
779 CHECK_EQ(1, n0->UseCount());
780 CHECK_EQ(0, n2->UseCount());
784 Node* n0 = graph.NewNode(&dummy_operator);
785 Node* n2 = graph.NewNode(&dummy_operator, n0);
786 n2->AppendInput(graph.zone(), n0);
787 CHECK_EQ(2, n2->InputCount());
788 CHECK_EQ(2, n0->UseCount());
789 n2->TrimInputCount(0);
790 CHECK_EQ(0, n2->InputCount());
791 CHECK_EQ(0, n0->UseCount());
792 CHECK_EQ(0, n2->UseCount());
797 TEST(RemoveAllInputs) {
800 for (int i = 0; i < 2; i++) {
801 Node* n0 = graph.NewNode(&dummy_operator);
802 Node* n1 = graph.NewNode(&dummy_operator, n0);
805 n2 = graph.NewNode(&dummy_operator, n0, n1);
807 n2 = graph.NewNode(&dummy_operator, n0);
808 n2->AppendInput(graph.zone(), n1); // with out-of-line input.
811 n0->RemoveAllInputs();
812 CHECK_EQ(0, n0->InputCount());
814 CHECK_EQ(2, n0->UseCount());
815 n1->RemoveAllInputs();
816 CHECK_EQ(1, n1->InputCount());
817 CHECK_EQ(1, n0->UseCount());
818 CHECK_EQ(NULL, n1->InputAt(0));
820 CHECK_EQ(1, n1->UseCount());
821 n2->RemoveAllInputs();
822 CHECK_EQ(2, n2->InputCount());
823 CHECK_EQ(0, n0->UseCount());
824 CHECK_EQ(0, n1->UseCount());
825 CHECK_EQ(NULL, n2->InputAt(0));
826 CHECK_EQ(NULL, n2->InputAt(1));
830 Node* n0 = graph.NewNode(&dummy_operator);
831 Node* n1 = graph.NewNode(&dummy_operator, n0);
832 n1->ReplaceInput(0, n1); // self-reference.
834 CHECK_EQ(0, n0->UseCount());
835 CHECK_EQ(1, n1->UseCount());
836 n1->RemoveAllInputs();
837 CHECK_EQ(1, n1->InputCount());
838 CHECK_EQ(0, n1->UseCount());
839 CHECK_EQ(NULL, n1->InputAt(0));