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

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

Issue 254723003: Remember all deopt reasons in ic_data, not just the last one. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 7 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
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 740 matching lines...) Expand 10 before | Expand all | Expand 10 after
751 intptr_t deopt_id, 751 intptr_t deopt_id,
752 intptr_t token_pos, 752 intptr_t token_pos,
753 intptr_t argument_count, 753 intptr_t argument_count,
754 const Array& argument_names, 754 const Array& argument_names,
755 LocationSummary* locs, 755 LocationSummary* locs,
756 const ICData& ic_data) { 756 const ICData& ic_data) {
757 ASSERT(!ic_data.IsNull()); 757 ASSERT(!ic_data.IsNull());
758 ASSERT(FLAG_propagate_ic_data || (ic_data.NumberOfChecks() == 0)); 758 ASSERT(FLAG_propagate_ic_data || (ic_data.NumberOfChecks() == 0));
759 uword label_address = 0; 759 uword label_address = 0;
760 if (is_optimizing() && (ic_data.NumberOfChecks() == 0)) { 760 if (is_optimizing() && (ic_data.NumberOfChecks() == 0)) {
761 if (ic_data.is_closure_call()) { 761 if (ic_data.IsClosureCall()) {
762 // This IC call may be closure call only. 762 // This IC call may be closure call only.
763 label_address = StubCode::ClosureCallInlineCacheEntryPoint(); 763 label_address = StubCode::ClosureCallInlineCacheEntryPoint();
764 ExternalLabel target_label("InlineCache", label_address); 764 ExternalLabel target_label("InlineCache", label_address);
765 EmitInstanceCall(&target_label, 765 EmitInstanceCall(&target_label,
766 ICData::ZoneHandle(ic_data.AsUnaryClassChecks()), 766 ICData::ZoneHandle(ic_data.AsUnaryClassChecks()),
767 argument_count, deopt_id, token_pos, locs); 767 argument_count, deopt_id, token_pos, locs);
768 return; 768 return;
769 } 769 }
770 // Emit IC call that will count and thus may need reoptimization at 770 // Emit IC call that will count and thus may need reoptimization at
771 // function entry. 771 // function entry.
772 ASSERT(!is_optimizing() 772 ASSERT(!is_optimizing()
773 || may_reoptimize() 773 || may_reoptimize()
774 || flow_graph().IsCompiledForOsr()); 774 || flow_graph().IsCompiledForOsr());
775 switch (ic_data.num_args_tested()) { 775 switch (ic_data.NumArgsTested()) {
776 case 1: 776 case 1:
777 label_address = StubCode::OneArgOptimizedCheckInlineCacheEntryPoint(); 777 label_address = StubCode::OneArgOptimizedCheckInlineCacheEntryPoint();
778 break; 778 break;
779 case 2: 779 case 2:
780 label_address = StubCode::TwoArgsOptimizedCheckInlineCacheEntryPoint(); 780 label_address = StubCode::TwoArgsOptimizedCheckInlineCacheEntryPoint();
781 break; 781 break;
782 case 3: 782 case 3:
783 label_address = 783 label_address =
784 StubCode::ThreeArgsOptimizedCheckInlineCacheEntryPoint(); 784 StubCode::ThreeArgsOptimizedCheckInlineCacheEntryPoint();
785 break; 785 break;
786 default: 786 default:
787 UNIMPLEMENTED(); 787 UNIMPLEMENTED();
788 } 788 }
789 ExternalLabel target_label("InlineCache", label_address); 789 ExternalLabel target_label("InlineCache", label_address);
790 EmitOptimizedInstanceCall(&target_label, ic_data, 790 EmitOptimizedInstanceCall(&target_label, ic_data,
791 argument_count, deopt_id, token_pos, locs); 791 argument_count, deopt_id, token_pos, locs);
792 return; 792 return;
793 } 793 }
794 794
795 if (is_optimizing()) { 795 if (is_optimizing()) {
796 EmitMegamorphicInstanceCall(ic_data, argument_count, 796 EmitMegamorphicInstanceCall(ic_data, argument_count,
797 deopt_id, token_pos, locs); 797 deopt_id, token_pos, locs);
798 return; 798 return;
799 } 799 }
800 800
801 switch (ic_data.num_args_tested()) { 801 switch (ic_data.NumArgsTested()) {
802 case 1: 802 case 1:
803 label_address = StubCode::OneArgCheckInlineCacheEntryPoint(); 803 label_address = StubCode::OneArgCheckInlineCacheEntryPoint();
804 break; 804 break;
805 case 2: 805 case 2:
806 label_address = StubCode::TwoArgsCheckInlineCacheEntryPoint(); 806 label_address = StubCode::TwoArgsCheckInlineCacheEntryPoint();
807 break; 807 break;
808 case 3: 808 case 3:
809 label_address = StubCode::ThreeArgsCheckInlineCacheEntryPoint(); 809 label_address = StubCode::ThreeArgsCheckInlineCacheEntryPoint();
810 break; 810 break;
811 default: 811 default:
(...skipping 456 matching lines...) Expand 10 before | Expand all | Expand 10 after
1268 static int HighestCountFirst(const CidTarget* a, const CidTarget* b) { 1268 static int HighestCountFirst(const CidTarget* a, const CidTarget* b) {
1269 // Negative if 'a' should sort before 'b'. 1269 // Negative if 'a' should sort before 'b'.
1270 return b->count - a->count; 1270 return b->count - a->count;
1271 } 1271 }
1272 1272
1273 1273
1274 // Returns 'sorted' array in decreasing count order. 1274 // Returns 'sorted' array in decreasing count order.
1275 // The expected number of elements to sort is less than 10. 1275 // The expected number of elements to sort is less than 10.
1276 void FlowGraphCompiler::SortICDataByCount(const ICData& ic_data, 1276 void FlowGraphCompiler::SortICDataByCount(const ICData& ic_data,
1277 GrowableArray<CidTarget>* sorted) { 1277 GrowableArray<CidTarget>* sorted) {
1278 ASSERT(ic_data.num_args_tested() == 1); 1278 ASSERT(ic_data.NumArgsTested() == 1);
1279 const intptr_t len = ic_data.NumberOfChecks(); 1279 const intptr_t len = ic_data.NumberOfChecks();
1280 sorted->Clear(); 1280 sorted->Clear();
1281 1281
1282 for (int i = 0; i < len; i++) { 1282 for (int i = 0; i < len; i++) {
1283 sorted->Add(CidTarget(ic_data.GetReceiverClassIdAt(i), 1283 sorted->Add(CidTarget(ic_data.GetReceiverClassIdAt(i),
1284 &Function::ZoneHandle(ic_data.GetTargetAt(i)), 1284 &Function::ZoneHandle(ic_data.GetTargetAt(i)),
1285 ic_data.GetCountAt(i))); 1285 ic_data.GetCountAt(i)));
1286 } 1286 }
1287 sorted->Sort(HighestCountFirst); 1287 sorted->Sort(HighestCountFirst);
1288 } 1288 }
1289 1289
1290 } // namespace dart 1290 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698