| OLD | NEW |
| 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/compiler/graph.h" | 7 #include "src/compiler/graph.h" |
| 8 #include "src/compiler/node.h" | 8 #include "src/compiler/node.h" |
| 9 #include "src/compiler/operator.h" | 9 #include "src/compiler/operator.h" |
| 10 #include "test/cctest/cctest.h" | 10 #include "test/cctest/cctest.h" |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 135 do { \ | 135 do { \ |
| 136 Node* __array[] = {__VA_ARGS__}; \ | 136 Node* __array[] = {__VA_ARGS__}; \ |
| 137 int __size = \ | 137 int __size = \ |
| 138 __array[0] != NONE ? static_cast<int>(arraysize(__array)) : 0; \ | 138 __array[0] != NONE ? static_cast<int>(arraysize(__array)) : 0; \ |
| 139 CheckInputs(node, __array, __size); \ | 139 CheckInputs(node, __array, __size); \ |
| 140 } while (false) | 140 } while (false) |
| 141 | 141 |
| 142 | 142 |
| 143 TEST(NodeUseIteratorReplaceUses) { | 143 TEST(NodeUseIteratorReplaceUses) { |
| 144 v8::internal::AccountingAllocator allocator; | 144 v8::internal::AccountingAllocator allocator; |
| 145 Zone zone(&allocator); | 145 Zone zone(&allocator, ZONE_NAME); |
| 146 Graph graph(&zone); | 146 Graph graph(&zone); |
| 147 Node* n0 = graph.NewNode(&dummy_operator0); | 147 Node* n0 = graph.NewNode(&dummy_operator0); |
| 148 Node* n1 = graph.NewNode(&dummy_operator1, n0); | 148 Node* n1 = graph.NewNode(&dummy_operator1, n0); |
| 149 Node* n2 = graph.NewNode(&dummy_operator1, n0); | 149 Node* n2 = graph.NewNode(&dummy_operator1, n0); |
| 150 Node* n3 = graph.NewNode(&dummy_operator0); | 150 Node* n3 = graph.NewNode(&dummy_operator0); |
| 151 | 151 |
| 152 CHECK_USES(n0, n1, n2); | 152 CHECK_USES(n0, n1, n2); |
| 153 | 153 |
| 154 CHECK_INPUTS(n1, n0); | 154 CHECK_INPUTS(n1, n0); |
| 155 CHECK_INPUTS(n2, n0); | 155 CHECK_INPUTS(n2, n0); |
| 156 | 156 |
| 157 n0->ReplaceUses(n3); | 157 n0->ReplaceUses(n3); |
| 158 | 158 |
| 159 CHECK_USES(n0, NONE); | 159 CHECK_USES(n0, NONE); |
| 160 CHECK_USES(n1, NONE); | 160 CHECK_USES(n1, NONE); |
| 161 CHECK_USES(n2, NONE); | 161 CHECK_USES(n2, NONE); |
| 162 CHECK_USES(n3, n1, n2); | 162 CHECK_USES(n3, n1, n2); |
| 163 | 163 |
| 164 CHECK_INPUTS(n1, n3); | 164 CHECK_INPUTS(n1, n3); |
| 165 CHECK_INPUTS(n2, n3); | 165 CHECK_INPUTS(n2, n3); |
| 166 } | 166 } |
| 167 | 167 |
| 168 | 168 |
| 169 TEST(NodeUseIteratorReplaceUsesSelf) { | 169 TEST(NodeUseIteratorReplaceUsesSelf) { |
| 170 v8::internal::AccountingAllocator allocator; | 170 v8::internal::AccountingAllocator allocator; |
| 171 Zone zone(&allocator); | 171 Zone zone(&allocator, ZONE_NAME); |
| 172 Graph graph(&zone); | 172 Graph graph(&zone); |
| 173 Node* n0 = graph.NewNode(&dummy_operator0); | 173 Node* n0 = graph.NewNode(&dummy_operator0); |
| 174 Node* n1 = graph.NewNode(&dummy_operator1, n0); | 174 Node* n1 = graph.NewNode(&dummy_operator1, n0); |
| 175 | 175 |
| 176 CHECK_USES(n0, n1); | 176 CHECK_USES(n0, n1); |
| 177 CHECK_USES(n1, NONE); | 177 CHECK_USES(n1, NONE); |
| 178 | 178 |
| 179 n1->ReplaceInput(0, n1); // Create self-reference. | 179 n1->ReplaceInput(0, n1); // Create self-reference. |
| 180 | 180 |
| 181 CHECK_USES(n0, NONE); | 181 CHECK_USES(n0, NONE); |
| 182 CHECK_USES(n1, n1); | 182 CHECK_USES(n1, n1); |
| 183 | 183 |
| 184 Node* n2 = graph.NewNode(&dummy_operator0); | 184 Node* n2 = graph.NewNode(&dummy_operator0); |
| 185 | 185 |
| 186 n1->ReplaceUses(n2); | 186 n1->ReplaceUses(n2); |
| 187 | 187 |
| 188 CHECK_USES(n0, NONE); | 188 CHECK_USES(n0, NONE); |
| 189 CHECK_USES(n1, NONE); | 189 CHECK_USES(n1, NONE); |
| 190 CHECK_USES(n2, n1); | 190 CHECK_USES(n2, n1); |
| 191 } | 191 } |
| 192 | 192 |
| 193 | 193 |
| 194 TEST(ReplaceInput) { | 194 TEST(ReplaceInput) { |
| 195 v8::internal::AccountingAllocator allocator; | 195 v8::internal::AccountingAllocator allocator; |
| 196 Zone zone(&allocator); | 196 Zone zone(&allocator, ZONE_NAME); |
| 197 Graph graph(&zone); | 197 Graph graph(&zone); |
| 198 Node* n0 = graph.NewNode(&dummy_operator0); | 198 Node* n0 = graph.NewNode(&dummy_operator0); |
| 199 Node* n1 = graph.NewNode(&dummy_operator0); | 199 Node* n1 = graph.NewNode(&dummy_operator0); |
| 200 Node* n2 = graph.NewNode(&dummy_operator0); | 200 Node* n2 = graph.NewNode(&dummy_operator0); |
| 201 Node* n3 = graph.NewNode(&dummy_operator3, n0, n1, n2); | 201 Node* n3 = graph.NewNode(&dummy_operator3, n0, n1, n2); |
| 202 Node* n4 = graph.NewNode(&dummy_operator0); | 202 Node* n4 = graph.NewNode(&dummy_operator0); |
| 203 | 203 |
| 204 CHECK_USES(n0, n3); | 204 CHECK_USES(n0, n3); |
| 205 CHECK_USES(n1, n3); | 205 CHECK_USES(n1, n3); |
| 206 CHECK_USES(n2, n3); | 206 CHECK_USES(n2, n3); |
| 207 CHECK_USES(n3, NONE); | 207 CHECK_USES(n3, NONE); |
| 208 CHECK_USES(n4, NONE); | 208 CHECK_USES(n4, NONE); |
| 209 | 209 |
| 210 CHECK_INPUTS(n3, n0, n1, n2); | 210 CHECK_INPUTS(n3, n0, n1, n2); |
| 211 | 211 |
| 212 n3->ReplaceInput(1, n4); | 212 n3->ReplaceInput(1, n4); |
| 213 | 213 |
| 214 CHECK_USES(n1, NONE); | 214 CHECK_USES(n1, NONE); |
| 215 CHECK_USES(n4, n3); | 215 CHECK_USES(n4, n3); |
| 216 | 216 |
| 217 CHECK_INPUTS(n3, n0, n4, n2); | 217 CHECK_INPUTS(n3, n0, n4, n2); |
| 218 } | 218 } |
| 219 | 219 |
| 220 | 220 |
| 221 TEST(OwnedBy) { | 221 TEST(OwnedBy) { |
| 222 v8::internal::AccountingAllocator allocator; | 222 v8::internal::AccountingAllocator allocator; |
| 223 Zone zone(&allocator); | 223 Zone zone(&allocator, ZONE_NAME); |
| 224 Graph graph(&zone); | 224 Graph graph(&zone); |
| 225 | 225 |
| 226 { | 226 { |
| 227 Node* n0 = graph.NewNode(&dummy_operator0); | 227 Node* n0 = graph.NewNode(&dummy_operator0); |
| 228 Node* n1 = graph.NewNode(&dummy_operator0); | 228 Node* n1 = graph.NewNode(&dummy_operator0); |
| 229 | 229 |
| 230 CHECK(!n0->OwnedBy(n1)); | 230 CHECK(!n0->OwnedBy(n1)); |
| 231 CHECK(!n1->OwnedBy(n0)); | 231 CHECK(!n1->OwnedBy(n0)); |
| 232 | 232 |
| 233 Node* n2 = graph.NewNode(&dummy_operator1, n0); | 233 Node* n2 = graph.NewNode(&dummy_operator1, n0); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 264 CHECK(!n2->OwnedBy(n0)); | 264 CHECK(!n2->OwnedBy(n0)); |
| 265 CHECK(!n2->OwnedBy(n1)); | 265 CHECK(!n2->OwnedBy(n1)); |
| 266 CHECK(n3->OwnedBy(n2)); | 266 CHECK(n3->OwnedBy(n2)); |
| 267 CHECK(!n2->OwnedBy(n3)); | 267 CHECK(!n2->OwnedBy(n3)); |
| 268 } | 268 } |
| 269 } | 269 } |
| 270 | 270 |
| 271 | 271 |
| 272 TEST(Uses) { | 272 TEST(Uses) { |
| 273 v8::internal::AccountingAllocator allocator; | 273 v8::internal::AccountingAllocator allocator; |
| 274 Zone zone(&allocator); | 274 Zone zone(&allocator, ZONE_NAME); |
| 275 Graph graph(&zone); | 275 Graph graph(&zone); |
| 276 | 276 |
| 277 Node* n0 = graph.NewNode(&dummy_operator0); | 277 Node* n0 = graph.NewNode(&dummy_operator0); |
| 278 Node* n1 = graph.NewNode(&dummy_operator1, n0); | 278 Node* n1 = graph.NewNode(&dummy_operator1, n0); |
| 279 | 279 |
| 280 CHECK_USES(n0, n1); | 280 CHECK_USES(n0, n1); |
| 281 CHECK_USES(n1, NONE); | 281 CHECK_USES(n1, NONE); |
| 282 | 282 |
| 283 Node* n2 = graph.NewNode(&dummy_operator1, n0); | 283 Node* n2 = graph.NewNode(&dummy_operator1, n0); |
| 284 | 284 |
| 285 CHECK_USES(n0, n1, n2); | 285 CHECK_USES(n0, n1, n2); |
| 286 CHECK_USES(n2, NONE); | 286 CHECK_USES(n2, NONE); |
| 287 | 287 |
| 288 Node* n3 = graph.NewNode(&dummy_operator1, n0); | 288 Node* n3 = graph.NewNode(&dummy_operator1, n0); |
| 289 | 289 |
| 290 CHECK_USES(n0, n1, n2, n3); | 290 CHECK_USES(n0, n1, n2, n3); |
| 291 CHECK_USES(n3, NONE); | 291 CHECK_USES(n3, NONE); |
| 292 } | 292 } |
| 293 | 293 |
| 294 | 294 |
| 295 TEST(Inputs) { | 295 TEST(Inputs) { |
| 296 v8::internal::AccountingAllocator allocator; | 296 v8::internal::AccountingAllocator allocator; |
| 297 Zone zone(&allocator); | 297 Zone zone(&allocator, ZONE_NAME); |
| 298 Graph graph(&zone); | 298 Graph graph(&zone); |
| 299 | 299 |
| 300 Node* n0 = graph.NewNode(&dummy_operator0); | 300 Node* n0 = graph.NewNode(&dummy_operator0); |
| 301 Node* n1 = graph.NewNode(&dummy_operator1, n0); | 301 Node* n1 = graph.NewNode(&dummy_operator1, n0); |
| 302 Node* n2 = graph.NewNode(&dummy_operator1, n0); | 302 Node* n2 = graph.NewNode(&dummy_operator1, n0); |
| 303 Node* n3 = graph.NewNode(&dummy_operator3, n0, n1, n2); | 303 Node* n3 = graph.NewNode(&dummy_operator3, n0, n1, n2); |
| 304 | 304 |
| 305 CHECK_INPUTS(n3, n0, n1, n2); | 305 CHECK_INPUTS(n3, n0, n1, n2); |
| 306 | 306 |
| 307 Node* n4 = graph.NewNode(&dummy_operator3, n0, n1, n2); | 307 Node* n4 = graph.NewNode(&dummy_operator3, n0, n1, n2); |
| 308 n3->AppendInput(graph.zone(), n4); | 308 n3->AppendInput(graph.zone(), n4); |
| 309 | 309 |
| 310 CHECK_INPUTS(n3, n0, n1, n2, n4); | 310 CHECK_INPUTS(n3, n0, n1, n2, n4); |
| 311 CHECK_USES(n4, n3); | 311 CHECK_USES(n4, n3); |
| 312 | 312 |
| 313 n3->AppendInput(graph.zone(), n4); | 313 n3->AppendInput(graph.zone(), n4); |
| 314 | 314 |
| 315 CHECK_INPUTS(n3, n0, n1, n2, n4, n4); | 315 CHECK_INPUTS(n3, n0, n1, n2, n4, n4); |
| 316 CHECK_USES(n4, n3, n3); | 316 CHECK_USES(n4, n3, n3); |
| 317 | 317 |
| 318 Node* n5 = graph.NewNode(&dummy_operator1, n4); | 318 Node* n5 = graph.NewNode(&dummy_operator1, n4); |
| 319 | 319 |
| 320 CHECK_USES(n4, n3, n3, n5); | 320 CHECK_USES(n4, n3, n3, n5); |
| 321 } | 321 } |
| 322 | 322 |
| 323 TEST(InsertInputs) { | 323 TEST(InsertInputs) { |
| 324 v8::internal::AccountingAllocator allocator; | 324 v8::internal::AccountingAllocator allocator; |
| 325 Zone zone(&allocator); | 325 Zone zone(&allocator, ZONE_NAME); |
| 326 Graph graph(&zone); | 326 Graph graph(&zone); |
| 327 | 327 |
| 328 Node* n0 = graph.NewNode(&dummy_operator0); | 328 Node* n0 = graph.NewNode(&dummy_operator0); |
| 329 Node* n1 = graph.NewNode(&dummy_operator1, n0); | 329 Node* n1 = graph.NewNode(&dummy_operator1, n0); |
| 330 Node* n2 = graph.NewNode(&dummy_operator1, n0); | 330 Node* n2 = graph.NewNode(&dummy_operator1, n0); |
| 331 | 331 |
| 332 { | 332 { |
| 333 Node* node = graph.NewNode(&dummy_operator1, n0); | 333 Node* node = graph.NewNode(&dummy_operator1, n0); |
| 334 node->InsertInputs(graph.zone(), 0, 1); | 334 node->InsertInputs(graph.zone(), 0, 1); |
| 335 node->ReplaceInput(0, n1); | 335 node->ReplaceInput(0, n1); |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 390 node->ReplaceInput(2, node); | 390 node->ReplaceInput(2, node); |
| 391 node->ReplaceInput(3, node); | 391 node->ReplaceInput(3, node); |
| 392 node->ReplaceInput(4, node); | 392 node->ReplaceInput(4, node); |
| 393 node->ReplaceInput(5, node); | 393 node->ReplaceInput(5, node); |
| 394 CHECK_INPUTS(node, n0, n1, node, node, node, node, n2); | 394 CHECK_INPUTS(node, n0, n1, node, node, node, node, n2); |
| 395 } | 395 } |
| 396 } | 396 } |
| 397 | 397 |
| 398 TEST(RemoveInput) { | 398 TEST(RemoveInput) { |
| 399 v8::internal::AccountingAllocator allocator; | 399 v8::internal::AccountingAllocator allocator; |
| 400 Zone zone(&allocator); | 400 Zone zone(&allocator, ZONE_NAME); |
| 401 Graph graph(&zone); | 401 Graph graph(&zone); |
| 402 | 402 |
| 403 Node* n0 = graph.NewNode(&dummy_operator0); | 403 Node* n0 = graph.NewNode(&dummy_operator0); |
| 404 Node* n1 = graph.NewNode(&dummy_operator1, n0); | 404 Node* n1 = graph.NewNode(&dummy_operator1, n0); |
| 405 Node* n2 = graph.NewNode(&dummy_operator2, n0, n1); | 405 Node* n2 = graph.NewNode(&dummy_operator2, n0, n1); |
| 406 | 406 |
| 407 CHECK_INPUTS(n0, NONE); | 407 CHECK_INPUTS(n0, NONE); |
| 408 CHECK_INPUTS(n1, n0); | 408 CHECK_INPUTS(n1, n0); |
| 409 CHECK_INPUTS(n2, n0, n1); | 409 CHECK_INPUTS(n2, n0, n1); |
| 410 CHECK_USES(n0, n1, n2); | 410 CHECK_USES(n0, n1, n2); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 421 n2->RemoveInput(0); | 421 n2->RemoveInput(0); |
| 422 CHECK_INPUTS(n2, NONE); | 422 CHECK_INPUTS(n2, NONE); |
| 423 CHECK_USES(n0, NONE); | 423 CHECK_USES(n0, NONE); |
| 424 CHECK_USES(n1, NONE); | 424 CHECK_USES(n1, NONE); |
| 425 CHECK_USES(n2, NONE); | 425 CHECK_USES(n2, NONE); |
| 426 } | 426 } |
| 427 | 427 |
| 428 | 428 |
| 429 TEST(AppendInputsAndIterator) { | 429 TEST(AppendInputsAndIterator) { |
| 430 v8::internal::AccountingAllocator allocator; | 430 v8::internal::AccountingAllocator allocator; |
| 431 Zone zone(&allocator); | 431 Zone zone(&allocator, ZONE_NAME); |
| 432 Graph graph(&zone); | 432 Graph graph(&zone); |
| 433 | 433 |
| 434 Node* n0 = graph.NewNode(&dummy_operator0); | 434 Node* n0 = graph.NewNode(&dummy_operator0); |
| 435 Node* n1 = graph.NewNode(&dummy_operator1, n0); | 435 Node* n1 = graph.NewNode(&dummy_operator1, n0); |
| 436 Node* n2 = graph.NewNode(&dummy_operator2, n0, n1); | 436 Node* n2 = graph.NewNode(&dummy_operator2, n0, n1); |
| 437 | 437 |
| 438 CHECK_INPUTS(n0, NONE); | 438 CHECK_INPUTS(n0, NONE); |
| 439 CHECK_INPUTS(n1, n0); | 439 CHECK_INPUTS(n1, n0); |
| 440 CHECK_INPUTS(n2, n0, n1); | 440 CHECK_INPUTS(n2, n0, n1); |
| 441 CHECK_USES(n0, n1, n2); | 441 CHECK_USES(n0, n1, n2); |
| 442 | 442 |
| 443 Node* n3 = graph.NewNode(&dummy_operator0); | 443 Node* n3 = graph.NewNode(&dummy_operator0); |
| 444 | 444 |
| 445 n2->AppendInput(graph.zone(), n3); | 445 n2->AppendInput(graph.zone(), n3); |
| 446 | 446 |
| 447 CHECK_INPUTS(n2, n0, n1, n3); | 447 CHECK_INPUTS(n2, n0, n1, n3); |
| 448 CHECK_USES(n3, n2); | 448 CHECK_USES(n3, n2); |
| 449 } | 449 } |
| 450 | 450 |
| 451 | 451 |
| 452 TEST(NullInputsSimple) { | 452 TEST(NullInputsSimple) { |
| 453 v8::internal::AccountingAllocator allocator; | 453 v8::internal::AccountingAllocator allocator; |
| 454 Zone zone(&allocator); | 454 Zone zone(&allocator, ZONE_NAME); |
| 455 Graph graph(&zone); | 455 Graph graph(&zone); |
| 456 | 456 |
| 457 Node* n0 = graph.NewNode(&dummy_operator0); | 457 Node* n0 = graph.NewNode(&dummy_operator0); |
| 458 Node* n1 = graph.NewNode(&dummy_operator1, n0); | 458 Node* n1 = graph.NewNode(&dummy_operator1, n0); |
| 459 Node* n2 = graph.NewNode(&dummy_operator2, n0, n1); | 459 Node* n2 = graph.NewNode(&dummy_operator2, n0, n1); |
| 460 | 460 |
| 461 CHECK_INPUTS(n0, NONE); | 461 CHECK_INPUTS(n0, NONE); |
| 462 CHECK_INPUTS(n1, n0); | 462 CHECK_INPUTS(n1, n0); |
| 463 CHECK_INPUTS(n2, n0, n1); | 463 CHECK_INPUTS(n2, n0, n1); |
| 464 CHECK_USES(n0, n1, n2); | 464 CHECK_USES(n0, n1, n2); |
| 465 | 465 |
| 466 n2->ReplaceInput(0, nullptr); | 466 n2->ReplaceInput(0, nullptr); |
| 467 | 467 |
| 468 CHECK_INPUTS(n2, NULL, n1); | 468 CHECK_INPUTS(n2, NULL, n1); |
| 469 | 469 |
| 470 CHECK_USES(n0, n1); | 470 CHECK_USES(n0, n1); |
| 471 | 471 |
| 472 n2->ReplaceInput(1, nullptr); | 472 n2->ReplaceInput(1, nullptr); |
| 473 | 473 |
| 474 CHECK_INPUTS(n2, NULL, NULL); | 474 CHECK_INPUTS(n2, NULL, NULL); |
| 475 | 475 |
| 476 CHECK_USES(n1, NONE); | 476 CHECK_USES(n1, NONE); |
| 477 } | 477 } |
| 478 | 478 |
| 479 | 479 |
| 480 TEST(NullInputsAppended) { | 480 TEST(NullInputsAppended) { |
| 481 v8::internal::AccountingAllocator allocator; | 481 v8::internal::AccountingAllocator allocator; |
| 482 Zone zone(&allocator); | 482 Zone zone(&allocator, ZONE_NAME); |
| 483 Graph graph(&zone); | 483 Graph graph(&zone); |
| 484 | 484 |
| 485 Node* n0 = graph.NewNode(&dummy_operator0); | 485 Node* n0 = graph.NewNode(&dummy_operator0); |
| 486 Node* n1 = graph.NewNode(&dummy_operator1, n0); | 486 Node* n1 = graph.NewNode(&dummy_operator1, n0); |
| 487 Node* n2 = graph.NewNode(&dummy_operator1, n0); | 487 Node* n2 = graph.NewNode(&dummy_operator1, n0); |
| 488 Node* n3 = graph.NewNode(&dummy_operator1, n0); | 488 Node* n3 = graph.NewNode(&dummy_operator1, n0); |
| 489 n3->AppendInput(graph.zone(), n1); | 489 n3->AppendInput(graph.zone(), n1); |
| 490 n3->AppendInput(graph.zone(), n2); | 490 n3->AppendInput(graph.zone(), n2); |
| 491 | 491 |
| 492 CHECK_INPUTS(n3, n0, n1, n2); | 492 CHECK_INPUTS(n3, n0, n1, n2); |
| 493 CHECK_USES(n0, n1, n2, n3); | 493 CHECK_USES(n0, n1, n2, n3); |
| 494 CHECK_USES(n1, n3); | 494 CHECK_USES(n1, n3); |
| 495 CHECK_USES(n2, n3); | 495 CHECK_USES(n2, n3); |
| 496 | 496 |
| 497 n3->ReplaceInput(1, NULL); | 497 n3->ReplaceInput(1, NULL); |
| 498 CHECK_USES(n1, NONE); | 498 CHECK_USES(n1, NONE); |
| 499 | 499 |
| 500 CHECK_INPUTS(n3, n0, NULL, n2); | 500 CHECK_INPUTS(n3, n0, NULL, n2); |
| 501 } | 501 } |
| 502 | 502 |
| 503 | 503 |
| 504 TEST(ReplaceUsesFromAppendedInputs) { | 504 TEST(ReplaceUsesFromAppendedInputs) { |
| 505 v8::internal::AccountingAllocator allocator; | 505 v8::internal::AccountingAllocator allocator; |
| 506 Zone zone(&allocator); | 506 Zone zone(&allocator, ZONE_NAME); |
| 507 Graph graph(&zone); | 507 Graph graph(&zone); |
| 508 | 508 |
| 509 Node* n0 = graph.NewNode(&dummy_operator0); | 509 Node* n0 = graph.NewNode(&dummy_operator0); |
| 510 Node* n1 = graph.NewNode(&dummy_operator1, n0); | 510 Node* n1 = graph.NewNode(&dummy_operator1, n0); |
| 511 Node* n2 = graph.NewNode(&dummy_operator1, n0); | 511 Node* n2 = graph.NewNode(&dummy_operator1, n0); |
| 512 Node* n3 = graph.NewNode(&dummy_operator0); | 512 Node* n3 = graph.NewNode(&dummy_operator0); |
| 513 | 513 |
| 514 CHECK_INPUTS(n2, n0); | 514 CHECK_INPUTS(n2, n0); |
| 515 | 515 |
| 516 n2->AppendInput(graph.zone(), n1); | 516 n2->AppendInput(graph.zone(), n1); |
| 517 CHECK_INPUTS(n2, n0, n1); | 517 CHECK_INPUTS(n2, n0, n1); |
| 518 CHECK_USES(n1, n2); | 518 CHECK_USES(n1, n2); |
| 519 | 519 |
| 520 n2->AppendInput(graph.zone(), n0); | 520 n2->AppendInput(graph.zone(), n0); |
| 521 CHECK_INPUTS(n2, n0, n1, n0); | 521 CHECK_INPUTS(n2, n0, n1, n0); |
| 522 CHECK_USES(n1, n2); | 522 CHECK_USES(n1, n2); |
| 523 CHECK_USES(n0, n2, n1, n2); | 523 CHECK_USES(n0, n2, n1, n2); |
| 524 | 524 |
| 525 n0->ReplaceUses(n3); | 525 n0->ReplaceUses(n3); |
| 526 | 526 |
| 527 CHECK_USES(n0, NONE); | 527 CHECK_USES(n0, NONE); |
| 528 CHECK_INPUTS(n2, n3, n1, n3); | 528 CHECK_INPUTS(n2, n3, n1, n3); |
| 529 CHECK_USES(n3, n2, n1, n2); | 529 CHECK_USES(n3, n2, n1, n2); |
| 530 } | 530 } |
| 531 | 531 |
| 532 | 532 |
| 533 TEST(ReplaceInputMultipleUses) { | 533 TEST(ReplaceInputMultipleUses) { |
| 534 v8::internal::AccountingAllocator allocator; | 534 v8::internal::AccountingAllocator allocator; |
| 535 Zone zone(&allocator); | 535 Zone zone(&allocator, ZONE_NAME); |
| 536 Graph graph(&zone); | 536 Graph graph(&zone); |
| 537 | 537 |
| 538 Node* n0 = graph.NewNode(&dummy_operator0); | 538 Node* n0 = graph.NewNode(&dummy_operator0); |
| 539 Node* n1 = graph.NewNode(&dummy_operator0); | 539 Node* n1 = graph.NewNode(&dummy_operator0); |
| 540 Node* n2 = graph.NewNode(&dummy_operator1, n0); | 540 Node* n2 = graph.NewNode(&dummy_operator1, n0); |
| 541 n2->ReplaceInput(0, n1); | 541 n2->ReplaceInput(0, n1); |
| 542 CHECK_EQ(0, n0->UseCount()); | 542 CHECK_EQ(0, n0->UseCount()); |
| 543 CHECK_EQ(1, n1->UseCount()); | 543 CHECK_EQ(1, n1->UseCount()); |
| 544 | 544 |
| 545 Node* n3 = graph.NewNode(&dummy_operator1, n0); | 545 Node* n3 = graph.NewNode(&dummy_operator1, n0); |
| 546 n3->ReplaceInput(0, n1); | 546 n3->ReplaceInput(0, n1); |
| 547 CHECK_EQ(0, n0->UseCount()); | 547 CHECK_EQ(0, n0->UseCount()); |
| 548 CHECK_EQ(2, n1->UseCount()); | 548 CHECK_EQ(2, n1->UseCount()); |
| 549 } | 549 } |
| 550 | 550 |
| 551 | 551 |
| 552 TEST(TrimInputCountInline) { | 552 TEST(TrimInputCountInline) { |
| 553 v8::internal::AccountingAllocator allocator; | 553 v8::internal::AccountingAllocator allocator; |
| 554 Zone zone(&allocator); | 554 Zone zone(&allocator, ZONE_NAME); |
| 555 Graph graph(&zone); | 555 Graph graph(&zone); |
| 556 | 556 |
| 557 { | 557 { |
| 558 Node* n0 = graph.NewNode(&dummy_operator0); | 558 Node* n0 = graph.NewNode(&dummy_operator0); |
| 559 Node* n1 = graph.NewNode(&dummy_operator1, n0); | 559 Node* n1 = graph.NewNode(&dummy_operator1, n0); |
| 560 n1->TrimInputCount(1); | 560 n1->TrimInputCount(1); |
| 561 CHECK_INPUTS(n1, n0); | 561 CHECK_INPUTS(n1, n0); |
| 562 CHECK_USES(n0, n1); | 562 CHECK_USES(n0, n1); |
| 563 } | 563 } |
| 564 | 564 |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 613 Node* n2 = graph.NewNode(&dummy_operator2, n0, n0); | 613 Node* n2 = graph.NewNode(&dummy_operator2, n0, n0); |
| 614 n2->TrimInputCount(0); | 614 n2->TrimInputCount(0); |
| 615 CHECK_INPUTS(n2, NONE); | 615 CHECK_INPUTS(n2, NONE); |
| 616 CHECK_USES(n0, NONE); | 616 CHECK_USES(n0, NONE); |
| 617 } | 617 } |
| 618 } | 618 } |
| 619 | 619 |
| 620 | 620 |
| 621 TEST(TrimInputCountOutOfLine1) { | 621 TEST(TrimInputCountOutOfLine1) { |
| 622 v8::internal::AccountingAllocator allocator; | 622 v8::internal::AccountingAllocator allocator; |
| 623 Zone zone(&allocator); | 623 Zone zone(&allocator, ZONE_NAME); |
| 624 Graph graph(&zone); | 624 Graph graph(&zone); |
| 625 | 625 |
| 626 { | 626 { |
| 627 Node* n0 = graph.NewNode(&dummy_operator0); | 627 Node* n0 = graph.NewNode(&dummy_operator0); |
| 628 Node* n1 = graph.NewNode(&dummy_operator0); | 628 Node* n1 = graph.NewNode(&dummy_operator0); |
| 629 n1->AppendInput(graph.zone(), n0); | 629 n1->AppendInput(graph.zone(), n0); |
| 630 CHECK_INPUTS(n1, n0); | 630 CHECK_INPUTS(n1, n0); |
| 631 CHECK_USES(n0, n1); | 631 CHECK_USES(n0, n1); |
| 632 | 632 |
| 633 n1->TrimInputCount(1); | 633 n1->TrimInputCount(1); |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 708 CHECK_USES(n0, n2, n2); | 708 CHECK_USES(n0, n2, n2); |
| 709 n2->TrimInputCount(0); | 709 n2->TrimInputCount(0); |
| 710 CHECK_INPUTS(n2, NONE); | 710 CHECK_INPUTS(n2, NONE); |
| 711 CHECK_USES(n0, NONE); | 711 CHECK_USES(n0, NONE); |
| 712 } | 712 } |
| 713 } | 713 } |
| 714 | 714 |
| 715 | 715 |
| 716 TEST(TrimInputCountOutOfLine2) { | 716 TEST(TrimInputCountOutOfLine2) { |
| 717 v8::internal::AccountingAllocator allocator; | 717 v8::internal::AccountingAllocator allocator; |
| 718 Zone zone(&allocator); | 718 Zone zone(&allocator, ZONE_NAME); |
| 719 Graph graph(&zone); | 719 Graph graph(&zone); |
| 720 | 720 |
| 721 { | 721 { |
| 722 Node* n0 = graph.NewNode(&dummy_operator0); | 722 Node* n0 = graph.NewNode(&dummy_operator0); |
| 723 Node* n1 = graph.NewNode(&dummy_operator0); | 723 Node* n1 = graph.NewNode(&dummy_operator0); |
| 724 Node* n2 = graph.NewNode(&dummy_operator1, n0); | 724 Node* n2 = graph.NewNode(&dummy_operator1, n0); |
| 725 n2->AppendInput(graph.zone(), n1); | 725 n2->AppendInput(graph.zone(), n1); |
| 726 CHECK_INPUTS(n2, n0, n1); | 726 CHECK_INPUTS(n2, n0, n1); |
| 727 n2->TrimInputCount(2); | 727 n2->TrimInputCount(2); |
| 728 CHECK_INPUTS(n2, n0, n1); | 728 CHECK_INPUTS(n2, n0, n1); |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 778 n2->TrimInputCount(0); | 778 n2->TrimInputCount(0); |
| 779 CHECK_EQ(0, n2->InputCount()); | 779 CHECK_EQ(0, n2->InputCount()); |
| 780 CHECK_EQ(0, n0->UseCount()); | 780 CHECK_EQ(0, n0->UseCount()); |
| 781 CHECK_EQ(0, n2->UseCount()); | 781 CHECK_EQ(0, n2->UseCount()); |
| 782 } | 782 } |
| 783 } | 783 } |
| 784 | 784 |
| 785 | 785 |
| 786 TEST(NullAllInputs) { | 786 TEST(NullAllInputs) { |
| 787 v8::internal::AccountingAllocator allocator; | 787 v8::internal::AccountingAllocator allocator; |
| 788 Zone zone(&allocator); | 788 Zone zone(&allocator, ZONE_NAME); |
| 789 Graph graph(&zone); | 789 Graph graph(&zone); |
| 790 | 790 |
| 791 for (int i = 0; i < 2; i++) { | 791 for (int i = 0; i < 2; i++) { |
| 792 Node* n0 = graph.NewNode(&dummy_operator0); | 792 Node* n0 = graph.NewNode(&dummy_operator0); |
| 793 Node* n1 = graph.NewNode(&dummy_operator1, n0); | 793 Node* n1 = graph.NewNode(&dummy_operator1, n0); |
| 794 Node* n2; | 794 Node* n2; |
| 795 if (i == 0) { | 795 if (i == 0) { |
| 796 n2 = graph.NewNode(&dummy_operator2, n0, n1); | 796 n2 = graph.NewNode(&dummy_operator2, n0, n1); |
| 797 CHECK_INPUTS(n2, n0, n1); | 797 CHECK_INPUTS(n2, n0, n1); |
| 798 } else { | 798 } else { |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 831 CHECK_INPUTS(n0, NONE); | 831 CHECK_INPUTS(n0, NONE); |
| 832 CHECK_INPUTS(n1, NULL); | 832 CHECK_INPUTS(n1, NULL); |
| 833 CHECK_USES(n0, NONE); | 833 CHECK_USES(n0, NONE); |
| 834 CHECK_USES(n1, NONE); | 834 CHECK_USES(n1, NONE); |
| 835 } | 835 } |
| 836 } | 836 } |
| 837 | 837 |
| 838 | 838 |
| 839 TEST(AppendAndTrim) { | 839 TEST(AppendAndTrim) { |
| 840 v8::internal::AccountingAllocator allocator; | 840 v8::internal::AccountingAllocator allocator; |
| 841 Zone zone(&allocator); | 841 Zone zone(&allocator, ZONE_NAME); |
| 842 Graph graph(&zone); | 842 Graph graph(&zone); |
| 843 | 843 |
| 844 Node* nodes[] = { | 844 Node* nodes[] = { |
| 845 graph.NewNode(&dummy_operator0), graph.NewNode(&dummy_operator0), | 845 graph.NewNode(&dummy_operator0), graph.NewNode(&dummy_operator0), |
| 846 graph.NewNode(&dummy_operator0), graph.NewNode(&dummy_operator0), | 846 graph.NewNode(&dummy_operator0), graph.NewNode(&dummy_operator0), |
| 847 graph.NewNode(&dummy_operator0)}; | 847 graph.NewNode(&dummy_operator0)}; |
| 848 | 848 |
| 849 int max = static_cast<int>(arraysize(nodes)); | 849 int max = static_cast<int>(arraysize(nodes)); |
| 850 | 850 |
| 851 Node* last = graph.NewNode(&dummy_operator0); | 851 Node* last = graph.NewNode(&dummy_operator0); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 871 if (j >= i) CHECK_USES(nodes[j], NONE); | 871 if (j >= i) CHECK_USES(nodes[j], NONE); |
| 872 } | 872 } |
| 873 | 873 |
| 874 CHECK_USES(last, NONE); | 874 CHECK_USES(last, NONE); |
| 875 } | 875 } |
| 876 } | 876 } |
| 877 | 877 |
| 878 } // namespace compiler | 878 } // namespace compiler |
| 879 } // namespace internal | 879 } // namespace internal |
| 880 } // namespace v8 | 880 } // namespace v8 |
| OLD | NEW |