Index: src/runtime-profiler.cc |
diff --git a/src/runtime-profiler.cc b/src/runtime-profiler.cc |
index 7c24ae6adcb9b3a4b4f270f4f758eed12d83eb5a..8bd59d1de26de83a3c4cabadbdc7d181de50bac1 100644 |
--- a/src/runtime-profiler.cc |
+++ b/src/runtime-profiler.cc |
@@ -102,6 +102,25 @@ void RuntimeProfiler::GlobalSetup() { |
} |
+static void GetICCounts(JSFunction* function, |
+ int* ic_with_typeinfo_count, |
+ int* ic_total_count, |
+ int* percentage) { |
+ *ic_total_count = 0; |
+ *ic_with_typeinfo_count = 0; |
+ Object* raw_info = |
+ function->shared()->code()->type_feedback_info(); |
+ if (raw_info->IsTypeFeedbackInfo()) { |
+ TypeFeedbackInfo* info = TypeFeedbackInfo::cast(raw_info); |
+ *ic_with_typeinfo_count = info->ic_with_typeinfo_count(); |
+ *ic_total_count = info->ic_total_count(); |
+ } |
+ *percentage = *ic_total_count > 0 |
+ ? 100 * *ic_with_typeinfo_count / *ic_total_count |
+ : 100; |
+} |
+ |
+ |
void RuntimeProfiler::Optimize(JSFunction* function, const char* reason) { |
ASSERT(function->IsOptimizable()); |
if (FLAG_trace_opt) { |
@@ -109,6 +128,11 @@ void RuntimeProfiler::Optimize(JSFunction* function, const char* reason) { |
function->PrintName(); |
PrintF(" 0x%" V8PRIxPTR, reinterpret_cast<intptr_t>(function->address())); |
PrintF(" for recompilation, reason: %s", reason); |
+ if (FLAG_type_info_threshold > 0) { |
+ int typeinfo, total, percentage; |
+ GetICCounts(function, &typeinfo, &total, &percentage); |
+ PrintF(", ICs with typeinfo: %d/%d (%d%%)", typeinfo, total, percentage); |
+ } |
PrintF("]\n"); |
} |
@@ -258,9 +282,20 @@ void RuntimeProfiler::OptimizeNow() { |
int ticks = function->shared()->profiler_ticks(); |
if (ticks >= kProfilerTicksBeforeOptimization) { |
- // If this particular function hasn't had any ICs patched for enough |
- // ticks, optimize it now. |
- Optimize(function, "hot and stable"); |
+ int typeinfo, total, percentage; |
+ GetICCounts(function, &typeinfo, &total, &percentage); |
+ if (percentage >= FLAG_type_info_threshold) { |
+ // If this particular function hasn't had any ICs patched for enough |
+ // ticks, optimize it now. |
+ Optimize(function, "hot and stable"); |
+ } else { |
+ if (FLAG_trace_opt_verbose) { |
+ PrintF("[not yet optimizing "); |
+ function->PrintName(); |
+ PrintF(", not enough type info: %d/%d (%d%%)]\n", |
+ typeinfo, total, percentage); |
+ } |
+ } |
} else if (!any_ic_changed_ && |
function->shared()->code()->instruction_size() < kMaxSizeEarlyOpt) { |
// If no IC was patched since the last tick and this function is very |