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

Unified Diff: runtime/vm/code_generator.cc

Issue 1557533002: Eliminate excessive increment of deoptimization counters (e.g., with deep recursion of deoptimized … (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: r Created 5 years 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | runtime/vm/compiler.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/code_generator.cc
diff --git a/runtime/vm/code_generator.cc b/runtime/vm/code_generator.cc
index 58dcc7e9019ee3021c0286fc9d5428209b95961d..723faeb7683efdf8b0aff2fa05ae45e3d72afcaa 100644
--- a/runtime/vm/code_generator.cc
+++ b/runtime/vm/code_generator.cc
@@ -57,7 +57,7 @@ DEFINE_FLAG(bool, trace_patching, false, "Trace patching of code.");
DEFINE_FLAG(bool, trace_runtime_calls, false, "Trace runtime calls");
DEFINE_FLAG(bool, trace_type_checks, false, "Trace runtime type checks.");
-DECLARE_FLAG(int, deoptimization_counter_threshold);
+DECLARE_FLAG(int, max_deoptimization_counter_threshold);
DECLARE_FLAG(bool, enable_inlining_annotations);
DECLARE_FLAG(bool, trace_compiler);
DECLARE_FLAG(bool, trace_optimizing_compiler);
@@ -677,7 +677,7 @@ DEFINE_RUNTIME_ENTRY(PatchStaticCall, 0) {
target_code);
caller_code.SetStaticCallTargetCodeAt(caller_frame->pc(), target_code);
if (FLAG_trace_patching) {
- OS::PrintErr("PatchStaticCall: patching caller pc %#" Px ""
+ THR_Print("PatchStaticCall: patching caller pc %#" Px ""
" to '%s' new entry point %#" Px " (%s)\n",
caller_frame->pc(),
target_function.ToFullyQualifiedCString(),
@@ -1255,7 +1255,7 @@ static bool CanOptimizeFunction(const Function& function, Thread* thread) {
return false;
}
if (function.deoptimization_counter() >=
- FLAG_deoptimization_counter_threshold) {
+ FLAG_max_deoptimization_counter_threshold) {
if (FLAG_trace_failed_optimization_attempts ||
FLAG_stop_on_excessive_deoptimization) {
OS::PrintErr("Too Many Deoptimizations: %s\n",
@@ -1707,6 +1707,9 @@ static void CopySavedRegisters(uword saved_registers_address,
// Copies saved registers and caller's frame into temporary buffers.
// Returns the stack size of unoptimized frame.
+// The calling code must be optimized, but its function may not have
+// have optimized code if the code is OSR code, or if the code was invalidated
+// through class loading/finalization or field guard.
DEFINE_LEAF_RUNTIME_ENTRY(intptr_t, DeoptimizeCopyFrame,
2,
uword saved_registers_address,
@@ -1728,6 +1731,16 @@ DEFINE_LEAF_RUNTIME_ENTRY(intptr_t, DeoptimizeCopyFrame,
ASSERT(caller_frame != NULL);
const Code& optimized_code = Code::Handle(caller_frame->LookupDartCode());
ASSERT(optimized_code.is_optimized());
+ const Function& top_function =
+ Function::Handle(thread->zone(), optimized_code.function());
+ const bool deoptimizing_code = top_function.HasOptimizedCode();
+ if (FLAG_trace_deoptimization) {
+ const Function& function = Function::Handle(optimized_code.function());
+ THR_Print("== Deoptimizing code for '%s', %s, %s\n",
+ function.ToFullyQualifiedCString(),
+ deoptimizing_code ? "code & frame" : "frame",
+ is_lazy_deopt ? "lazy-deopt" : "");
+ }
// Copy the saved registers from the stack.
fpu_register_t* fpu_registers;
@@ -1741,7 +1754,8 @@ DEFINE_LEAF_RUNTIME_ENTRY(intptr_t, DeoptimizeCopyFrame,
DeoptContext::kDestIsOriginalFrame,
fpu_registers,
cpu_registers,
- is_lazy_deopt != 0);
+ is_lazy_deopt != 0,
+ deoptimizing_code);
isolate->set_deopt_context(deopt_context);
// Stack size (FP - SP) in bytes.
« no previous file with comments | « no previous file | runtime/vm/compiler.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698