Profiler experiments: interrupt check at function exit
Review URL: https://chromiumcodereview.appspot.com/9432026 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@10795 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
6703dddac4
commit
75bf5e44d2
@ -177,6 +177,8 @@ DEFINE_bool(self_optimization, false,
|
||||
"primitive functions trigger their own optimization")
|
||||
DEFINE_bool(count_based_interrupts, false,
|
||||
"trigger profiler ticks based on counting instead of timing")
|
||||
DEFINE_bool(interrupt_at_exit, false,
|
||||
"insert an interrupt check at function exit")
|
||||
DEFINE_bool(weighted_back_edges, false,
|
||||
"weight back edges by jump distance for interrupt triggering")
|
||||
DEFINE_int(interrupt_budget, 10000,
|
||||
@ -187,6 +189,7 @@ DEFINE_int(type_info_threshold, 0,
|
||||
DEFINE_implication(experimental_profiler, watch_ic_patching)
|
||||
DEFINE_implication(experimental_profiler, self_optimization)
|
||||
DEFINE_implication(experimental_profiler, count_based_interrupts)
|
||||
DEFINE_implication(experimental_profiler, interrupt_at_exit)
|
||||
DEFINE_implication(experimental_profiler, weighted_back_edges)
|
||||
|
||||
DEFINE_bool(trace_opt_verbose, false, "extra verbose compilation tracing")
|
||||
|
@ -332,7 +332,7 @@ void FullCodeGenerator::EmitStackCheck(IterationStatement* stmt,
|
||||
int weight = 1;
|
||||
if (FLAG_weighted_back_edges) {
|
||||
ASSERT(back_edge_target->is_bound());
|
||||
int distance = masm_->pc_offset() - back_edge_target->pos();
|
||||
int distance = masm_->SizeOfCodeGeneratedSince(back_edge_target);
|
||||
weight = Min(127, Max(1, distance / 100));
|
||||
}
|
||||
__ sub(Operand::Cell(profiling_counter_), Immediate(Smi::FromInt(weight)));
|
||||
@ -389,6 +389,26 @@ void FullCodeGenerator::EmitReturnSequence() {
|
||||
__ push(eax);
|
||||
__ CallRuntime(Runtime::kTraceExit, 1);
|
||||
}
|
||||
if (FLAG_interrupt_at_exit) {
|
||||
// Pretend that the exit is a backwards jump to the entry.
|
||||
int weight = 1;
|
||||
if (FLAG_weighted_back_edges) {
|
||||
int distance = masm_->pc_offset();
|
||||
weight = Min(127, Max(1, distance / 100));
|
||||
}
|
||||
__ sub(Operand::Cell(profiling_counter_),
|
||||
Immediate(Smi::FromInt(weight)));
|
||||
Label ok;
|
||||
__ j(positive, &ok, Label::kNear);
|
||||
__ push(eax);
|
||||
InterruptStub stub;
|
||||
__ CallStub(&stub);
|
||||
__ pop(eax);
|
||||
// Reset the countdown.
|
||||
__ mov(Operand::Cell(profiling_counter_),
|
||||
Immediate(Smi::FromInt(FLAG_interrupt_budget)));
|
||||
__ bind(&ok);
|
||||
}
|
||||
#ifdef DEBUG
|
||||
// Add a label for checking the size of the code used for returning.
|
||||
Label check_exit_codesize;
|
||||
|
Loading…
Reference in New Issue
Block a user