| Index: src/full-codegen/arm/full-codegen-arm.cc
 | 
| diff --git a/src/full-codegen/arm/full-codegen-arm.cc b/src/full-codegen/arm/full-codegen-arm.cc
 | 
| index 3c9b58d9054b7e0d95566469f5f53011c68acb78..a8f9f604d2e8298d723bf46582560756fbab88db 100644
 | 
| --- a/src/full-codegen/arm/full-codegen-arm.cc
 | 
| +++ b/src/full-codegen/arm/full-codegen-arm.cc
 | 
| @@ -423,6 +423,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;
 | 
| +  __ b(pl, &ok);
 | 
| +  // Don't need to save result register if we are going to do a tail call.
 | 
| +  if (!is_tail_call) {
 | 
| +    __ push(r0);
 | 
| +  }
 | 
| +  __ Call(isolate()->builtins()->InterruptCheck(), RelocInfo::CODE_TARGET);
 | 
| +  if (!is_tail_call) {
 | 
| +    __ pop(r0);
 | 
| +  }
 | 
| +  EmitProfilingCounterReset();
 | 
| +  __ bind(&ok);
 | 
| +}
 | 
|  
 | 
|  void FullCodeGenerator::EmitReturnSequence() {
 | 
|    Comment cmnt(masm_, "[ Return sequence");
 | 
| @@ -436,24 +460,7 @@ void FullCodeGenerator::EmitReturnSequence() {
 | 
|        __ push(r0);
 | 
|        __ 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;
 | 
| -    __ b(pl, &ok);
 | 
| -    __ push(r0);
 | 
| -    __ Call(isolate()->builtins()->InterruptCheck(),
 | 
| -            RelocInfo::CODE_TARGET);
 | 
| -    __ pop(r0);
 | 
| -    EmitProfilingCounterReset();
 | 
| -    __ bind(&ok);
 | 
| +    EmitProfilingCounterHandlingForReturnSequence(false);
 | 
|  
 | 
|      // Make sure that the constant pool is not emitted inside of the return
 | 
|      // sequence.
 | 
| @@ -2755,6 +2762,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();
 | 
| 
 |