summaryrefslogtreecommitdiff
path: root/deps/v8/src/runtime-profiler.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/runtime-profiler.cc')
-rw-r--r--deps/v8/src/runtime-profiler.cc70
1 files changed, 31 insertions, 39 deletions
diff --git a/deps/v8/src/runtime-profiler.cc b/deps/v8/src/runtime-profiler.cc
index 35456713a9..3d7da8ac25 100644
--- a/deps/v8/src/runtime-profiler.cc
+++ b/deps/v8/src/runtime-profiler.cc
@@ -7,7 +7,6 @@
#include "src/assembler.h"
#include "src/base/platform/platform.h"
#include "src/bootstrapper.h"
-#include "src/code-stubs.h"
#include "src/compilation-cache.h"
#include "src/compiler.h"
#include "src/execution.h"
@@ -70,11 +69,10 @@ RuntimeProfiler::RuntimeProfiler(Isolate* isolate)
any_ic_changed_(false) {
}
-static void GetICCounts(JSFunction* function, int* ic_with_type_info_count,
+static void GetICCounts(JSFunction function, int* ic_with_type_info_count,
int* ic_generic_count, int* ic_total_count,
int* type_info_percentage, int* generic_percentage) {
- // Harvest vector-ics.
- FeedbackVector* vector = function->feedback_vector();
+ FeedbackVector vector = function->feedback_vector();
vector->ComputeCounts(ic_with_type_info_count, ic_generic_count,
ic_total_count);
@@ -87,7 +85,7 @@ static void GetICCounts(JSFunction* function, int* ic_with_type_info_count,
}
}
-static void TraceRecompile(JSFunction* function, const char* reason,
+static void TraceRecompile(JSFunction function, const char* reason,
const char* type) {
if (FLAG_trace_opt) {
PrintF("[marking ");
@@ -105,18 +103,17 @@ static void TraceRecompile(JSFunction* function, const char* reason,
}
}
-void RuntimeProfiler::Optimize(JSFunction* function,
- OptimizationReason reason) {
+void RuntimeProfiler::Optimize(JSFunction function, OptimizationReason reason) {
DCHECK_NE(reason, OptimizationReason::kDoNotOptimize);
TraceRecompile(function, OptimizationReasonToString(reason), "optimized");
function->MarkForOptimization(ConcurrencyMode::kConcurrent);
}
-void RuntimeProfiler::AttemptOnStackReplacement(JavaScriptFrame* frame,
+void RuntimeProfiler::AttemptOnStackReplacement(InterpretedFrame* frame,
int loop_nesting_levels) {
- JSFunction* function = frame->function();
- SharedFunctionInfo* shared = function->shared();
- if (!FLAG_use_osr || !function->shared()->IsUserJavaScript()) {
+ JSFunction function = frame->function();
+ SharedFunctionInfo shared = function->shared();
+ if (!FLAG_use_osr || !shared->IsUserJavaScript()) {
return;
}
@@ -133,14 +130,13 @@ void RuntimeProfiler::AttemptOnStackReplacement(JavaScriptFrame* frame,
}
DCHECK_EQ(StackFrame::INTERPRETED, frame->type());
- DCHECK(shared->HasBytecodeArray());
- int level = shared->GetBytecodeArray()->osr_loop_nesting_level();
- shared->GetBytecodeArray()->set_osr_loop_nesting_level(
+ int level = frame->GetBytecodeArray()->osr_loop_nesting_level();
+ frame->GetBytecodeArray()->set_osr_loop_nesting_level(
Min(level + loop_nesting_levels, AbstractCode::kMaxLoopNestingMarker));
}
-void RuntimeProfiler::MaybeOptimize(JSFunction* function,
- JavaScriptFrame* frame) {
+void RuntimeProfiler::MaybeOptimize(JSFunction function,
+ InterpretedFrame* frame) {
if (function->IsInOptimizationQueue()) {
if (FLAG_trace_opt_verbose) {
PrintF("[function ");
@@ -159,32 +155,28 @@ void RuntimeProfiler::MaybeOptimize(JSFunction* function,
if (function->shared()->optimization_disabled()) return;
- if (frame->is_optimized()) return;
-
- OptimizationReason reason = ShouldOptimize(function, frame);
+ OptimizationReason reason =
+ ShouldOptimize(function, function->shared()->GetBytecodeArray());
if (reason != OptimizationReason::kDoNotOptimize) {
Optimize(function, reason);
}
}
-bool RuntimeProfiler::MaybeOSR(JSFunction* function, JavaScriptFrame* frame) {
- SharedFunctionInfo* shared = function->shared();
+bool RuntimeProfiler::MaybeOSR(JSFunction function, InterpretedFrame* frame) {
int ticks = function->feedback_vector()->profiler_ticks();
-
// TODO(rmcilroy): Also ensure we only OSR top-level code if it is smaller
// than kMaxToplevelSourceSize.
- if (!frame->is_optimized() &&
- (function->IsMarkedForOptimization() ||
- function->IsMarkedForConcurrentOptimization() ||
- function->HasOptimizedCode())) {
+ if (function->IsMarkedForOptimization() ||
+ function->IsMarkedForConcurrentOptimization() ||
+ function->HasOptimizedCode()) {
// Attempt OSR if we are still running interpreted code even though the
// the function has long been marked or even already been optimized.
int64_t allowance =
kOSRBytecodeSizeAllowanceBase +
static_cast<int64_t>(ticks) * kOSRBytecodeSizeAllowancePerTick;
- if (shared->GetBytecodeArray()->length() <= allowance) {
+ if (function->shared()->GetBytecodeArray()->length() <= allowance) {
AttemptOnStackReplacement(frame);
}
return true;
@@ -192,22 +184,20 @@ bool RuntimeProfiler::MaybeOSR(JSFunction* function, JavaScriptFrame* frame) {
return false;
}
-OptimizationReason RuntimeProfiler::ShouldOptimize(JSFunction* function,
- JavaScriptFrame* frame) {
- SharedFunctionInfo* shared = function->shared();
+OptimizationReason RuntimeProfiler::ShouldOptimize(JSFunction function,
+ BytecodeArray bytecode) {
int ticks = function->feedback_vector()->profiler_ticks();
-
- if (shared->GetBytecodeArray()->length() > kMaxBytecodeSizeForOpt) {
+ if (bytecode->length() > kMaxBytecodeSizeForOpt) {
return OptimizationReason::kDoNotOptimize;
}
int ticks_for_optimization =
kProfilerTicksBeforeOptimization +
- (shared->GetBytecodeArray()->length() / kBytecodeSizeAllowancePerTick);
+ (bytecode->length() / kBytecodeSizeAllowancePerTick);
if (ticks >= ticks_for_optimization) {
return OptimizationReason::kHotAndStable;
- } else if (!any_ic_changed_ && shared->GetBytecodeArray()->length() <
- kMaxBytecodeSizeForEarlyOpt) {
+ } else if (!any_ic_changed_ &&
+ bytecode->length() < kMaxBytecodeSizeForEarlyOpt) {
// If no IC was patched since the last tick and this function is very
// small, optimistically optimize it now.
return OptimizationReason::kSmallFunction;
@@ -220,7 +210,7 @@ OptimizationReason RuntimeProfiler::ShouldOptimize(JSFunction* function,
PrintF("ICs changed]\n");
} else {
PrintF(" too large for small function optimization: %d/%d]\n",
- shared->GetBytecodeArray()->length(), kMaxBytecodeSizeForEarlyOpt);
+ bytecode->length(), kMaxBytecodeSizeForEarlyOpt);
}
}
return OptimizationReason::kDoNotOptimize;
@@ -242,13 +232,15 @@ void RuntimeProfiler::MarkCandidatesForOptimization() {
frame_count++ < frame_count_limit && !it.done();
it.Advance()) {
JavaScriptFrame* frame = it.frame();
- if (frame->is_optimized()) continue;
+ if (!frame->is_interpreted()) continue;
- JSFunction* function = frame->function();
+ JSFunction function = frame->function();
DCHECK(function->shared()->is_compiled());
if (!function->shared()->IsInterpreted()) continue;
- MaybeOptimize(function, frame);
+ if (!function->has_feedback_vector()) continue;
+
+ MaybeOptimize(function, InterpretedFrame::cast(frame));
// TODO(leszeks): Move this increment to before the maybe optimize checks,
// and update the tests to assume the increment has already happened.