| Index: src/full-codegen/x64/full-codegen-x64.cc | 
| diff --git a/src/full-codegen/x64/full-codegen-x64.cc b/src/full-codegen/x64/full-codegen-x64.cc | 
| index 2ccd288048ebce1e15d48a86fb1cf4ace4e3aebf..057af184b279ae826f61b341d0441f966e7fdee2 100644 | 
| --- a/src/full-codegen/x64/full-codegen-x64.cc | 
| +++ b/src/full-codegen/x64/full-codegen-x64.cc | 
| @@ -389,6 +389,30 @@ void FullCodeGenerator::EmitBackEdgeBookkeeping(IterationStatement* stmt, | 
| PrepareForBailoutForId(stmt->OsrEntryId(), NO_REGISTERS); | 
| } | 
|  | 
| +void FullCodeGenerator::EmitProfilingCounterHandlingForReturnSequence( | 
| +    bool is_tail_call) { | 
| +  // Pretend that the exit is a backwards jump to the entry. | 
| +  int weight = 1; | 
| +  if (info_->ShouldSelfOptimize()) { | 
| +    weight = FLAG_interrupt_budget / FLAG_self_opt_count; | 
| +  } else { | 
| +    int distance = masm_->pc_offset(); | 
| +    weight = Min(kMaxBackEdgeWeight, Max(1, distance / kCodeSizeMultiplier)); | 
| +  } | 
| +  EmitProfilingCounterDecrement(weight); | 
| +  Label ok; | 
| +  __ j(positive, &ok, Label::kNear); | 
| +  // Don't need to save result register if we are going to do a tail call. | 
| +  if (!is_tail_call) { | 
| +    __ Push(rax); | 
| +  } | 
| +  __ call(isolate()->builtins()->InterruptCheck(), RelocInfo::CODE_TARGET); | 
| +  if (!is_tail_call) { | 
| +    __ Pop(rax); | 
| +  } | 
| +  EmitProfilingCounterReset(); | 
| +  __ bind(&ok); | 
| +} | 
|  | 
| void FullCodeGenerator::EmitReturnSequence() { | 
| Comment cmnt(masm_, "[ Return sequence"); | 
| @@ -400,24 +424,7 @@ void FullCodeGenerator::EmitReturnSequence() { | 
| __ Push(rax); | 
| __ CallRuntime(Runtime::kTraceExit); | 
| } | 
| -    // Pretend that the exit is a backwards jump to the entry. | 
| -    int weight = 1; | 
| -    if (info_->ShouldSelfOptimize()) { | 
| -      weight = FLAG_interrupt_budget / FLAG_self_opt_count; | 
| -    } else { | 
| -      int distance = masm_->pc_offset(); | 
| -      weight = Min(kMaxBackEdgeWeight, | 
| -                   Max(1, distance / kCodeSizeMultiplier)); | 
| -    } | 
| -    EmitProfilingCounterDecrement(weight); | 
| -    Label ok; | 
| -    __ j(positive, &ok, Label::kNear); | 
| -    __ Push(rax); | 
| -    __ call(isolate()->builtins()->InterruptCheck(), | 
| -            RelocInfo::CODE_TARGET); | 
| -    __ Pop(rax); | 
| -    EmitProfilingCounterReset(); | 
| -    __ bind(&ok); | 
| +    EmitProfilingCounterHandlingForReturnSequence(false); | 
|  | 
| SetReturnPosition(literal()); | 
| __ leave(); | 
| @@ -2626,6 +2633,14 @@ void FullCodeGenerator::EmitCall(Call* expr, ConvertReceiverMode mode) { | 
|  | 
| PrepareForBailoutForId(expr->CallId(), NO_REGISTERS); | 
| SetCallPosition(expr); | 
| +  if (expr->tail_call_mode() == TailCallMode::kAllow) { | 
| +    if (FLAG_trace) { | 
| +      __ CallRuntime(Runtime::kTraceTailCall); | 
| +    } | 
| +    // Update profiling counters before the tail call since we will | 
| +    // not return to this function. | 
| +    EmitProfilingCounterHandlingForReturnSequence(true); | 
| +  } | 
| Handle<Code> ic = | 
| CodeFactory::CallIC(isolate(), arg_count, mode, expr->tail_call_mode()) | 
| .code(); | 
|  |