OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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 "src/v8.h" | 5 #include "src/v8.h" |
6 #include "test/cctest/cctest.h" | 6 #include "test/cctest/cctest.h" |
7 | 7 |
8 #include "src/api.h" | 8 #include "src/api.h" |
9 #include "src/debug/debug.h" | 9 #include "src/debug/debug.h" |
10 #include "src/execution.h" | 10 #include "src/execution.h" |
(...skipping 398 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
409 " return y;" | 409 " return y;" |
410 "}" | 410 "}" |
411 "a = 3;" | 411 "a = 3;" |
412 "testvar({});"); | 412 "testvar({});"); |
413 | 413 |
414 Handle<JSFunction> f = GetFunction("testvar"); | 414 Handle<JSFunction> f = GetFunction("testvar"); |
415 | 415 |
416 // There should be two LOAD_ICs, one for a and one for y at the end. | 416 // There should be two LOAD_ICs, one for a and one for y at the end. |
417 Handle<TypeFeedbackVector> feedback_vector = | 417 Handle<TypeFeedbackVector> feedback_vector = |
418 handle(f->shared()->feedback_vector(), isolate); | 418 handle(f->shared()->feedback_vector(), isolate); |
419 CHECK_EQ(2, feedback_vector->ICSlots()); | 419 if (FLAG_vector_stores) { |
420 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(0)) == Code::LOAD_IC); | 420 CHECK_EQ(4, feedback_vector->ICSlots()); |
421 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(1)) == Code::LOAD_IC); | 421 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(0)) == Code::STORE_IC); |
| 422 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(1)) == Code::LOAD_IC); |
| 423 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(2)) == Code::STORE_IC); |
| 424 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(3)) == Code::LOAD_IC); |
| 425 } else { |
| 426 CHECK_EQ(2, feedback_vector->ICSlots()); |
| 427 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(0)) == Code::LOAD_IC); |
| 428 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(1)) == Code::LOAD_IC); |
| 429 } |
422 | 430 |
423 CompileRun( | 431 CompileRun( |
424 "function testprop(x) {" | 432 "function testprop(x) {" |
425 " x.blue = a;" | 433 " x.blue = a;" |
426 "}" | 434 "}" |
427 "testprop({ blue: 3 });"); | 435 "testprop({ blue: 3 });"); |
428 | 436 |
429 f = GetFunction("testprop"); | 437 f = GetFunction("testprop"); |
430 | 438 |
431 // There should be one LOAD_IC, for the load of a. | 439 // There should be one LOAD_IC, for the load of a. |
432 feedback_vector = handle(f->shared()->feedback_vector(), isolate); | 440 feedback_vector = handle(f->shared()->feedback_vector(), isolate); |
433 CHECK_EQ(1, feedback_vector->ICSlots()); | 441 if (FLAG_vector_stores) { |
| 442 CHECK_EQ(2, feedback_vector->ICSlots()); |
| 443 } else { |
| 444 CHECK_EQ(1, feedback_vector->ICSlots()); |
| 445 } |
434 | 446 |
435 CompileRun( | 447 CompileRun( |
436 "function testpropfunc(x) {" | 448 "function testpropfunc(x) {" |
437 " x().blue = a;" | 449 " x().blue = a;" |
438 " return x().blue;" | 450 " return x().blue;" |
439 "}" | 451 "}" |
440 "function makeresult() { return { blue: 3 }; }" | 452 "function makeresult() { return { blue: 3 }; }" |
441 "testpropfunc(makeresult);"); | 453 "testpropfunc(makeresult);"); |
442 | 454 |
443 f = GetFunction("testpropfunc"); | 455 f = GetFunction("testpropfunc"); |
444 | 456 |
445 // There should be 2 LOAD_ICs and 2 CALL_ICs. | 457 // There should be 2 LOAD_ICs and 2 CALL_ICs. |
446 feedback_vector = handle(f->shared()->feedback_vector(), isolate); | 458 feedback_vector = handle(f->shared()->feedback_vector(), isolate); |
447 CHECK_EQ(4, feedback_vector->ICSlots()); | 459 if (FLAG_vector_stores) { |
448 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(0)) == Code::CALL_IC); | 460 CHECK_EQ(5, feedback_vector->ICSlots()); |
449 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(1)) == Code::LOAD_IC); | 461 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(0)) == Code::CALL_IC); |
450 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(2)) == Code::CALL_IC); | 462 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(1)) == Code::LOAD_IC); |
451 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(3)) == Code::LOAD_IC); | 463 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(2)) == Code::STORE_IC); |
| 464 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(3)) == Code::CALL_IC); |
| 465 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(4)) == Code::LOAD_IC); |
| 466 } else { |
| 467 CHECK_EQ(4, feedback_vector->ICSlots()); |
| 468 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(0)) == Code::CALL_IC); |
| 469 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(1)) == Code::LOAD_IC); |
| 470 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(2)) == Code::CALL_IC); |
| 471 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(3)) == Code::LOAD_IC); |
| 472 } |
452 | 473 |
453 CompileRun( | 474 CompileRun( |
454 "function testkeyedprop(x) {" | 475 "function testkeyedprop(x) {" |
455 " x[0] = a;" | 476 " x[0] = a;" |
456 " return x[0];" | 477 " return x[0];" |
457 "}" | 478 "}" |
458 "testkeyedprop([0, 1, 2]);"); | 479 "testkeyedprop([0, 1, 2]);"); |
459 | 480 |
460 f = GetFunction("testkeyedprop"); | 481 f = GetFunction("testkeyedprop"); |
461 | 482 |
462 // There should be 1 LOAD_ICs for the load of a, and one KEYED_LOAD_IC for the | 483 // There should be 1 LOAD_ICs for the load of a, and one KEYED_LOAD_IC for the |
463 // load of x[0] in the return statement. | 484 // load of x[0] in the return statement. |
464 feedback_vector = handle(f->shared()->feedback_vector(), isolate); | 485 feedback_vector = handle(f->shared()->feedback_vector(), isolate); |
465 CHECK_EQ(2, feedback_vector->ICSlots()); | 486 if (FLAG_vector_stores) { |
466 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(0)) == Code::LOAD_IC); | 487 CHECK_EQ(3, feedback_vector->ICSlots()); |
467 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(1)) == | 488 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(0)) == Code::LOAD_IC); |
468 Code::KEYED_LOAD_IC); | 489 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(1)) == |
| 490 Code::KEYED_STORE_IC); |
| 491 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(2)) == |
| 492 Code::KEYED_LOAD_IC); |
| 493 } else { |
| 494 CHECK_EQ(2, feedback_vector->ICSlots()); |
| 495 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(0)) == Code::LOAD_IC); |
| 496 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(1)) == |
| 497 Code::KEYED_LOAD_IC); |
| 498 } |
469 | 499 |
470 CompileRun( | 500 CompileRun( |
471 "function testcompound(x) {" | 501 "function testcompound(x) {" |
472 " x.old = x.young = x.in_between = a;" | 502 " x.old = x.young = x.in_between = a;" |
473 " return x.old + x.young;" | 503 " return x.old + x.young;" |
474 "}" | 504 "}" |
475 "testcompound({ old: 3, young: 3, in_between: 3 });"); | 505 "testcompound({ old: 3, young: 3, in_between: 3 });"); |
476 | 506 |
477 f = GetFunction("testcompound"); | 507 f = GetFunction("testcompound"); |
478 | 508 |
479 // There should be 3 LOAD_ICs, for load of a and load of x.old and x.young. | 509 // There should be 3 LOAD_ICs, for load of a and load of x.old and x.young. |
480 feedback_vector = handle(f->shared()->feedback_vector(), isolate); | 510 feedback_vector = handle(f->shared()->feedback_vector(), isolate); |
481 CHECK_EQ(3, feedback_vector->ICSlots()); | 511 if (FLAG_vector_stores) { |
482 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(0)) == Code::LOAD_IC); | 512 CHECK_EQ(6, feedback_vector->ICSlots()); |
483 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(1)) == Code::LOAD_IC); | 513 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(0)) == Code::LOAD_IC); |
484 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(2)) == Code::LOAD_IC); | 514 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(1)) == Code::STORE_IC); |
| 515 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(2)) == Code::STORE_IC); |
| 516 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(3)) == Code::STORE_IC); |
| 517 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(4)) == Code::LOAD_IC); |
| 518 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(5)) == Code::LOAD_IC); |
| 519 } else { |
| 520 CHECK_EQ(3, feedback_vector->ICSlots()); |
| 521 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(0)) == Code::LOAD_IC); |
| 522 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(1)) == Code::LOAD_IC); |
| 523 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(2)) == Code::LOAD_IC); |
| 524 } |
| 525 } |
| 526 |
| 527 |
| 528 TEST(VectorStoreICBasic) { |
| 529 if (i::FLAG_always_opt) return; |
| 530 if (!i::FLAG_vector_stores) return; |
| 531 |
| 532 CcTest::InitializeVM(); |
| 533 LocalContext context; |
| 534 v8::HandleScope scope(context->GetIsolate()); |
| 535 Isolate* isolate = CcTest::i_isolate(); |
| 536 |
| 537 CompileRun( |
| 538 "function f(a) {" |
| 539 " a.foo = 5;" |
| 540 "}" |
| 541 "var a = { foo: 3 };" |
| 542 "f(a);" |
| 543 "f(a);" |
| 544 "f(a);"); |
| 545 Handle<JSFunction> f = GetFunction("f"); |
| 546 // There should be one IC slot. |
| 547 Handle<TypeFeedbackVector> feedback_vector = |
| 548 Handle<TypeFeedbackVector>(f->shared()->feedback_vector(), isolate); |
| 549 CHECK_EQ(1, feedback_vector->ICSlots()); |
| 550 FeedbackVectorICSlot slot(0); |
| 551 StoreICNexus nexus(feedback_vector, slot); |
| 552 CHECK_EQ(MONOMORPHIC, nexus.StateFromFeedback()); |
485 } | 553 } |
486 } | 554 } |
OLD | NEW |