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

Side by Side Diff: runtime/vm/deopt_instructions.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/deopt_instructions.h" 5 #include "vm/deopt_instructions.h"
6 6
7 #include "vm/assembler.h" 7 #include "vm/assembler.h"
8 #include "vm/code_patcher.h" 8 #include "vm/code_patcher.h"
9 #include "vm/intermediate_language.h" 9 #include "vm/intermediate_language.h"
10 #include "vm/locations.h" 10 #include "vm/locations.h"
(...skipping 26 matching lines...) Expand all
37 fpu_registers_(fpu_registers), 37 fpu_registers_(fpu_registers),
38 num_args_(0), 38 num_args_(0),
39 deopt_reason_(kDeoptUnknown), 39 deopt_reason_(kDeoptUnknown),
40 isolate_(Isolate::Current()), 40 isolate_(Isolate::Current()),
41 deferred_boxes_(NULL), 41 deferred_boxes_(NULL),
42 deferred_object_refs_(NULL), 42 deferred_object_refs_(NULL),
43 deferred_objects_count_(0), 43 deferred_objects_count_(0),
44 deferred_objects_(NULL) { 44 deferred_objects_(NULL) {
45 object_table_ = code.object_table(); 45 object_table_ = code.object_table();
46 46
47 intptr_t deopt_reason = kDeoptUnknown; 47 DeoptReasonId deopt_reason = kDeoptUnknown;
48 const DeoptInfo& deopt_info = 48 const DeoptInfo& deopt_info =
49 DeoptInfo::Handle(code.GetDeoptInfoAtPc(frame->pc(), &deopt_reason)); 49 DeoptInfo::Handle(code.GetDeoptInfoAtPc(frame->pc(), &deopt_reason));
50 ASSERT(!deopt_info.IsNull()); 50 ASSERT(!deopt_info.IsNull());
51 deopt_info_ = deopt_info.raw(); 51 deopt_info_ = deopt_info.raw();
52 deopt_reason_ = static_cast<DeoptReasonId>(deopt_reason); 52 deopt_reason_ = deopt_reason;
53 53
54 const Function& function = Function::Handle(code.function()); 54 const Function& function = Function::Handle(code.function());
55 55
56 // Do not include incoming arguments if there are optional arguments 56 // Do not include incoming arguments if there are optional arguments
57 // (they are copied into local space at method entry). 57 // (they are copied into local space at method entry).
58 num_args_ = 58 num_args_ =
59 function.HasOptionalParameters() ? 0 : function.num_fixed_parameters(); 59 function.HasOptionalParameters() ? 0 : function.num_fixed_parameters();
60 60
61 // The fixed size section of the (fake) Dart frame called via a stub by the 61 // The fixed size section of the (fake) Dart frame called via a stub by the
62 // optimized function contains FP, PP (ARM and MIPS only), PC-marker and 62 // optimized function contains FP, PP (ARM and MIPS only), PC-marker and
(...skipping 26 matching lines...) Expand all
89 dest_frame_ = new intptr_t[dest_frame_size_]; 89 dest_frame_ = new intptr_t[dest_frame_size_];
90 ASSERT(source_frame_ != NULL); 90 ASSERT(source_frame_ != NULL);
91 for (intptr_t i = 0; i < dest_frame_size_; i++) { 91 for (intptr_t i = 0; i < dest_frame_size_; i++) {
92 dest_frame_[i] = 0; 92 dest_frame_[i] = 0;
93 } 93 }
94 dest_frame_is_allocated_ = true; 94 dest_frame_is_allocated_ = true;
95 } 95 }
96 96
97 if (FLAG_trace_deoptimization || FLAG_trace_deoptimization_verbose) { 97 if (FLAG_trace_deoptimization || FLAG_trace_deoptimization_verbose) {
98 OS::PrintErr( 98 OS::PrintErr(
99 "Deoptimizing (reason %" Pd " '%s') at pc %#" Px " '%s' (count %d)\n", 99 "Deoptimizing (reason %d '%s') at pc %#" Px " '%s' (count %d)\n",
100 deopt_reason, 100 deopt_reason,
101 DeoptReasonToText(deopt_reason_), 101 DeoptReasonToText(deopt_reason_),
102 frame->pc(), 102 frame->pc(),
103 function.ToFullyQualifiedCString(), 103 function.ToFullyQualifiedCString(),
104 function.deoptimization_counter()); 104 function.deoptimization_counter());
105 } 105 }
106 } 106 }
107 107
108 108
109 DeoptContext::~DeoptContext() { 109 DeoptContext::~DeoptContext() {
(...skipping 498 matching lines...) Expand 10 before | Expand all | Expand 10 after
608 ASSERT(continue_at_pc != 0); 608 ASSERT(continue_at_pc != 0);
609 *dest_addr = continue_at_pc; 609 *dest_addr = continue_at_pc;
610 610
611 uword pc = code.GetPcForDeoptId(deopt_id_, PcDescriptors::kIcCall); 611 uword pc = code.GetPcForDeoptId(deopt_id_, PcDescriptors::kIcCall);
612 if (pc != 0) { 612 if (pc != 0) {
613 // If the deoptimization happened at an IC call, update the IC data 613 // If the deoptimization happened at an IC call, update the IC data
614 // to avoid repeated deoptimization at the same site next time around. 614 // to avoid repeated deoptimization at the same site next time around.
615 ICData& ic_data = ICData::Handle(); 615 ICData& ic_data = ICData::Handle();
616 CodePatcher::GetInstanceCallAt(pc, code, &ic_data); 616 CodePatcher::GetInstanceCallAt(pc, code, &ic_data);
617 if (!ic_data.IsNull()) { 617 if (!ic_data.IsNull()) {
618 ic_data.set_deopt_reason(deopt_context->deopt_reason()); 618 ic_data.AddDeoptReason(deopt_context->deopt_reason());
619 } 619 }
620 } else if (deopt_context->deopt_reason() == kDeoptHoistedCheckClass) { 620 } else if (deopt_context->deopt_reason() == kDeoptHoistedCheckClass) {
621 // Prevent excessive deoptimization. 621 // Prevent excessive deoptimization.
622 Function::Handle(code.function()).set_allows_hoisting_check_class(false); 622 Function::Handle(code.function()).set_allows_hoisting_check_class(false);
623 } 623 }
624 } 624 }
625 625
626 intptr_t object_table_index() const { return object_table_index_; } 626 intptr_t object_table_index() const { return object_table_index_; }
627 intptr_t deopt_id() const { return deopt_id_; } 627 intptr_t deopt_id() const { return deopt_id_; }
628 628
(...skipping 848 matching lines...) Expand 10 before | Expand all | Expand 10 after
1477 Smi* offset, 1477 Smi* offset,
1478 DeoptInfo* info, 1478 DeoptInfo* info,
1479 Smi* reason) { 1479 Smi* reason) {
1480 intptr_t i = index * kEntrySize; 1480 intptr_t i = index * kEntrySize;
1481 *offset ^= table.At(i); 1481 *offset ^= table.At(i);
1482 *info ^= table.At(i + 1); 1482 *info ^= table.At(i + 1);
1483 *reason ^= table.At(i + 2); 1483 *reason ^= table.At(i + 2);
1484 } 1484 }
1485 1485
1486 } // namespace dart 1486 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698