| Index: src/ia32/lithium-codegen-ia32.cc
 | 
| diff --git a/src/ia32/lithium-codegen-ia32.cc b/src/ia32/lithium-codegen-ia32.cc
 | 
| index f0cd7b0008aedcc985eaf1a8bb224a3374f8cc9b..31362f9d49522dce21e14366a54a3903671409e5 100644
 | 
| --- a/src/ia32/lithium-codegen-ia32.cc
 | 
| +++ b/src/ia32/lithium-codegen-ia32.cc
 | 
| @@ -322,20 +322,23 @@ void LCodeGen::GenerateOsrPrologue() {
 | 
|      // Move state of dynamic frame alignment into edx.
 | 
|    __ Move(edx, Immediate(kNoAlignmentPadding));
 | 
|  
 | 
| +  Label remove_vector_finished;
 | 
| +  int unoptimized_slots = graph()->osr()->UnoptimizedFrameSlots();
 | 
|    if (support_aligned_spilled_doubles_ && dynamic_frame_alignment_) {
 | 
|      Label do_not_pad, align_loop;
 | 
|      // Align ebp + 4 to a multiple of 2 * kPointerSize.
 | 
|      __ test(ebp, Immediate(kPointerSize));
 | 
|      __ j(zero, &do_not_pad, Label::kNear);
 | 
| -    __ push(Immediate(0));
 | 
| +
 | 
|      __ mov(ebx, esp);
 | 
| +    __ add(Operand(ebx), Immediate(kPointerSize * unoptimized_slots));
 | 
|      __ mov(edx, Immediate(kAlignmentPaddingPushed));
 | 
|  
 | 
| -    // Move all parts of the frame over one word. The frame consists of:
 | 
| -    // unoptimized frame slots, alignment state, context, frame pointer, return
 | 
| -    // address, receiver, and the arguments.
 | 
| -    __ mov(ecx, Immediate(scope()->num_parameters() +
 | 
| -           5 + graph()->osr()->UnoptimizedFrameSlots()));
 | 
| +    // Move the receiver, parameters and fixed part of the frame above the type
 | 
| +    // feedback vector over one word, stomping on the vector.
 | 
| +    __ mov(ecx,
 | 
| +           Immediate(1 + scope()->num_parameters() +
 | 
| +                     StandardFrameConstants::kFixedFrameSize / kPointerSize));
 | 
|  
 | 
|      __ bind(&align_loop);
 | 
|      __ mov(eax, Operand(ebx, 1 * kPointerSize));
 | 
| @@ -345,9 +348,16 @@ void LCodeGen::GenerateOsrPrologue() {
 | 
|      __ j(not_zero, &align_loop, Label::kNear);
 | 
|      __ mov(Operand(ebx, 0), Immediate(kAlignmentZapValue));
 | 
|      __ sub(Operand(ebp), Immediate(kPointerSize));
 | 
| +    __ jmp(&remove_vector_finished);
 | 
|      __ bind(&do_not_pad);
 | 
| +    // We have to move locals over one.
 | 
| +    __ AdaptUnoptimizedFrameForOsrEntry(unoptimized_slots, ebx, eax);
 | 
| +  } else {
 | 
| +    // Need to copy locals over by one.
 | 
| +    __ AdaptUnoptimizedFrameForOsrEntry(unoptimized_slots, ebx, eax);
 | 
|    }
 | 
|  
 | 
| +  __ bind(&remove_vector_finished);
 | 
|    // Save the first local, which is overwritten by the alignment state.
 | 
|    Operand alignment_loc = MemOperand(ebp, -3 * kPointerSize);
 | 
|    __ push(alignment_loc);
 | 
| 
 |