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

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

Issue 1022783002: [turbofan] Remove last_use_ field from Node. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <functional> 5 #include <functional>
6 6
7 #include "src/v8.h" 7 #include "src/v8.h"
8 8
9 #include "graph-tester.h" 9 #include "graph-tester.h"
10 #include "src/compiler/node.h" 10 #include "src/compiler/node.h"
11 #include "src/compiler/operator.h" 11 #include "src/compiler/operator.h"
12 12
13 using namespace v8::internal; 13 using namespace v8::internal;
14 using namespace v8::internal::compiler; 14 using namespace v8::internal::compiler;
15 15
16 #define NONE reinterpret_cast<Node*>(1)
17
16 static Operator dummy_operator(IrOpcode::kParameter, Operator::kNoWrite, 18 static Operator dummy_operator(IrOpcode::kParameter, Operator::kNoWrite,
17 "dummy", 0, 0, 0, 1, 0, 0); 19 "dummy", 0, 0, 0, 1, 0, 0);
18 20
21 #define CHECK_USES(node, ...) \
22 do { \
23 Node* __array[] = {__VA_ARGS__}; \
24 size_t __size = __array[0] != NONE ? arraysize(__array) : 0; \
25 CheckUseChain(node, __array, __size); \
26 } while (false)
27
28
29 typedef std::multiset<Node*, std::less<Node*>> NodeMSet;
30
31 static void CheckUseChain(Node* node, Node** uses, size_t use_count) {
32 // Check ownership.
33 if (use_count == 1) CHECK(node->OwnedBy(uses[0]));
34 if (use_count > 1) {
35 for (size_t i = 0; i < use_count; i++) {
36 CHECK(!node->OwnedBy(uses[i]));
37 }
38 }
39
40 // Check the self-reported use count.
41 CHECK_EQ(use_count, node->UseCount());
42
43 // Build the expectation set.
44 NodeMSet expect_set;
45 for (size_t i = 0; i < use_count; i++) {
46 expect_set.insert(uses[i]);
47 }
48
49 {
50 // Check that iterating over the uses gives the right counts.
51 NodeMSet use_set;
52 for (auto use : node->uses()) {
53 use_set.insert(use);
54 }
55 CHECK(expect_set == use_set);
56 }
57
58 {
59 // Check that iterating over the use edges gives the right counts,
60 // input indices, from(), and to() pointers.
61 NodeMSet use_set;
62 for (auto edge : node->use_edges()) {
63 CHECK_EQ(node, edge.to());
64 CHECK_EQ(node, edge.from()->InputAt(edge.index()));
65 use_set.insert(edge.from());
66 }
67 CHECK(expect_set == use_set);
68 }
69
70 {
71 // Check the use nodes actually have the node as inputs.
72 for (Node* use : node->uses()) {
73 size_t count = 0;
74 for (Node* input : use->inputs()) {
75 if (input == node) count++;
76 }
77 CHECK_EQ(count, expect_set.count(use));
78 }
79 }
80 }
81
82
83 #define CHECK_INPUTS(node, ...) \
84 do { \
85 Node* __array[] = {__VA_ARGS__}; \
86 size_t __size = __array[0] != NONE ? arraysize(__array) : 0; \
87 CheckInputs(node, __array, __size); \
88 } while (false)
89
90
91 static void CheckInputs(Node* node, Node** inputs, size_t input_count) {
92 CHECK_EQ(static_cast<int>(input_count), node->InputCount());
93 // Check InputAt().
94 for (size_t i = 0; i < input_count; i++) {
95 CHECK_EQ(inputs[i], node->InputAt(i));
96 }
97
98 // Check input iterator.
99 int index = 0;
100 for (Node* input : node->inputs()) {
101 CHECK_EQ(inputs[index], input);
102 index++;
103 }
104
105 // Check use lists of inputs.
106 for (int i = 0; i < static_cast<int>(input_count); i++) {
107 Node* input = inputs[i];
108 if (!input) continue; // skip null inputs
109 bool found = false;
110 // Check regular use list.
111 for (Node* use : input->uses()) {
112 if (use == node) {
113 found = true;
114 break;
115 }
116 }
117 CHECK(found);
118 int count = 0;
119 // Check use edge list.
120 for (auto edge : input->use_edges()) {
121 if (edge.from() == node && edge.to() == input && edge.index() == i) {
122 count++;
123 }
124 }
125 CHECK_EQ(1, count);
126 }
127 }
128
129
19 TEST(NodeUseIteratorReplaceUses) { 130 TEST(NodeUseIteratorReplaceUses) {
20 GraphTester graph; 131 GraphTester graph;
21 Node* n0 = graph.NewNode(&dummy_operator); 132 Node* n0 = graph.NewNode(&dummy_operator);
22 Node* n1 = graph.NewNode(&dummy_operator, n0); 133 Node* n1 = graph.NewNode(&dummy_operator, n0);
23 Node* n2 = graph.NewNode(&dummy_operator, n0); 134 Node* n2 = graph.NewNode(&dummy_operator, n0);
24 Node* n3 = graph.NewNode(&dummy_operator); 135 Node* n3 = graph.NewNode(&dummy_operator);
25 auto i1(n0->uses().begin()); 136
26 CHECK_EQ(n1, *i1); 137 CHECK_USES(n0, n1, n2);
27 ++i1; 138
28 CHECK_EQ(n2, *i1); 139 CHECK_INPUTS(n1, n0);
140 CHECK_INPUTS(n2, n0);
141
29 n0->ReplaceUses(n3); 142 n0->ReplaceUses(n3);
30 auto i2(n3->uses().begin()); 143
31 CHECK_EQ(n1, *i2); 144 CHECK_USES(n0, NONE);
32 ++i2; 145 CHECK_USES(n1, NONE);
33 CHECK_EQ(n2, *i2); 146 CHECK_USES(n2, NONE);
34 auto i3(n1->inputs().begin()); 147 CHECK_USES(n3, n1, n2);
35 CHECK_EQ(n3, *i3); 148
36 ++i3; 149 CHECK_INPUTS(n1, n3);
37 CHECK(n1->inputs().end() == i3); 150 CHECK_INPUTS(n2, n3);
38 auto i4(n2->inputs().begin());
39 CHECK_EQ(n3, *i4);
40 ++i4;
41 CHECK(n2->inputs().end() == i4);
42 } 151 }
43 152
44 153
45 TEST(NodeUseIteratorReplaceUsesSelf) { 154 TEST(NodeUseIteratorReplaceUsesSelf) {
46 GraphTester graph; 155 GraphTester graph;
47 Node* n0 = graph.NewNode(&dummy_operator); 156 Node* n0 = graph.NewNode(&dummy_operator);
48 Node* n1 = graph.NewNode(&dummy_operator, n0); 157 Node* n1 = graph.NewNode(&dummy_operator, n0);
49 Node* n3 = graph.NewNode(&dummy_operator); 158
159 CHECK_USES(n0, n1);
160 CHECK_USES(n1, NONE);
50 161
51 n1->ReplaceInput(0, n1); // Create self-reference. 162 n1->ReplaceInput(0, n1); // Create self-reference.
52 163
53 auto i1(n1->uses().begin()); 164 CHECK_USES(n0, NONE);
54 CHECK_EQ(n1, *i1); 165 CHECK_USES(n1, n1);
55 166
56 n1->ReplaceUses(n3); 167 Node* n2 = graph.NewNode(&dummy_operator);
57 168
58 CHECK(n1->uses().begin() == n1->uses().end()); 169 n1->ReplaceUses(n2);
59 170
60 auto i2(n3->uses().begin()); 171 CHECK_USES(n0, NONE);
61 CHECK_EQ(n1, *i2); 172 CHECK_USES(n1, NONE);
62 ++i2; 173 CHECK_USES(n2, n1);
63 CHECK(n1->uses().end() == i2);
64 } 174 }
65 175
66 176
67 TEST(ReplaceInput) { 177 TEST(ReplaceInput) {
68 GraphTester graph; 178 GraphTester graph;
69 Node* n0 = graph.NewNode(&dummy_operator); 179 Node* n0 = graph.NewNode(&dummy_operator);
70 Node* n1 = graph.NewNode(&dummy_operator); 180 Node* n1 = graph.NewNode(&dummy_operator);
71 Node* n2 = graph.NewNode(&dummy_operator); 181 Node* n2 = graph.NewNode(&dummy_operator);
72 Node* n3 = graph.NewNode(&dummy_operator, n0, n1, n2); 182 Node* n3 = graph.NewNode(&dummy_operator, n0, n1, n2);
73 auto i1(n3->inputs().begin()); 183 Node* n4 = graph.NewNode(&dummy_operator);
74 CHECK(n0 == *i1);
75 CHECK_EQ(n0, n3->InputAt(0));
76 ++i1;
77 CHECK_EQ(n1, *i1);
78 CHECK_EQ(n1, n3->InputAt(1));
79 ++i1;
80 CHECK_EQ(n2, *i1);
81 CHECK_EQ(n2, n3->InputAt(2));
82 ++i1;
83 CHECK(i1 == n3->inputs().end());
84 184
85 auto i2(n1->uses().begin()); 185 CHECK_USES(n0, n3);
86 CHECK_EQ(n3, *i2); 186 CHECK_USES(n1, n3);
87 ++i2; 187 CHECK_USES(n2, n3);
88 CHECK(i2 == n1->uses().end()); 188 CHECK_USES(n3, NONE);
189 CHECK_USES(n4, NONE);
89 190
90 Node* n4 = graph.NewNode(&dummy_operator); 191 CHECK_INPUTS(n3, n0, n1, n2);
91 auto i3(n4->uses().begin());
92 CHECK(i3 == n4->uses().end());
93 192
94 n3->ReplaceInput(1, n4); 193 n3->ReplaceInput(1, n4);
95 194
96 auto i4(n1->uses().begin()); 195 CHECK_USES(n1, NONE);
97 CHECK(i4 == n1->uses().end()); 196 CHECK_USES(n4, n3);
98 197
99 auto i5(n4->uses().begin()); 198 CHECK_INPUTS(n3, n0, n4, n2);
100 CHECK_EQ(n3, *i5);
101 ++i5;
102 CHECK(i5 == n4->uses().end());
103
104 auto i6(n3->inputs().begin());
105 CHECK(n0 == *i6);
106 CHECK_EQ(n0, n3->InputAt(0));
107 ++i6;
108 CHECK_EQ(n4, *i6);
109 CHECK_EQ(n4, n3->InputAt(1));
110 ++i6;
111 CHECK_EQ(n2, *i6);
112 CHECK_EQ(n2, n3->InputAt(2));
113 ++i6;
114 CHECK(i6 == n3->inputs().end());
115 } 199 }
116 200
117 201
118 TEST(OwnedBy) { 202 TEST(OwnedBy) {
119 GraphTester graph; 203 GraphTester graph;
120 204
121 { 205 {
122 Node* n0 = graph.NewNode(&dummy_operator); 206 Node* n0 = graph.NewNode(&dummy_operator);
123 Node* n1 = graph.NewNode(&dummy_operator); 207 Node* n1 = graph.NewNode(&dummy_operator);
124 208
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
162 CHECK(!n2->OwnedBy(n3)); 246 CHECK(!n2->OwnedBy(n3));
163 } 247 }
164 } 248 }
165 249
166 250
167 TEST(Uses) { 251 TEST(Uses) {
168 GraphTester graph; 252 GraphTester graph;
169 253
170 Node* n0 = graph.NewNode(&dummy_operator); 254 Node* n0 = graph.NewNode(&dummy_operator);
171 Node* n1 = graph.NewNode(&dummy_operator, n0); 255 Node* n1 = graph.NewNode(&dummy_operator, n0);
172 CHECK_EQ(1, n0->UseCount()); 256
173 printf("A: %d vs %d\n", n0->UseAt(0)->id(), n1->id()); 257 CHECK_USES(n0, n1);
174 CHECK(n0->UseAt(0) == n1); 258 CHECK_USES(n1, NONE);
259
175 Node* n2 = graph.NewNode(&dummy_operator, n0); 260 Node* n2 = graph.NewNode(&dummy_operator, n0);
176 CHECK_EQ(2, n0->UseCount()); 261
177 printf("B: %d vs %d\n", n0->UseAt(1)->id(), n2->id()); 262 CHECK_USES(n0, n1, n2);
178 CHECK(n0->UseAt(1) == n2); 263 CHECK_USES(n2, NONE);
264
179 Node* n3 = graph.NewNode(&dummy_operator, n0); 265 Node* n3 = graph.NewNode(&dummy_operator, n0);
180 CHECK_EQ(3, n0->UseCount()); 266
181 CHECK(n0->UseAt(2) == n3); 267 CHECK_USES(n0, n1, n2, n3);
268 CHECK_USES(n3, NONE);
182 } 269 }
183 270
184 271
185 TEST(Inputs) { 272 TEST(Inputs) {
186 GraphTester graph; 273 GraphTester graph;
187 274
188 Node* n0 = graph.NewNode(&dummy_operator); 275 Node* n0 = graph.NewNode(&dummy_operator);
189 Node* n1 = graph.NewNode(&dummy_operator, n0); 276 Node* n1 = graph.NewNode(&dummy_operator, n0);
190 Node* n2 = graph.NewNode(&dummy_operator, n0); 277 Node* n2 = graph.NewNode(&dummy_operator, n0);
191 Node* n3 = graph.NewNode(&dummy_operator, n0, n1, n2); 278 Node* n3 = graph.NewNode(&dummy_operator, n0, n1, n2);
192 CHECK_EQ(3, n3->InputCount()); 279
193 CHECK(n3->InputAt(0) == n0); 280 CHECK_INPUTS(n3, n0, n1, n2);
194 CHECK(n3->InputAt(1) == n1); 281
195 CHECK(n3->InputAt(2) == n2);
196 Node* n4 = graph.NewNode(&dummy_operator, n0, n1, n2); 282 Node* n4 = graph.NewNode(&dummy_operator, n0, n1, n2);
197 n3->AppendInput(graph.zone(), n4); 283 n3->AppendInput(graph.zone(), n4);
198 CHECK_EQ(4, n3->InputCount()); 284
199 CHECK(n3->InputAt(0) == n0); 285 CHECK_INPUTS(n3, n0, n1, n2, n4);
200 CHECK(n3->InputAt(1) == n1); 286 CHECK_USES(n4, n3);
201 CHECK(n3->InputAt(2) == n2); 287
202 CHECK(n3->InputAt(3) == n4); 288 n3->AppendInput(graph.zone(), n4);
289
290 CHECK_INPUTS(n3, n0, n1, n2, n4, n4);
291 CHECK_USES(n4, n3, n3);
292
203 Node* n5 = graph.NewNode(&dummy_operator, n4); 293 Node* n5 = graph.NewNode(&dummy_operator, n4);
204 n3->AppendInput(graph.zone(), n4);
205 CHECK_EQ(5, n3->InputCount());
206 CHECK(n3->InputAt(0) == n0);
207 CHECK(n3->InputAt(1) == n1);
208 CHECK(n3->InputAt(2) == n2);
209 CHECK(n3->InputAt(3) == n4);
210 CHECK(n3->InputAt(4) == n4);
211 294
212 // Make sure uses have been hooked op correctly. 295 CHECK_USES(n4, n3, n3, n5);
213 Node::Uses uses(n4->uses());
214 auto current = uses.begin();
215 CHECK(current != uses.end());
216 CHECK(*current == n3);
217 ++current;
218 CHECK(current != uses.end());
219 CHECK(*current == n5);
220 ++current;
221 CHECK(current != uses.end());
222 CHECK(*current == n3);
223 ++current;
224 CHECK(current == uses.end());
225 } 296 }
226 297
227 298
228 TEST(RemoveInput) { 299 TEST(RemoveInput) {
229 GraphTester graph; 300 GraphTester graph;
230 301
231 Node* n0 = graph.NewNode(&dummy_operator); 302 Node* n0 = graph.NewNode(&dummy_operator);
232 Node* n1 = graph.NewNode(&dummy_operator, n0); 303 Node* n1 = graph.NewNode(&dummy_operator, n0);
233 Node* n2 = graph.NewNode(&dummy_operator, n0, n1); 304 Node* n2 = graph.NewNode(&dummy_operator, n0, n1);
234 305
306 CHECK_INPUTS(n0, NONE);
307 CHECK_INPUTS(n1, n0);
308 CHECK_INPUTS(n2, n0, n1);
309 CHECK_USES(n0, n1, n2);
310
235 n1->RemoveInput(0); 311 n1->RemoveInput(0);
236 CHECK_EQ(0, n1->InputCount()); 312 CHECK_INPUTS(n1, NONE);
237 CHECK_EQ(1, n0->UseCount()); 313 CHECK_USES(n0, n2);
238 314
239 n2->RemoveInput(0); 315 n2->RemoveInput(0);
240 CHECK_EQ(1, n2->InputCount()); 316 CHECK_INPUTS(n2, n1);
241 CHECK_EQ(0, n0->UseCount()); 317 CHECK_USES(n0, NONE);
242 CHECK_EQ(1, n1->UseCount()); 318 CHECK_USES(n1, n2);
243 319
244 n2->RemoveInput(0); 320 n2->RemoveInput(0);
245 CHECK_EQ(0, n2->InputCount()); 321 CHECK_INPUTS(n2, NONE);
322 CHECK_USES(n0, NONE);
323 CHECK_USES(n1, NONE);
324 CHECK_USES(n2, NONE);
246 } 325 }
247 326
248 327
249 TEST(AppendInputsAndIterator) { 328 TEST(AppendInputsAndIterator) {
250 GraphTester graph; 329 GraphTester graph;
251 330
252 Node* n0 = graph.NewNode(&dummy_operator); 331 Node* n0 = graph.NewNode(&dummy_operator);
253 Node* n1 = graph.NewNode(&dummy_operator, n0); 332 Node* n1 = graph.NewNode(&dummy_operator, n0);
254 Node* n2 = graph.NewNode(&dummy_operator, n0, n1); 333 Node* n2 = graph.NewNode(&dummy_operator, n0, n1);
255 334
256 Node::InputEdges inputs(n2->input_edges()); 335 CHECK_INPUTS(n0, NONE);
257 Node::InputEdges::iterator current = inputs.begin(); 336 CHECK_INPUTS(n1, n0);
258 CHECK(current != inputs.end()); 337 CHECK_INPUTS(n2, n0, n1);
259 CHECK((*current).to() == n0); 338 CHECK_USES(n0, n1, n2);
260 ++current;
261 CHECK(current != inputs.end());
262 CHECK((*current).to() == n1);
263 ++current;
264 CHECK(current == inputs.end());
265 339
266 Node* n3 = graph.NewNode(&dummy_operator); 340 Node* n3 = graph.NewNode(&dummy_operator);
341
267 n2->AppendInput(graph.zone(), n3); 342 n2->AppendInput(graph.zone(), n3);
268 inputs = n2->input_edges(); 343
269 current = inputs.begin(); 344 CHECK_INPUTS(n2, n0, n1, n3);
270 CHECK(current != inputs.end()); 345 CHECK_USES(n3, n2);
271 CHECK((*current).to() == n0);
272 CHECK_EQ(0, (*current).index());
273 ++current;
274 CHECK(current != inputs.end());
275 CHECK((*current).to() == n1);
276 CHECK_EQ(1, (*current).index());
277 ++current;
278 CHECK(current != inputs.end());
279 CHECK((*current).to() == n3);
280 CHECK_EQ(2, (*current).index());
281 ++current;
282 CHECK(current == inputs.end());
283 } 346 }
284 347
285 348
286 TEST(NullInputsSimple) { 349 TEST(NullInputsSimple) {
287 GraphTester graph; 350 GraphTester graph;
288 351
289 Node* n0 = graph.NewNode(&dummy_operator); 352 Node* n0 = graph.NewNode(&dummy_operator);
290 Node* n1 = graph.NewNode(&dummy_operator, n0); 353 Node* n1 = graph.NewNode(&dummy_operator, n0);
291 Node* n2 = graph.NewNode(&dummy_operator, n0, n1); 354 Node* n2 = graph.NewNode(&dummy_operator, n0, n1);
292 CHECK_EQ(2, n2->InputCount());
293 355
294 CHECK(n0 == n2->InputAt(0)); 356 CHECK_INPUTS(n0, NONE);
295 CHECK(n1 == n2->InputAt(1)); 357 CHECK_INPUTS(n1, n0);
296 CHECK_EQ(2, n0->UseCount()); 358 CHECK_INPUTS(n2, n0, n1);
297 n2->ReplaceInput(0, NULL); 359 CHECK_USES(n0, n1, n2);
298 CHECK(NULL == n2->InputAt(0)); 360
299 CHECK(n1 == n2->InputAt(1)); 361 n2->ReplaceInput(0, nullptr);
300 CHECK_EQ(1, n0->UseCount()); 362
363 CHECK_INPUTS(n2, NULL, n1);
364
365 CHECK_USES(n0, n1);
366
367 n2->ReplaceInput(1, nullptr);
368
369 CHECK_INPUTS(n2, NULL, NULL);
370
371 CHECK_USES(n1, NONE);
301 } 372 }
302 373
303 374
304 TEST(NullInputsAppended) { 375 TEST(NullInputsAppended) {
305 GraphTester graph; 376 GraphTester graph;
306 377
307 Node* n0 = graph.NewNode(&dummy_operator); 378 Node* n0 = graph.NewNode(&dummy_operator);
308 Node* n1 = graph.NewNode(&dummy_operator, n0); 379 Node* n1 = graph.NewNode(&dummy_operator, n0);
309 Node* n2 = graph.NewNode(&dummy_operator, n0); 380 Node* n2 = graph.NewNode(&dummy_operator, n0);
310 Node* n3 = graph.NewNode(&dummy_operator, n0); 381 Node* n3 = graph.NewNode(&dummy_operator, n0);
311 n3->AppendInput(graph.zone(), n1); 382 n3->AppendInput(graph.zone(), n1);
312 n3->AppendInput(graph.zone(), n2); 383 n3->AppendInput(graph.zone(), n2);
313 CHECK_EQ(3, n3->InputCount());
314 384
315 CHECK(n0 == n3->InputAt(0)); 385 CHECK_INPUTS(n3, n0, n1, n2);
316 CHECK(n1 == n3->InputAt(1)); 386 CHECK_USES(n0, n1, n2, n3);
317 CHECK(n2 == n3->InputAt(2)); 387 CHECK_USES(n1, n3);
318 CHECK_EQ(1, n1->UseCount()); 388 CHECK_USES(n2, n3);
389
319 n3->ReplaceInput(1, NULL); 390 n3->ReplaceInput(1, NULL);
320 CHECK(n0 == n3->InputAt(0)); 391 CHECK_USES(n1, NONE);
321 CHECK(NULL == n3->InputAt(1)); 392
322 CHECK(n2 == n3->InputAt(2)); 393 CHECK_INPUTS(n3, n0, NULL, n2);
323 CHECK_EQ(0, n1->UseCount());
324 } 394 }
325 395
326 396
327 TEST(ReplaceUsesFromAppendedInputs) { 397 TEST(ReplaceUsesFromAppendedInputs) {
328 GraphTester graph; 398 GraphTester graph;
329 399
330 Node* n0 = graph.NewNode(&dummy_operator); 400 Node* n0 = graph.NewNode(&dummy_operator);
331 Node* n1 = graph.NewNode(&dummy_operator, n0); 401 Node* n1 = graph.NewNode(&dummy_operator, n0);
332 Node* n2 = graph.NewNode(&dummy_operator, n0); 402 Node* n2 = graph.NewNode(&dummy_operator, n0);
333 Node* n3 = graph.NewNode(&dummy_operator); 403 Node* n3 = graph.NewNode(&dummy_operator);
404
405 CHECK_INPUTS(n2, n0);
406
334 n2->AppendInput(graph.zone(), n1); 407 n2->AppendInput(graph.zone(), n1);
408 CHECK_INPUTS(n2, n0, n1);
409 CHECK_USES(n1, n2);
410
335 n2->AppendInput(graph.zone(), n0); 411 n2->AppendInput(graph.zone(), n0);
336 CHECK_EQ(0, n3->UseCount()); 412 CHECK_INPUTS(n2, n0, n1, n0);
337 CHECK_EQ(3, n0->UseCount()); 413 CHECK_USES(n1, n2);
414 CHECK_USES(n0, n2, n1, n2);
415
338 n0->ReplaceUses(n3); 416 n0->ReplaceUses(n3);
339 CHECK_EQ(0, n0->UseCount());
340 CHECK_EQ(3, n3->UseCount());
341 417
342 Node::Uses uses(n3->uses()); 418 CHECK_USES(n0, NONE);
343 auto current = uses.begin(); 419 CHECK_INPUTS(n2, n3, n1, n3);
344 CHECK(current != uses.end()); 420 CHECK_USES(n3, n2, n1, n2);
345 CHECK(*current == n1);
346 ++current;
347 CHECK(current != uses.end());
348 CHECK(*current == n2);
349 ++current;
350 CHECK(current != uses.end());
351 CHECK(*current == n2);
352 ++current;
353 CHECK(current == uses.end());
354 } 421 }
355 422
356 423
357 TEST(ReplaceInputMultipleUses) { 424 TEST(ReplaceInputMultipleUses) {
358 GraphTester graph; 425 GraphTester graph;
359 426
360 Node* n0 = graph.NewNode(&dummy_operator); 427 Node* n0 = graph.NewNode(&dummy_operator);
361 Node* n1 = graph.NewNode(&dummy_operator); 428 Node* n1 = graph.NewNode(&dummy_operator);
362 Node* n2 = graph.NewNode(&dummy_operator, n0); 429 Node* n2 = graph.NewNode(&dummy_operator, n0);
363 n2->ReplaceInput(0, n1); 430 n2->ReplaceInput(0, n1);
364 CHECK_EQ(0, n0->UseCount()); 431 CHECK_EQ(0, n0->UseCount());
365 CHECK_EQ(1, n1->UseCount()); 432 CHECK_EQ(1, n1->UseCount());
366 433
367 Node* n3 = graph.NewNode(&dummy_operator, n0); 434 Node* n3 = graph.NewNode(&dummy_operator, n0);
368 n3->ReplaceInput(0, n1); 435 n3->ReplaceInput(0, n1);
369 CHECK_EQ(0, n0->UseCount()); 436 CHECK_EQ(0, n0->UseCount());
370 CHECK_EQ(2, n1->UseCount()); 437 CHECK_EQ(2, n1->UseCount());
371 } 438 }
372 439
373 440
374 TEST(TrimInputCountInline) { 441 TEST(TrimInputCountInline) {
375 GraphTester graph; 442 GraphTester graph;
376 443
377 { 444 {
378 Node* n0 = graph.NewNode(&dummy_operator); 445 Node* n0 = graph.NewNode(&dummy_operator);
379 Node* n1 = graph.NewNode(&dummy_operator, n0); 446 Node* n1 = graph.NewNode(&dummy_operator, n0);
380 n1->TrimInputCount(1); 447 n1->TrimInputCount(1);
381 CHECK_EQ(1, n1->InputCount()); 448 CHECK_INPUTS(n1, n0);
382 CHECK_EQ(n0, n1->InputAt(0)); 449 CHECK_USES(n0, n1);
383 CHECK_EQ(1, n0->UseCount());
384 } 450 }
385 451
386 { 452 {
387 Node* n0 = graph.NewNode(&dummy_operator); 453 Node* n0 = graph.NewNode(&dummy_operator);
388 Node* n1 = graph.NewNode(&dummy_operator, n0); 454 Node* n1 = graph.NewNode(&dummy_operator, n0);
389 n1->TrimInputCount(0); 455 n1->TrimInputCount(0);
390 CHECK_EQ(0, n1->InputCount()); 456 CHECK_INPUTS(n1, NONE);
391 CHECK_EQ(0, n0->UseCount()); 457 CHECK_USES(n0, NONE);
392 } 458 }
393 459
394 { 460 {
395 Node* n0 = graph.NewNode(&dummy_operator); 461 Node* n0 = graph.NewNode(&dummy_operator);
396 Node* n1 = graph.NewNode(&dummy_operator); 462 Node* n1 = graph.NewNode(&dummy_operator);
397 Node* n2 = graph.NewNode(&dummy_operator, n0, n1); 463 Node* n2 = graph.NewNode(&dummy_operator, n0, n1);
398 n2->TrimInputCount(2); 464 n2->TrimInputCount(2);
399 CHECK_EQ(2, n2->InputCount()); 465 CHECK_INPUTS(n2, n0, n1);
400 CHECK_EQ(1, n0->UseCount()); 466 CHECK_USES(n0, n2);
401 CHECK_EQ(1, n1->UseCount()); 467 CHECK_USES(n1, n2);
402 CHECK_EQ(0, n2->UseCount());
403 } 468 }
404 469
405 { 470 {
406 Node* n0 = graph.NewNode(&dummy_operator); 471 Node* n0 = graph.NewNode(&dummy_operator);
407 Node* n1 = graph.NewNode(&dummy_operator); 472 Node* n1 = graph.NewNode(&dummy_operator);
408 Node* n2 = graph.NewNode(&dummy_operator, n0, n1); 473 Node* n2 = graph.NewNode(&dummy_operator, n0, n1);
409 n2->TrimInputCount(1); 474 n2->TrimInputCount(1);
410 CHECK_EQ(1, n2->InputCount()); 475 CHECK_INPUTS(n2, n0);
411 CHECK_EQ(1, n0->UseCount()); 476 CHECK_USES(n0, n2);
412 CHECK_EQ(0, n1->UseCount()); 477 CHECK_USES(n1, NONE);
413 CHECK_EQ(0, n2->UseCount());
414 } 478 }
415 479
416 { 480 {
417 Node* n0 = graph.NewNode(&dummy_operator); 481 Node* n0 = graph.NewNode(&dummy_operator);
418 Node* n1 = graph.NewNode(&dummy_operator); 482 Node* n1 = graph.NewNode(&dummy_operator);
419 Node* n2 = graph.NewNode(&dummy_operator, n0, n1); 483 Node* n2 = graph.NewNode(&dummy_operator, n0, n1);
420 n2->TrimInputCount(0); 484 n2->TrimInputCount(0);
421 CHECK_EQ(0, n2->InputCount()); 485 CHECK_INPUTS(n2, NONE);
422 CHECK_EQ(0, n0->UseCount()); 486 CHECK_USES(n0, NONE);
423 CHECK_EQ(0, n1->UseCount()); 487 CHECK_USES(n1, NONE);
424 CHECK_EQ(0, n2->UseCount());
425 } 488 }
426 489
427 { 490 {
428 Node* n0 = graph.NewNode(&dummy_operator); 491 Node* n0 = graph.NewNode(&dummy_operator);
429 Node* n2 = graph.NewNode(&dummy_operator, n0, n0); 492 Node* n2 = graph.NewNode(&dummy_operator, n0, n0);
430 n2->TrimInputCount(1); 493 n2->TrimInputCount(1);
431 CHECK_EQ(1, n2->InputCount()); 494 CHECK_INPUTS(n2, n0);
432 CHECK_EQ(1, n0->UseCount()); 495 CHECK_USES(n0, n2);
433 CHECK_EQ(0, n2->UseCount());
434 } 496 }
435 497
436 { 498 {
437 Node* n0 = graph.NewNode(&dummy_operator); 499 Node* n0 = graph.NewNode(&dummy_operator);
438 Node* n2 = graph.NewNode(&dummy_operator, n0, n0); 500 Node* n2 = graph.NewNode(&dummy_operator, n0, n0);
439 n2->TrimInputCount(0); 501 n2->TrimInputCount(0);
440 CHECK_EQ(0, n2->InputCount()); 502 CHECK_INPUTS(n2, NONE);
441 CHECK_EQ(0, n0->UseCount()); 503 CHECK_USES(n0, NONE);
442 CHECK_EQ(0, n2->UseCount());
443 } 504 }
444 } 505 }
445 506
446 507
447 TEST(TrimInputCountOutOfLine1) { 508 TEST(TrimInputCountOutOfLine1) {
448 GraphTester graph; 509 GraphTester graph;
449 510
450 { 511 {
451 Node* n0 = graph.NewNode(&dummy_operator); 512 Node* n0 = graph.NewNode(&dummy_operator);
452 Node* n1 = graph.NewNode(&dummy_operator); 513 Node* n1 = graph.NewNode(&dummy_operator);
453 n1->AppendInput(graph.zone(), n0); 514 n1->AppendInput(graph.zone(), n0);
515 CHECK_INPUTS(n1, n0);
516 CHECK_USES(n0, n1);
517
454 n1->TrimInputCount(1); 518 n1->TrimInputCount(1);
455 CHECK_EQ(1, n1->InputCount()); 519 CHECK_INPUTS(n1, n0);
456 CHECK_EQ(n0, n1->InputAt(0)); 520 CHECK_USES(n0, n1);
457 CHECK_EQ(1, n0->UseCount());
458 } 521 }
459 522
460 { 523 {
461 Node* n0 = graph.NewNode(&dummy_operator); 524 Node* n0 = graph.NewNode(&dummy_operator);
462 Node* n1 = graph.NewNode(&dummy_operator); 525 Node* n1 = graph.NewNode(&dummy_operator);
463 n1->AppendInput(graph.zone(), n0); 526 n1->AppendInput(graph.zone(), n0);
464 CHECK_EQ(1, n1->InputCount()); 527 CHECK_EQ(1, n1->InputCount());
465 n1->TrimInputCount(0); 528 n1->TrimInputCount(0);
466 CHECK_EQ(0, n1->InputCount()); 529 CHECK_EQ(0, n1->InputCount());
467 CHECK_EQ(0, n0->UseCount()); 530 CHECK_EQ(0, n0->UseCount());
468 } 531 }
469 532
470 { 533 {
471 Node* n0 = graph.NewNode(&dummy_operator); 534 Node* n0 = graph.NewNode(&dummy_operator);
472 Node* n1 = graph.NewNode(&dummy_operator); 535 Node* n1 = graph.NewNode(&dummy_operator);
473 Node* n2 = graph.NewNode(&dummy_operator); 536 Node* n2 = graph.NewNode(&dummy_operator);
474 n2->AppendInput(graph.zone(), n0); 537 n2->AppendInput(graph.zone(), n0);
475 n2->AppendInput(graph.zone(), n1); 538 n2->AppendInput(graph.zone(), n1);
476 CHECK_EQ(2, n2->InputCount()); 539 CHECK_INPUTS(n2, n0, n1);
477 n2->TrimInputCount(2); 540 n2->TrimInputCount(2);
478 CHECK_EQ(2, n2->InputCount()); 541 CHECK_INPUTS(n2, n0, n1);
479 CHECK_EQ(n0, n2->InputAt(0)); 542 CHECK_USES(n0, n2);
480 CHECK_EQ(n1, n2->InputAt(1)); 543 CHECK_USES(n1, n2);
481 CHECK_EQ(1, n0->UseCount()); 544 CHECK_USES(n2, NONE);
482 CHECK_EQ(1, n1->UseCount());
483 CHECK_EQ(0, n2->UseCount());
484 } 545 }
485 546
486 { 547 {
487 Node* n0 = graph.NewNode(&dummy_operator); 548 Node* n0 = graph.NewNode(&dummy_operator);
488 Node* n1 = graph.NewNode(&dummy_operator); 549 Node* n1 = graph.NewNode(&dummy_operator);
489 Node* n2 = graph.NewNode(&dummy_operator); 550 Node* n2 = graph.NewNode(&dummy_operator);
490 n2->AppendInput(graph.zone(), n0); 551 n2->AppendInput(graph.zone(), n0);
491 n2->AppendInput(graph.zone(), n1); 552 n2->AppendInput(graph.zone(), n1);
492 CHECK_EQ(2, n2->InputCount()); 553 CHECK_INPUTS(n2, n0, n1);
493 n2->TrimInputCount(1); 554 n2->TrimInputCount(1);
494 CHECK_EQ(1, n2->InputCount()); 555 CHECK_INPUTS(n2, n0);
495 CHECK_EQ(n0, n2->InputAt(0)); 556 CHECK_USES(n0, n2);
496 CHECK_EQ(1, n0->UseCount()); 557 CHECK_USES(n1, NONE);
497 CHECK_EQ(0, n1->UseCount()); 558 CHECK_USES(n2, NONE);
498 CHECK_EQ(0, n2->UseCount());
499 } 559 }
500 560
501 { 561 {
502 Node* n0 = graph.NewNode(&dummy_operator); 562 Node* n0 = graph.NewNode(&dummy_operator);
503 Node* n1 = graph.NewNode(&dummy_operator); 563 Node* n1 = graph.NewNode(&dummy_operator);
504 Node* n2 = graph.NewNode(&dummy_operator); 564 Node* n2 = graph.NewNode(&dummy_operator);
505 n2->AppendInput(graph.zone(), n0); 565 n2->AppendInput(graph.zone(), n0);
506 n2->AppendInput(graph.zone(), n1); 566 n2->AppendInput(graph.zone(), n1);
507 CHECK_EQ(2, n2->InputCount()); 567 CHECK_INPUTS(n2, n0, n1);
508 n2->TrimInputCount(0); 568 n2->TrimInputCount(0);
509 CHECK_EQ(0, n2->InputCount()); 569 CHECK_INPUTS(n2, NONE);
510 CHECK_EQ(0, n0->UseCount()); 570 CHECK_USES(n0, NONE);
511 CHECK_EQ(0, n1->UseCount()); 571 CHECK_USES(n1, NONE);
512 CHECK_EQ(0, n2->UseCount()); 572 CHECK_USES(n2, NONE);
513 } 573 }
514 574
515 { 575 {
516 Node* n0 = graph.NewNode(&dummy_operator); 576 Node* n0 = graph.NewNode(&dummy_operator);
517 Node* n2 = graph.NewNode(&dummy_operator); 577 Node* n2 = graph.NewNode(&dummy_operator);
518 n2->AppendInput(graph.zone(), n0); 578 n2->AppendInput(graph.zone(), n0);
519 n2->AppendInput(graph.zone(), n0); 579 n2->AppendInput(graph.zone(), n0);
520 CHECK_EQ(2, n2->InputCount()); 580 CHECK_INPUTS(n2, n0, n0);
521 CHECK_EQ(2, n0->UseCount()); 581 CHECK_USES(n0, n2, n2);
522 n2->TrimInputCount(1); 582 n2->TrimInputCount(1);
523 CHECK_EQ(1, n2->InputCount()); 583 CHECK_INPUTS(n2, n0);
524 CHECK_EQ(1, n0->UseCount()); 584 CHECK_USES(n0, n2);
525 CHECK_EQ(0, n2->UseCount());
526 } 585 }
527 586
528 { 587 {
529 Node* n0 = graph.NewNode(&dummy_operator); 588 Node* n0 = graph.NewNode(&dummy_operator);
530 Node* n2 = graph.NewNode(&dummy_operator); 589 Node* n2 = graph.NewNode(&dummy_operator);
531 n2->AppendInput(graph.zone(), n0); 590 n2->AppendInput(graph.zone(), n0);
532 n2->AppendInput(graph.zone(), n0); 591 n2->AppendInput(graph.zone(), n0);
533 CHECK_EQ(2, n2->InputCount()); 592 CHECK_INPUTS(n2, n0, n0);
534 CHECK_EQ(2, n0->UseCount()); 593 CHECK_USES(n0, n2, n2);
535 n2->TrimInputCount(0); 594 n2->TrimInputCount(0);
536 CHECK_EQ(0, n2->InputCount()); 595 CHECK_INPUTS(n2, NONE);
537 CHECK_EQ(0, n0->UseCount()); 596 CHECK_USES(n0, NONE);
538 CHECK_EQ(0, n2->UseCount());
539 } 597 }
540 } 598 }
541 599
542 600
543 TEST(TrimInputCountOutOfLine2) { 601 TEST(TrimInputCountOutOfLine2) {
544 GraphTester graph; 602 GraphTester graph;
545 603
546 { 604 {
547 Node* n0 = graph.NewNode(&dummy_operator); 605 Node* n0 = graph.NewNode(&dummy_operator);
548 Node* n1 = graph.NewNode(&dummy_operator); 606 Node* n1 = graph.NewNode(&dummy_operator);
549 Node* n2 = graph.NewNode(&dummy_operator, n0); 607 Node* n2 = graph.NewNode(&dummy_operator, n0);
550 n2->AppendInput(graph.zone(), n1); 608 n2->AppendInput(graph.zone(), n1);
551 CHECK_EQ(2, n2->InputCount()); 609 CHECK_INPUTS(n2, n0, n1);
552 n2->TrimInputCount(2); 610 n2->TrimInputCount(2);
553 CHECK_EQ(2, n2->InputCount()); 611 CHECK_INPUTS(n2, n0, n1);
554 CHECK_EQ(n0, n2->InputAt(0)); 612 CHECK_USES(n0, n2);
555 CHECK_EQ(n1, n2->InputAt(1)); 613 CHECK_USES(n1, n2);
556 CHECK_EQ(1, n0->UseCount()); 614 CHECK_USES(n2, NONE);
557 CHECK_EQ(1, n1->UseCount());
558 CHECK_EQ(0, n2->UseCount());
559 } 615 }
560 616
561 { 617 {
562 Node* n0 = graph.NewNode(&dummy_operator); 618 Node* n0 = graph.NewNode(&dummy_operator);
563 Node* n1 = graph.NewNode(&dummy_operator); 619 Node* n1 = graph.NewNode(&dummy_operator);
564 Node* n2 = graph.NewNode(&dummy_operator, n0); 620 Node* n2 = graph.NewNode(&dummy_operator, n0);
565 n2->AppendInput(graph.zone(), n1); 621 n2->AppendInput(graph.zone(), n1);
566 CHECK_EQ(2, n2->InputCount()); 622 CHECK_INPUTS(n2, n0, n1);
567 n2->TrimInputCount(1); 623 n2->TrimInputCount(1);
568 CHECK_EQ(1, n2->InputCount()); 624 CHECK_INPUTS(n2, n0);
569 CHECK_EQ(n0, n2->InputAt(0)); 625 CHECK_USES(n0, n2);
570 CHECK_EQ(1, n0->UseCount()); 626 CHECK_USES(n1, NONE);
571 CHECK_EQ(0, n1->UseCount()); 627 CHECK_USES(n2, NONE);
572 CHECK_EQ(0, n2->UseCount());
573 } 628 }
574 629
575 { 630 {
576 Node* n0 = graph.NewNode(&dummy_operator); 631 Node* n0 = graph.NewNode(&dummy_operator);
577 Node* n1 = graph.NewNode(&dummy_operator); 632 Node* n1 = graph.NewNode(&dummy_operator);
578 Node* n2 = graph.NewNode(&dummy_operator, n0); 633 Node* n2 = graph.NewNode(&dummy_operator, n0);
579 n2->AppendInput(graph.zone(), n1); 634 n2->AppendInput(graph.zone(), n1);
580 CHECK_EQ(2, n2->InputCount()); 635 CHECK_INPUTS(n2, n0, n1);
581 n2->TrimInputCount(0); 636 n2->TrimInputCount(0);
582 CHECK_EQ(0, n2->InputCount()); 637 CHECK_INPUTS(n2, NONE);
583 CHECK_EQ(0, n0->UseCount()); 638 CHECK_USES(n0, NONE);
584 CHECK_EQ(0, n1->UseCount()); 639 CHECK_USES(n1, NONE);
585 CHECK_EQ(0, n2->UseCount()); 640 CHECK_USES(n2, NONE);
586 } 641 }
587 642
588 { 643 {
589 Node* n0 = graph.NewNode(&dummy_operator); 644 Node* n0 = graph.NewNode(&dummy_operator);
590 Node* n2 = graph.NewNode(&dummy_operator, n0); 645 Node* n2 = graph.NewNode(&dummy_operator, n0);
591 n2->AppendInput(graph.zone(), n0); 646 n2->AppendInput(graph.zone(), n0);
592 CHECK_EQ(2, n2->InputCount()); 647 CHECK_INPUTS(n2, n0, n0);
593 CHECK_EQ(2, n0->UseCount()); 648 CHECK_USES(n0, n2, n2);
594 n2->TrimInputCount(1); 649 n2->TrimInputCount(1);
595 CHECK_EQ(1, n2->InputCount()); 650 CHECK_INPUTS(n2, n0);
596 CHECK_EQ(1, n0->UseCount()); 651 CHECK_USES(n0, n2);
597 CHECK_EQ(0, n2->UseCount()); 652 CHECK_USES(n2, NONE);
598 } 653 }
599 654
600 { 655 {
601 Node* n0 = graph.NewNode(&dummy_operator); 656 Node* n0 = graph.NewNode(&dummy_operator);
602 Node* n2 = graph.NewNode(&dummy_operator, n0); 657 Node* n2 = graph.NewNode(&dummy_operator, n0);
603 n2->AppendInput(graph.zone(), n0); 658 n2->AppendInput(graph.zone(), n0);
604 CHECK_EQ(2, n2->InputCount()); 659 CHECK_EQ(2, n2->InputCount());
605 CHECK_EQ(2, n0->UseCount()); 660 CHECK_EQ(2, n0->UseCount());
606 n2->TrimInputCount(0); 661 n2->TrimInputCount(0);
607 CHECK_EQ(0, n2->InputCount()); 662 CHECK_EQ(0, n2->InputCount());
608 CHECK_EQ(0, n0->UseCount()); 663 CHECK_EQ(0, n0->UseCount());
609 CHECK_EQ(0, n2->UseCount()); 664 CHECK_EQ(0, n2->UseCount());
610 } 665 }
611 } 666 }
612 667
613 668
614 TEST(RemoveAllInputs) { 669 TEST(RemoveAllInputs) {
615 GraphTester graph; 670 GraphTester graph;
616 671
617 for (int i = 0; i < 2; i++) { 672 for (int i = 0; i < 2; i++) {
618 Node* n0 = graph.NewNode(&dummy_operator); 673 Node* n0 = graph.NewNode(&dummy_operator);
619 Node* n1 = graph.NewNode(&dummy_operator, n0); 674 Node* n1 = graph.NewNode(&dummy_operator, n0);
620 Node* n2; 675 Node* n2;
621 if (i == 0) { 676 if (i == 0) {
622 n2 = graph.NewNode(&dummy_operator, n0, n1); 677 n2 = graph.NewNode(&dummy_operator, n0, n1);
678 CHECK_INPUTS(n2, n0, n1);
623 } else { 679 } else {
624 n2 = graph.NewNode(&dummy_operator, n0); 680 n2 = graph.NewNode(&dummy_operator, n0);
681 CHECK_INPUTS(n2, n0);
625 n2->AppendInput(graph.zone(), n1); // with out-of-line input. 682 n2->AppendInput(graph.zone(), n1); // with out-of-line input.
683 CHECK_INPUTS(n2, n0, n1);
626 } 684 }
627 685
628 n0->RemoveAllInputs(); 686 n0->RemoveAllInputs();
629 CHECK_EQ(0, n0->InputCount()); 687 CHECK_INPUTS(n0, NONE);
630 688
631 CHECK_EQ(2, n0->UseCount()); 689 CHECK_USES(n0, n1, n2);
632 n1->RemoveAllInputs(); 690 n1->RemoveAllInputs();
633 CHECK_EQ(1, n1->InputCount()); 691 CHECK_INPUTS(n1, NULL);
634 CHECK_EQ(1, n0->UseCount()); 692 CHECK_INPUTS(n2, n0, n1);
635 CHECK(!n1->InputAt(0)); 693 CHECK_USES(n0, n2);
636 694
637 CHECK_EQ(1, n1->UseCount());
638 n2->RemoveAllInputs(); 695 n2->RemoveAllInputs();
639 CHECK_EQ(2, n2->InputCount()); 696 CHECK_INPUTS(n1, NULL);
640 CHECK_EQ(0, n0->UseCount()); 697 CHECK_INPUTS(n2, NULL, NULL);
641 CHECK_EQ(0, n1->UseCount()); 698 CHECK_USES(n0, NONE);
642 CHECK(!n2->InputAt(0));
643 CHECK(!n2->InputAt(1));
644 } 699 }
645 700
646 { 701 {
647 Node* n0 = graph.NewNode(&dummy_operator); 702 Node* n0 = graph.NewNode(&dummy_operator);
648 Node* n1 = graph.NewNode(&dummy_operator, n0); 703 Node* n1 = graph.NewNode(&dummy_operator, n0);
649 n1->ReplaceInput(0, n1); // self-reference. 704 n1->ReplaceInput(0, n1); // self-reference.
650 705
651 CHECK_EQ(0, n0->UseCount()); 706 CHECK_INPUTS(n0, NONE);
652 CHECK_EQ(1, n1->UseCount()); 707 CHECK_INPUTS(n1, n1);
708 CHECK_USES(n0, NONE);
709 CHECK_USES(n1, n1);
653 n1->RemoveAllInputs(); 710 n1->RemoveAllInputs();
654 CHECK_EQ(1, n1->InputCount()); 711
655 CHECK_EQ(0, n1->UseCount()); 712 CHECK_INPUTS(n0, NONE);
656 CHECK(!n1->InputAt(0)); 713 CHECK_INPUTS(n1, NULL);
714 CHECK_USES(n0, NONE);
715 CHECK_USES(n1, NONE);
657 } 716 }
658 } 717 }
718
719
720 TEST(AppendAndTrim) {
721 GraphTester graph;
722
723 Node* nodes[] = {
724 graph.NewNode(&dummy_operator), graph.NewNode(&dummy_operator),
725 graph.NewNode(&dummy_operator), graph.NewNode(&dummy_operator),
726 graph.NewNode(&dummy_operator)};
727
728 Node* last = graph.NewNode(&dummy_operator);
729
730 for (size_t i = 0; i < arraysize(nodes); i++) {
731 last->AppendInput(graph.zone(), nodes[i]);
732 CheckInputs(last, nodes, static_cast<int>(i + 1));
733
734 for (size_t j = 0; j < arraysize(nodes); j++) {
735 if (j <= i) CHECK_USES(nodes[j], last);
736 if (j > i) CHECK_USES(nodes[j], NONE);
737 }
738
739 CHECK_USES(last, NONE);
740 }
741
742 for (int i = static_cast<int>(arraysize(nodes)); i >= 0; i--) {
743 last->TrimInputCount(i);
744 CheckInputs(last, nodes, static_cast<int>(i));
745
746 for (size_t j = 0; j < i; j++) {
747 if (j < i) CHECK_USES(nodes[j], last);
748 if (j >= i) CHECK_USES(nodes[j], NONE);
749 }
750
751 CHECK_USES(last, NONE);
752 }
753 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698