1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2013 the V8 project authors. All rights reserved.
2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file.
4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include <functional>
6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/v8.h"
8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "graph-tester.h"
10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/generic-node-inl.h"
11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/node.h"
12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/operator.h"
13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochusing namespace v8::internal;
15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochusing namespace v8::internal::compiler;
16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic SimpleOperator dummy_operator(IrOpcode::kParameter, Operator::kNoWrite,
18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                     0, 0, "dummy");
19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(NodeAllocation) {
21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  GraphTester graph;
22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n1 = graph.NewNode(&dummy_operator);
23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n2 = graph.NewNode(&dummy_operator);
24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(n2->id() != n1->id());
25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(NodeWithOpcode) {
29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  GraphTester graph;
30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n1 = graph.NewNode(&dummy_operator);
31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n2 = graph.NewNode(&dummy_operator);
32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(n1->op() == &dummy_operator);
33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(n2->op() == &dummy_operator);
34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(NodeInputs1) {
38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  GraphTester graph;
39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n0 = graph.NewNode(&dummy_operator);
40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n2 = graph.NewNode(&dummy_operator, n0);
41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(1, n2->InputCount());
42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(n0 == n2->InputAt(0));
43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(NodeInputs2) {
47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  GraphTester graph;
48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n0 = graph.NewNode(&dummy_operator);
49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n1 = graph.NewNode(&dummy_operator);
50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n2 = graph.NewNode(&dummy_operator, n0, n1);
51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(2, n2->InputCount());
52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(n0 == n2->InputAt(0));
53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(n1 == n2->InputAt(1));
54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(NodeInputs3) {
58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  GraphTester graph;
59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n0 = graph.NewNode(&dummy_operator);
60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n1 = graph.NewNode(&dummy_operator);
61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n2 = graph.NewNode(&dummy_operator, n0, n1, n1);
62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(3, n2->InputCount());
63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(n0 == n2->InputAt(0));
64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(n1 == n2->InputAt(1));
65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(n1 == n2->InputAt(2));
66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(NodeInputIteratorEmpty) {
70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  GraphTester graph;
71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n1 = graph.NewNode(&dummy_operator);
72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node::Inputs::iterator i(n1->inputs().begin());
73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int input_count = 0;
74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (; i != n1->inputs().end(); ++i) {
75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    input_count++;
76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(0, input_count);
78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(NodeInputIteratorOne) {
82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  GraphTester graph;
83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n0 = graph.NewNode(&dummy_operator);
84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n1 = graph.NewNode(&dummy_operator, n0);
85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node::Inputs::iterator i(n1->inputs().begin());
86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(1, n1->InputCount());
87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(n0, *i);
88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ++i;
89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(n1->inputs().end() == i);
90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(NodeUseIteratorEmpty) {
94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  GraphTester graph;
95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n1 = graph.NewNode(&dummy_operator);
96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node::Uses::iterator i(n1->uses().begin());
97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int use_count = 0;
98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (; i != n1->uses().end(); ++i) {
99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node::Edge edge(i.edge());
100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    USE(edge);
101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    use_count++;
102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(0, use_count);
104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(NodeUseIteratorOne) {
108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  GraphTester graph;
109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n0 = graph.NewNode(&dummy_operator);
110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n1 = graph.NewNode(&dummy_operator, n0);
111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node::Uses::iterator i(n0->uses().begin());
112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(n1, *i);
113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ++i;
114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(n0->uses().end() == i);
115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(NodeUseIteratorReplaceNoUses) {
119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  GraphTester graph;
120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n0 = graph.NewNode(&dummy_operator);
121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n1 = graph.NewNode(&dummy_operator);
122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n2 = graph.NewNode(&dummy_operator);
123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n3 = graph.NewNode(&dummy_operator, n2);
124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n0->ReplaceUses(n1);
125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(n0->uses().begin() == n0->uses().end());
126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n0->ReplaceUses(n2);
127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(n0->uses().begin() == n0->uses().end());
128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(n3);
129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(NodeUseIteratorReplaceUses) {
133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  GraphTester graph;
134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n0 = graph.NewNode(&dummy_operator);
135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n1 = graph.NewNode(&dummy_operator, n0);
136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n2 = graph.NewNode(&dummy_operator, n0);
137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n3 = graph.NewNode(&dummy_operator);
138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node::Uses::iterator i1(n0->uses().begin());
139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(n1, *i1);
140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ++i1;
141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(n2, *i1);
142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n0->ReplaceUses(n3);
143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node::Uses::iterator i2(n3->uses().begin());
144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(n1, *i2);
145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ++i2;
146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(n2, *i2);
147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node::Inputs::iterator i3(n1->inputs().begin());
148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(n3, *i3);
149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ++i3;
150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(n1->inputs().end() == i3);
151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node::Inputs::iterator i4(n2->inputs().begin());
152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(n3, *i4);
153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ++i4;
154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(n2->inputs().end() == i4);
155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(NodeUseIteratorReplaceUsesSelf) {
159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  GraphTester graph;
160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n0 = graph.NewNode(&dummy_operator);
161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n1 = graph.NewNode(&dummy_operator, n0);
162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n3 = graph.NewNode(&dummy_operator);
163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n1->ReplaceInput(0, n1);  // Create self-reference.
165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node::Uses::iterator i1(n1->uses().begin());
167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(n1, *i1);
168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n1->ReplaceUses(n3);
170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(n1->uses().begin() == n1->uses().end());
172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node::Uses::iterator i2(n3->uses().begin());
174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(n1, *i2);
175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ++i2;
176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(n1->uses().end() == i2);
177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(ReplaceInput) {
181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  GraphTester graph;
182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n0 = graph.NewNode(&dummy_operator);
183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n1 = graph.NewNode(&dummy_operator);
184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n2 = graph.NewNode(&dummy_operator);
185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n3 = graph.NewNode(&dummy_operator, n0, n1, n2);
186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node::Inputs::iterator i1(n3->inputs().begin());
187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(n0 == *i1);
188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(n0, n3->InputAt(0));
189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ++i1;
190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(n1, *i1);
191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(n1, n3->InputAt(1));
192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ++i1;
193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(n2, *i1);
194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(n2, n3->InputAt(2));
195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ++i1;
196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(i1 == n3->inputs().end());
197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node::Uses::iterator i2(n1->uses().begin());
199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(n3, *i2);
200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ++i2;
201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(i2 == n1->uses().end());
202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n4 = graph.NewNode(&dummy_operator);
204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node::Uses::iterator i3(n4->uses().begin());
205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(i3 == n4->uses().end());
206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n3->ReplaceInput(1, n4);
208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node::Uses::iterator i4(n1->uses().begin());
210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(i4 == n1->uses().end());
211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node::Uses::iterator i5(n4->uses().begin());
213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(n3, *i5);
214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ++i5;
215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(i5 == n4->uses().end());
216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node::Inputs::iterator i6(n3->inputs().begin());
218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(n0 == *i6);
219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(n0, n3->InputAt(0));
220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ++i6;
221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(n4, *i6);
222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(n4, n3->InputAt(1));
223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ++i6;
224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(n2, *i6);
225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(n2, n3->InputAt(2));
226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ++i6;
227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(i6 == n3->inputs().end());
228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(OwnedBy) {
232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  GraphTester graph;
233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n0 = graph.NewNode(&dummy_operator);
236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n1 = graph.NewNode(&dummy_operator);
237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(!n0->OwnedBy(n1));
239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(!n1->OwnedBy(n0));
240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n2 = graph.NewNode(&dummy_operator, n0);
242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(n0->OwnedBy(n2));
243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(!n2->OwnedBy(n0));
244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n3 = graph.NewNode(&dummy_operator, n0);
246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(!n0->OwnedBy(n2));
247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(!n0->OwnedBy(n3));
248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(!n2->OwnedBy(n0));
249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(!n3->OwnedBy(n0));
250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n0 = graph.NewNode(&dummy_operator);
254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n1 = graph.NewNode(&dummy_operator, n0);
255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(n0->OwnedBy(n1));
256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(!n1->OwnedBy(n0));
257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n2 = graph.NewNode(&dummy_operator, n0);
258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(!n0->OwnedBy(n1));
259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(!n0->OwnedBy(n2));
260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(!n1->OwnedBy(n0));
261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(!n1->OwnedBy(n2));
262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(!n2->OwnedBy(n0));
263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(!n2->OwnedBy(n1));
264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n3 = graph.NewNode(&dummy_operator);
266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    n2->ReplaceInput(0, n3);
267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(n0->OwnedBy(n1));
269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(!n1->OwnedBy(n0));
270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(!n1->OwnedBy(n0));
271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(!n1->OwnedBy(n2));
272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(!n2->OwnedBy(n0));
273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(!n2->OwnedBy(n1));
274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(n3->OwnedBy(n2));
275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(!n2->OwnedBy(n3));
276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(Uses) {
281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  GraphTester graph;
282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n0 = graph.NewNode(&dummy_operator);
284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n1 = graph.NewNode(&dummy_operator, n0);
285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(1, n0->UseCount());
286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  printf("A: %d vs %d\n", n0->UseAt(0)->id(), n1->id());
287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(n0->UseAt(0) == n1);
288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n2 = graph.NewNode(&dummy_operator, n0);
289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(2, n0->UseCount());
290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  printf("B: %d vs %d\n", n0->UseAt(1)->id(), n2->id());
291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(n0->UseAt(1) == n2);
292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n3 = graph.NewNode(&dummy_operator, n0);
293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(3, n0->UseCount());
294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(n0->UseAt(2) == n3);
295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(Inputs) {
299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  GraphTester graph;
300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n0 = graph.NewNode(&dummy_operator);
302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n1 = graph.NewNode(&dummy_operator, n0);
303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n2 = graph.NewNode(&dummy_operator, n0);
304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n3 = graph.NewNode(&dummy_operator, n0, n1, n2);
305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(3, n3->InputCount());
306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(n3->InputAt(0) == n0);
307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(n3->InputAt(1) == n1);
308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(n3->InputAt(2) == n2);
309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n4 = graph.NewNode(&dummy_operator, n0, n1, n2);
310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n3->AppendInput(graph.zone(), n4);
311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(4, n3->InputCount());
312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(n3->InputAt(0) == n0);
313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(n3->InputAt(1) == n1);
314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(n3->InputAt(2) == n2);
315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(n3->InputAt(3) == n4);
316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n5 = graph.NewNode(&dummy_operator, n4);
317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n3->AppendInput(graph.zone(), n4);
318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(5, n3->InputCount());
319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(n3->InputAt(0) == n0);
320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(n3->InputAt(1) == n1);
321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(n3->InputAt(2) == n2);
322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(n3->InputAt(3) == n4);
323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(n3->InputAt(4) == n4);
324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Make sure uses have been hooked op correctly.
326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node::Uses uses(n4->uses());
327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node::Uses::iterator current = uses.begin();
328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(current != uses.end());
329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(*current == n3);
330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ++current;
331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(current != uses.end());
332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(*current == n5);
333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ++current;
334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(current != uses.end());
335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(*current == n3);
336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ++current;
337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(current == uses.end());
338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RemoveInput) {
342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  GraphTester graph;
343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n0 = graph.NewNode(&dummy_operator);
345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n1 = graph.NewNode(&dummy_operator, n0);
346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n2 = graph.NewNode(&dummy_operator, n0, n1);
347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n1->RemoveInput(0);
349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(0, n1->InputCount());
350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(1, n0->UseCount());
351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n2->RemoveInput(0);
353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(1, n2->InputCount());
354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(0, n0->UseCount());
355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(1, n1->UseCount());
356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n2->RemoveInput(0);
358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(0, n2->InputCount());
359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(AppendInputsAndIterator) {
363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  GraphTester graph;
364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n0 = graph.NewNode(&dummy_operator);
366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n1 = graph.NewNode(&dummy_operator, n0);
367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n2 = graph.NewNode(&dummy_operator, n0, n1);
368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node::Inputs inputs(n2->inputs());
370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node::Inputs::iterator current = inputs.begin();
371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(current != inputs.end());
372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(*current == n0);
373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ++current;
374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(current != inputs.end());
375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(*current == n1);
376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ++current;
377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(current == inputs.end());
378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n3 = graph.NewNode(&dummy_operator);
380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n2->AppendInput(graph.zone(), n3);
381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  inputs = n2->inputs();
382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  current = inputs.begin();
383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(current != inputs.end());
384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(*current == n0);
385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(0, current.index());
386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ++current;
387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(current != inputs.end());
388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(*current == n1);
389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(1, current.index());
390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ++current;
391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(current != inputs.end());
392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(*current == n3);
393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(2, current.index());
394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ++current;
395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(current == inputs.end());
396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(NullInputsSimple) {
400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  GraphTester graph;
401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n0 = graph.NewNode(&dummy_operator);
403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n1 = graph.NewNode(&dummy_operator, n0);
404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n2 = graph.NewNode(&dummy_operator, n0, n1);
405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(2, n2->InputCount());
406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(n0 == n2->InputAt(0));
408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(n1 == n2->InputAt(1));
409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(2, n0->UseCount());
410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n2->ReplaceInput(0, NULL);
411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(NULL == n2->InputAt(0));
412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(n1 == n2->InputAt(1));
413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(1, n0->UseCount());
414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(NullInputsAppended) {
418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  GraphTester graph;
419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n0 = graph.NewNode(&dummy_operator);
421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n1 = graph.NewNode(&dummy_operator, n0);
422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n2 = graph.NewNode(&dummy_operator, n0);
423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n3 = graph.NewNode(&dummy_operator, n0);
424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n3->AppendInput(graph.zone(), n1);
425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n3->AppendInput(graph.zone(), n2);
426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(3, n3->InputCount());
427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(n0 == n3->InputAt(0));
429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(n1 == n3->InputAt(1));
430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(n2 == n3->InputAt(2));
431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(1, n1->UseCount());
432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n3->ReplaceInput(1, NULL);
433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(n0 == n3->InputAt(0));
434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(NULL == n3->InputAt(1));
435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(n2 == n3->InputAt(2));
436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(0, n1->UseCount());
437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(ReplaceUsesFromAppendedInputs) {
441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  GraphTester graph;
442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n0 = graph.NewNode(&dummy_operator);
444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n1 = graph.NewNode(&dummy_operator, n0);
445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n2 = graph.NewNode(&dummy_operator, n0);
446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n3 = graph.NewNode(&dummy_operator);
447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n2->AppendInput(graph.zone(), n1);
448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n2->AppendInput(graph.zone(), n0);
449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(0, n3->UseCount());
450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(3, n0->UseCount());
451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n0->ReplaceUses(n3);
452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(0, n0->UseCount());
453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(3, n3->UseCount());
454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node::Uses uses(n3->uses());
456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node::Uses::iterator current = uses.begin();
457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(current != uses.end());
458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(*current == n1);
459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ++current;
460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(current != uses.end());
461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(*current == n2);
462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ++current;
463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(current != uses.end());
464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(*current == n2);
465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ++current;
466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(current == uses.end());
467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <bool result>
471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstruct FixedPredicate {
472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool operator()(const Node* node) const { return result; }
473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(ReplaceUsesIfWithFixedPredicate) {
477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  GraphTester graph;
478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n0 = graph.NewNode(&dummy_operator);
480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n1 = graph.NewNode(&dummy_operator, n0);
481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n2 = graph.NewNode(&dummy_operator, n0);
482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n3 = graph.NewNode(&dummy_operator);
483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(0, n2->UseCount());
485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n2->ReplaceUsesIf(FixedPredicate<true>(), n1);
486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(0, n2->UseCount());
487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n2->ReplaceUsesIf(FixedPredicate<false>(), n1);
488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(0, n2->UseCount());
489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(0, n3->UseCount());
491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n3->ReplaceUsesIf(FixedPredicate<true>(), n1);
492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(0, n3->UseCount());
493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n3->ReplaceUsesIf(FixedPredicate<false>(), n1);
494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(0, n3->UseCount());
495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(2, n0->UseCount());
497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(0, n1->UseCount());
498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n0->ReplaceUsesIf(FixedPredicate<false>(), n1);
499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(2, n0->UseCount());
500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(0, n1->UseCount());
501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n0->ReplaceUsesIf(FixedPredicate<true>(), n1);
502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(0, n0->UseCount());
503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(2, n1->UseCount());
504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n1->AppendInput(graph.zone(), n1);
506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(3, n1->UseCount());
507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n1->AppendInput(graph.zone(), n3);
508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(1, n3->UseCount());
509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n3->ReplaceUsesIf(FixedPredicate<true>(), n1);
510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(4, n1->UseCount());
511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(0, n3->UseCount());
512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n1->ReplaceUsesIf(FixedPredicate<false>(), n3);
513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(4, n1->UseCount());
514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(0, n3->UseCount());
515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(ReplaceUsesIfWithEqualTo) {
519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  GraphTester graph;
520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n0 = graph.NewNode(&dummy_operator);
522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n1 = graph.NewNode(&dummy_operator, n0);
523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n2 = graph.NewNode(&dummy_operator, n0, n1);
524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(0, n2->UseCount());
526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n2->ReplaceUsesIf(std::bind1st(std::equal_to<Node*>(), n1), n0);
527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(0, n2->UseCount());
528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(2, n0->UseCount());
530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(1, n1->UseCount());
531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n1->ReplaceUsesIf(std::bind1st(std::equal_to<Node*>(), n0), n0);
532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(2, n0->UseCount());
533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(1, n1->UseCount());
534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n0->ReplaceUsesIf(std::bind2nd(std::equal_to<Node*>(), n2), n1);
535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(1, n0->UseCount());
536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(2, n1->UseCount());
537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(ReplaceInputMultipleUses) {
541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  GraphTester graph;
542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n0 = graph.NewNode(&dummy_operator);
544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n1 = graph.NewNode(&dummy_operator);
545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n2 = graph.NewNode(&dummy_operator, n0);
546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n2->ReplaceInput(0, n1);
547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(0, n0->UseCount());
548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(1, n1->UseCount());
549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* n3 = graph.NewNode(&dummy_operator, n0);
551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  n3->ReplaceInput(0, n1);
552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(0, n0->UseCount());
553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(2, n1->UseCount());
554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(TrimInputCountInline) {
558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  GraphTester graph;
559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n0 = graph.NewNode(&dummy_operator);
562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n1 = graph.NewNode(&dummy_operator, n0);
563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    n1->TrimInputCount(1);
564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(1, n1->InputCount());
565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(n0, n1->InputAt(0));
566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(1, n0->UseCount());
567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n0 = graph.NewNode(&dummy_operator);
571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n1 = graph.NewNode(&dummy_operator, n0);
572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    n1->TrimInputCount(0);
573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(0, n1->InputCount());
574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(0, n0->UseCount());
575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n0 = graph.NewNode(&dummy_operator);
579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n1 = graph.NewNode(&dummy_operator);
580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n2 = graph.NewNode(&dummy_operator, n0, n1);
581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    n2->TrimInputCount(2);
582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(2, n2->InputCount());
583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(1, n0->UseCount());
584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(1, n1->UseCount());
585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(0, n2->UseCount());
586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n0 = graph.NewNode(&dummy_operator);
590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n1 = graph.NewNode(&dummy_operator);
591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n2 = graph.NewNode(&dummy_operator, n0, n1);
592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    n2->TrimInputCount(1);
593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(1, n2->InputCount());
594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(1, n0->UseCount());
595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(0, n1->UseCount());
596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(0, n2->UseCount());
597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n0 = graph.NewNode(&dummy_operator);
601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n1 = graph.NewNode(&dummy_operator);
602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n2 = graph.NewNode(&dummy_operator, n0, n1);
603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    n2->TrimInputCount(0);
604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(0, n2->InputCount());
605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(0, n0->UseCount());
606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(0, n1->UseCount());
607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(0, n2->UseCount());
608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n0 = graph.NewNode(&dummy_operator);
612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n2 = graph.NewNode(&dummy_operator, n0, n0);
613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    n2->TrimInputCount(1);
614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(1, n2->InputCount());
615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(1, n0->UseCount());
616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(0, n2->UseCount());
617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n0 = graph.NewNode(&dummy_operator);
621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n2 = graph.NewNode(&dummy_operator, n0, n0);
622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    n2->TrimInputCount(0);
623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(0, n2->InputCount());
624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(0, n0->UseCount());
625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(0, n2->UseCount());
626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(TrimInputCountOutOfLine1) {
631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  GraphTester graph;
632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n0 = graph.NewNode(&dummy_operator);
635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n1 = graph.NewNode(&dummy_operator);
636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    n1->AppendInput(graph.zone(), n0);
637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    n1->TrimInputCount(1);
638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(1, n1->InputCount());
639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(n0, n1->InputAt(0));
640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(1, n0->UseCount());
641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n0 = graph.NewNode(&dummy_operator);
645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n1 = graph.NewNode(&dummy_operator);
646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    n1->AppendInput(graph.zone(), n0);
647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(1, n1->InputCount());
648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    n1->TrimInputCount(0);
649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(0, n1->InputCount());
650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(0, n0->UseCount());
651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n0 = graph.NewNode(&dummy_operator);
655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n1 = graph.NewNode(&dummy_operator);
656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n2 = graph.NewNode(&dummy_operator);
657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    n2->AppendInput(graph.zone(), n0);
658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    n2->AppendInput(graph.zone(), n1);
659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(2, n2->InputCount());
660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    n2->TrimInputCount(2);
661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(2, n2->InputCount());
662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(n0, n2->InputAt(0));
663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(n1, n2->InputAt(1));
664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(1, n0->UseCount());
665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(1, n1->UseCount());
666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(0, n2->UseCount());
667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n0 = graph.NewNode(&dummy_operator);
671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n1 = graph.NewNode(&dummy_operator);
672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n2 = graph.NewNode(&dummy_operator);
673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    n2->AppendInput(graph.zone(), n0);
674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    n2->AppendInput(graph.zone(), n1);
675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(2, n2->InputCount());
676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    n2->TrimInputCount(1);
677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(1, n2->InputCount());
678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(n0, n2->InputAt(0));
679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(1, n0->UseCount());
680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(0, n1->UseCount());
681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(0, n2->UseCount());
682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n0 = graph.NewNode(&dummy_operator);
686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n1 = graph.NewNode(&dummy_operator);
687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n2 = graph.NewNode(&dummy_operator);
688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    n2->AppendInput(graph.zone(), n0);
689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    n2->AppendInput(graph.zone(), n1);
690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(2, n2->InputCount());
691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    n2->TrimInputCount(0);
692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(0, n2->InputCount());
693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(0, n0->UseCount());
694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(0, n1->UseCount());
695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(0, n2->UseCount());
696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n0 = graph.NewNode(&dummy_operator);
700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n2 = graph.NewNode(&dummy_operator);
701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    n2->AppendInput(graph.zone(), n0);
702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    n2->AppendInput(graph.zone(), n0);
703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(2, n2->InputCount());
704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(2, n0->UseCount());
705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    n2->TrimInputCount(1);
706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(1, n2->InputCount());
707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(1, n0->UseCount());
708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(0, n2->UseCount());
709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n0 = graph.NewNode(&dummy_operator);
713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n2 = graph.NewNode(&dummy_operator);
714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    n2->AppendInput(graph.zone(), n0);
715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    n2->AppendInput(graph.zone(), n0);
716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(2, n2->InputCount());
717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(2, n0->UseCount());
718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    n2->TrimInputCount(0);
719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(0, n2->InputCount());
720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(0, n0->UseCount());
721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(0, n2->UseCount());
722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(TrimInputCountOutOfLine2) {
727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  GraphTester graph;
728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n0 = graph.NewNode(&dummy_operator);
731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n1 = graph.NewNode(&dummy_operator);
732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n2 = graph.NewNode(&dummy_operator, n0);
733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    n2->AppendInput(graph.zone(), n1);
734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(2, n2->InputCount());
735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    n2->TrimInputCount(2);
736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(2, n2->InputCount());
737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(n0, n2->InputAt(0));
738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(n1, n2->InputAt(1));
739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(1, n0->UseCount());
740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(1, n1->UseCount());
741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(0, n2->UseCount());
742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n0 = graph.NewNode(&dummy_operator);
746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n1 = graph.NewNode(&dummy_operator);
747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n2 = graph.NewNode(&dummy_operator, n0);
748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    n2->AppendInput(graph.zone(), n1);
749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(2, n2->InputCount());
750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    n2->TrimInputCount(1);
751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(1, n2->InputCount());
752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(n0, n2->InputAt(0));
753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(1, n0->UseCount());
754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(0, n1->UseCount());
755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(0, n2->UseCount());
756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n0 = graph.NewNode(&dummy_operator);
760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n1 = graph.NewNode(&dummy_operator);
761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n2 = graph.NewNode(&dummy_operator, n0);
762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    n2->AppendInput(graph.zone(), n1);
763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(2, n2->InputCount());
764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    n2->TrimInputCount(0);
765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(0, n2->InputCount());
766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(0, n0->UseCount());
767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(0, n1->UseCount());
768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(0, n2->UseCount());
769b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n0 = graph.NewNode(&dummy_operator);
773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n2 = graph.NewNode(&dummy_operator, n0);
774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    n2->AppendInput(graph.zone(), n0);
775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(2, n2->InputCount());
776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(2, n0->UseCount());
777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    n2->TrimInputCount(1);
778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(1, n2->InputCount());
779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(1, n0->UseCount());
780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(0, n2->UseCount());
781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n0 = graph.NewNode(&dummy_operator);
785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n2 = graph.NewNode(&dummy_operator, n0);
786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    n2->AppendInput(graph.zone(), n0);
787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(2, n2->InputCount());
788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(2, n0->UseCount());
789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    n2->TrimInputCount(0);
790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(0, n2->InputCount());
791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(0, n0->UseCount());
792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(0, n2->UseCount());
793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RemoveAllInputs) {
798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  GraphTester graph;
799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int i = 0; i < 2; i++) {
801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n0 = graph.NewNode(&dummy_operator);
802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n1 = graph.NewNode(&dummy_operator, n0);
803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n2;
804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (i == 0) {
805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      n2 = graph.NewNode(&dummy_operator, n0, n1);
806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      n2 = graph.NewNode(&dummy_operator, n0);
808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      n2->AppendInput(graph.zone(), n1);  // with out-of-line input.
809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    n0->RemoveAllInputs();
812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(0, n0->InputCount());
813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(2, n0->UseCount());
815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    n1->RemoveAllInputs();
816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(1, n1->InputCount());
817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(1, n0->UseCount());
818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(NULL, n1->InputAt(0));
819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(1, n1->UseCount());
821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    n2->RemoveAllInputs();
822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(2, n2->InputCount());
823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(0, n0->UseCount());
824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(0, n1->UseCount());
825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(NULL, n2->InputAt(0));
826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(NULL, n2->InputAt(1));
827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n0 = graph.NewNode(&dummy_operator);
831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* n1 = graph.NewNode(&dummy_operator, n0);
832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    n1->ReplaceInput(0, n1);  // self-reference.
833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(0, n0->UseCount());
835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(1, n1->UseCount());
836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    n1->RemoveAllInputs();
837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(1, n1->InputCount());
838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(0, n1->UseCount());
839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(NULL, n1->InputAt(0));
840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
842