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

Side by Side Diff: test/cctest/test-feedback-vector.cc

Issue 1303053004: Revert of Vector ICs: platform support for vector-based stores. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 3 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
« no previous file with comments | « src/x64/code-stubs-x64.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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 if (FLAG_vector_stores) { 419 CHECK_EQ(2, feedback_vector->ICSlots());
420 CHECK_EQ(4, feedback_vector->ICSlots()); 420 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(0)) == Code::LOAD_IC);
421 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(0)) == Code::STORE_IC); 421 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(1)) == Code::LOAD_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 }
430 422
431 CompileRun( 423 CompileRun(
432 "function testprop(x) {" 424 "function testprop(x) {"
433 " x.blue = a;" 425 " x.blue = a;"
434 "}" 426 "}"
435 "testprop({ blue: 3 });"); 427 "testprop({ blue: 3 });");
436 428
437 f = GetFunction("testprop"); 429 f = GetFunction("testprop");
438 430
439 // There should be one LOAD_IC, for the load of a. 431 // There should be one LOAD_IC, for the load of a.
440 feedback_vector = handle(f->shared()->feedback_vector(), isolate); 432 feedback_vector = handle(f->shared()->feedback_vector(), isolate);
441 if (FLAG_vector_stores) { 433 CHECK_EQ(1, feedback_vector->ICSlots());
442 CHECK_EQ(2, feedback_vector->ICSlots());
443 } else {
444 CHECK_EQ(1, feedback_vector->ICSlots());
445 }
446 434
447 CompileRun( 435 CompileRun(
448 "function testpropfunc(x) {" 436 "function testpropfunc(x) {"
449 " x().blue = a;" 437 " x().blue = a;"
450 " return x().blue;" 438 " return x().blue;"
451 "}" 439 "}"
452 "function makeresult() { return { blue: 3 }; }" 440 "function makeresult() { return { blue: 3 }; }"
453 "testpropfunc(makeresult);"); 441 "testpropfunc(makeresult);");
454 442
455 f = GetFunction("testpropfunc"); 443 f = GetFunction("testpropfunc");
456 444
457 // There should be 2 LOAD_ICs and 2 CALL_ICs. 445 // There should be 2 LOAD_ICs and 2 CALL_ICs.
458 feedback_vector = handle(f->shared()->feedback_vector(), isolate); 446 feedback_vector = handle(f->shared()->feedback_vector(), isolate);
459 if (FLAG_vector_stores) { 447 CHECK_EQ(4, feedback_vector->ICSlots());
460 CHECK_EQ(5, feedback_vector->ICSlots()); 448 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(0)) == Code::CALL_IC);
461 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(0)) == Code::CALL_IC); 449 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(1)) == Code::LOAD_IC);
462 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(1)) == Code::LOAD_IC); 450 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(2)) == Code::CALL_IC);
463 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(2)) == Code::STORE_IC); 451 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(3)) == Code::LOAD_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 }
473 452
474 CompileRun( 453 CompileRun(
475 "function testkeyedprop(x) {" 454 "function testkeyedprop(x) {"
476 " x[0] = a;" 455 " x[0] = a;"
477 " return x[0];" 456 " return x[0];"
478 "}" 457 "}"
479 "testkeyedprop([0, 1, 2]);"); 458 "testkeyedprop([0, 1, 2]);");
480 459
481 f = GetFunction("testkeyedprop"); 460 f = GetFunction("testkeyedprop");
482 461
483 // There should be 1 LOAD_ICs for the load of a, and one KEYED_LOAD_IC for the 462 // There should be 1 LOAD_ICs for the load of a, and one KEYED_LOAD_IC for the
484 // load of x[0] in the return statement. 463 // load of x[0] in the return statement.
485 feedback_vector = handle(f->shared()->feedback_vector(), isolate); 464 feedback_vector = handle(f->shared()->feedback_vector(), isolate);
486 if (FLAG_vector_stores) { 465 CHECK_EQ(2, feedback_vector->ICSlots());
487 CHECK_EQ(3, feedback_vector->ICSlots()); 466 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(0)) == Code::LOAD_IC);
488 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(0)) == Code::LOAD_IC); 467 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(1)) ==
489 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(1)) == 468 Code::KEYED_LOAD_IC);
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 }
499 469
500 CompileRun( 470 CompileRun(
501 "function testcompound(x) {" 471 "function testcompound(x) {"
502 " x.old = x.young = x.in_between = a;" 472 " x.old = x.young = x.in_between = a;"
503 " return x.old + x.young;" 473 " return x.old + x.young;"
504 "}" 474 "}"
505 "testcompound({ old: 3, young: 3, in_between: 3 });"); 475 "testcompound({ old: 3, young: 3, in_between: 3 });");
506 476
507 f = GetFunction("testcompound"); 477 f = GetFunction("testcompound");
508 478
509 // There should be 3 LOAD_ICs, for load of a and load of x.old and x.young. 479 // There should be 3 LOAD_ICs, for load of a and load of x.old and x.young.
510 feedback_vector = handle(f->shared()->feedback_vector(), isolate); 480 feedback_vector = handle(f->shared()->feedback_vector(), isolate);
511 if (FLAG_vector_stores) { 481 CHECK_EQ(3, feedback_vector->ICSlots());
512 CHECK_EQ(6, feedback_vector->ICSlots()); 482 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(0)) == Code::LOAD_IC);
513 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(0)) == Code::LOAD_IC); 483 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(1)) == Code::LOAD_IC);
514 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(1)) == Code::STORE_IC); 484 CHECK(feedback_vector->GetKind(FeedbackVectorICSlot(2)) == Code::LOAD_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());
553 } 485 }
554 } 486 }
OLDNEW
« no previous file with comments | « src/x64/code-stubs-x64.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698