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

Side by Side Diff: runtime/vm/flow_graph_compiler.cc

Issue 17421003: Store arguments descriptor in ICData. Remove loading of arguments descriptor at unoptimized call si… (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 6 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 | Annotate | Revision Log
« no previous file with comments | « runtime/vm/flow_graph_compiler.h ('k') | runtime/vm/flow_graph_compiler_arm.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_XXX. 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_XXX.
6 6
7 #include "vm/flow_graph_compiler.h" 7 #include "vm/flow_graph_compiler.h"
8 8
9 #include "vm/cha.h" 9 #include "vm/cha.h"
10 #include "vm/dart_entry.h" 10 #include "vm/dart_entry.h"
(...skipping 528 matching lines...) Expand 10 before | Expand all | Expand 10 after
539 539
540 void FlowGraphCompiler::GenerateInstanceCall( 540 void FlowGraphCompiler::GenerateInstanceCall(
541 intptr_t deopt_id, 541 intptr_t deopt_id,
542 intptr_t token_pos, 542 intptr_t token_pos,
543 intptr_t argument_count, 543 intptr_t argument_count,
544 const Array& argument_names, 544 const Array& argument_names,
545 LocationSummary* locs, 545 LocationSummary* locs,
546 const ICData& ic_data) { 546 const ICData& ic_data) {
547 ASSERT(!ic_data.IsNull()); 547 ASSERT(!ic_data.IsNull());
548 ASSERT(FLAG_propagate_ic_data || (ic_data.NumberOfChecks() == 0)); 548 ASSERT(FLAG_propagate_ic_data || (ic_data.NumberOfChecks() == 0));
549 const Array& arguments_descriptor =
550 Array::ZoneHandle(ArgumentsDescriptor::New(argument_count,
551 argument_names));
552 uword label_address = 0; 549 uword label_address = 0;
553 if (is_optimizing() && (ic_data.NumberOfChecks() == 0)) { 550 if (is_optimizing() && (ic_data.NumberOfChecks() == 0)) {
554 if (ic_data.is_closure_call()) { 551 if (ic_data.is_closure_call()) {
555 // This IC call may be closure call only. 552 // This IC call may be closure call only.
556 label_address = StubCode::ClosureCallInlineCacheEntryPoint(); 553 label_address = StubCode::ClosureCallInlineCacheEntryPoint();
557 ExternalLabel target_label("InlineCache", label_address); 554 ExternalLabel target_label("InlineCache", label_address);
558 EmitInstanceCall(&target_label, 555 EmitInstanceCall(&target_label,
559 ICData::ZoneHandle(ic_data.AsUnaryClassChecks()), 556 ICData::ZoneHandle(ic_data.AsUnaryClassChecks()),
560 arguments_descriptor, argument_count, 557 argument_count, deopt_id, token_pos, locs);
561 deopt_id, token_pos, locs);
562 return; 558 return;
563 } 559 }
564 // Emit IC call that will count and thus may need reoptimization at 560 // Emit IC call that will count and thus may need reoptimization at
565 // function entry. 561 // function entry.
566 ASSERT(!is_optimizing() 562 ASSERT(!is_optimizing()
567 || may_reoptimize() 563 || may_reoptimize()
568 || flow_graph().IsCompiledForOsr()); 564 || flow_graph().IsCompiledForOsr());
569 switch (ic_data.num_args_tested()) { 565 switch (ic_data.num_args_tested()) {
570 case 1: 566 case 1:
571 label_address = StubCode::OneArgOptimizedCheckInlineCacheEntryPoint(); 567 label_address = StubCode::OneArgOptimizedCheckInlineCacheEntryPoint();
572 break; 568 break;
573 case 2: 569 case 2:
574 label_address = StubCode::TwoArgsOptimizedCheckInlineCacheEntryPoint(); 570 label_address = StubCode::TwoArgsOptimizedCheckInlineCacheEntryPoint();
575 break; 571 break;
576 case 3: 572 case 3:
577 label_address = 573 label_address =
578 StubCode::ThreeArgsOptimizedCheckInlineCacheEntryPoint(); 574 StubCode::ThreeArgsOptimizedCheckInlineCacheEntryPoint();
579 break; 575 break;
580 default: 576 default:
581 UNIMPLEMENTED(); 577 UNIMPLEMENTED();
582 } 578 }
583 ExternalLabel target_label("InlineCache", label_address); 579 ExternalLabel target_label("InlineCache", label_address);
584 EmitOptimizedInstanceCall(&target_label, ic_data, arguments_descriptor, 580 EmitOptimizedInstanceCall(&target_label, ic_data,
585 argument_count, deopt_id, token_pos, locs); 581 argument_count, deopt_id, token_pos, locs);
586 return; 582 return;
587 } 583 }
588 584
589 if (is_optimizing()) { 585 if (is_optimizing()) {
590 EmitMegamorphicInstanceCall(ic_data, arguments_descriptor, argument_count, 586 EmitMegamorphicInstanceCall(ic_data, argument_count,
591 deopt_id, token_pos, locs); 587 deopt_id, token_pos, locs);
592 return; 588 return;
593 } 589 }
594 590
595 switch (ic_data.num_args_tested()) { 591 switch (ic_data.num_args_tested()) {
596 case 1: 592 case 1:
597 label_address = StubCode::OneArgCheckInlineCacheEntryPoint(); 593 label_address = StubCode::OneArgCheckInlineCacheEntryPoint();
598 break; 594 break;
599 case 2: 595 case 2:
600 label_address = StubCode::TwoArgsCheckInlineCacheEntryPoint(); 596 label_address = StubCode::TwoArgsCheckInlineCacheEntryPoint();
601 break; 597 break;
602 case 3: 598 case 3:
603 label_address = StubCode::ThreeArgsCheckInlineCacheEntryPoint(); 599 label_address = StubCode::ThreeArgsCheckInlineCacheEntryPoint();
604 break; 600 break;
605 default: 601 default:
606 UNIMPLEMENTED(); 602 UNIMPLEMENTED();
607 } 603 }
608 ExternalLabel target_label("InlineCache", label_address); 604 ExternalLabel target_label("InlineCache", label_address);
609 EmitInstanceCall(&target_label, ic_data, arguments_descriptor, argument_count, 605 EmitInstanceCall(&target_label, ic_data, argument_count,
610 deopt_id, token_pos, locs); 606 deopt_id, token_pos, locs);
611 } 607 }
612 608
613 609
614 void FlowGraphCompiler::GenerateStaticCall(intptr_t deopt_id, 610 void FlowGraphCompiler::GenerateStaticCall(intptr_t deopt_id,
615 intptr_t token_pos, 611 intptr_t token_pos,
616 const Function& function, 612 const Function& function,
617 intptr_t argument_count, 613 intptr_t argument_count,
618 const Array& argument_names, 614 const Array& argument_names,
619 LocationSummary* locs) { 615 LocationSummary* locs) {
(...skipping 472 matching lines...) Expand 10 before | Expand all | Expand 10 after
1092 1088
1093 for (int i = 0; i < len; i++) { 1089 for (int i = 0; i < len; i++) {
1094 sorted->Add(CidTarget(ic_data.GetReceiverClassIdAt(i), 1090 sorted->Add(CidTarget(ic_data.GetReceiverClassIdAt(i),
1095 &Function::ZoneHandle(ic_data.GetTargetAt(i)), 1091 &Function::ZoneHandle(ic_data.GetTargetAt(i)),
1096 ic_data.GetCountAt(i))); 1092 ic_data.GetCountAt(i)));
1097 } 1093 }
1098 sorted->Sort(HighestCountFirst); 1094 sorted->Sort(HighestCountFirst);
1099 } 1095 }
1100 1096
1101 } // namespace dart 1097 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/flow_graph_compiler.h ('k') | runtime/vm/flow_graph_compiler_arm.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698