| Index: src/ia32/lithium-ia32.cc
|
| diff --git a/src/ia32/lithium-ia32.cc b/src/ia32/lithium-ia32.cc
|
| index cea47831fdbbceccf1205ec5dc1eb13c81f43dd1..896b499ad54ebd8d150e9661e1a8a0b06914e7bc 100644
|
| --- a/src/ia32/lithium-ia32.cc
|
| +++ b/src/ia32/lithium-ia32.cc
|
| @@ -679,15 +679,6 @@ LInstruction* LChunkBuilder::MarkAsCall(LInstruction* instr,
|
| instr->MarkAsCall();
|
| instr = AssignPointerMap(instr);
|
|
|
| - if (hinstr->HasObservableSideEffects()) {
|
| - ASSERT(hinstr->next()->IsSimulate());
|
| - HSimulate* sim = HSimulate::cast(hinstr->next());
|
| - ASSERT(instruction_pending_deoptimization_environment_ == NULL);
|
| - ASSERT(pending_deoptimization_ast_id_.IsNone());
|
| - instruction_pending_deoptimization_environment_ = instr;
|
| - pending_deoptimization_ast_id_ = sim->ast_id();
|
| - }
|
| -
|
| // If instruction does not have side-effects lazy deoptimization
|
| // after the call will try to deoptimize to the point before the call.
|
| // Thus we still need to attach environment to this call even if
|
| @@ -980,6 +971,26 @@ void LChunkBuilder::VisitInstruction(HInstruction* current) {
|
| chunk_->AddInstruction(clobber, current_block_);
|
| }
|
| chunk_->AddInstruction(instr, current_block_);
|
| +
|
| + if (instr->IsCall()) {
|
| + HValue* hydrogen_value_for_lazy_bailout = current;
|
| + LInstruction* instruction_needing_environment = NULL;
|
| + if (current->HasObservableSideEffects()) {
|
| + HSimulate* sim = HSimulate::cast(current->next());
|
| + instruction_needing_environment = instr;
|
| + sim->ReplayEnvironment(current_block_->last_environment());
|
| + hydrogen_value_for_lazy_bailout = sim;
|
| + }
|
| + LInstruction* bailout = AssignEnvironment(new(zone()) LLazyBailout());
|
| + bailout->set_hydrogen_value(hydrogen_value_for_lazy_bailout);
|
| + chunk_->AddInstruction(bailout, current_block_);
|
| + if (instruction_needing_environment != NULL) {
|
| + // Store the lazy deopt environment with the instruction if needed.
|
| + // Right now it is only used for LInstanceOfKnownGlobal.
|
| + instruction_needing_environment->
|
| + SetDeferredLazyDeoptimizationEnvironment(bailout->environment());
|
| + }
|
| + }
|
| }
|
| current_instruction_ = old_current;
|
| }
|
| @@ -2585,22 +2596,6 @@ LInstruction* LChunkBuilder::DoIsConstructCallAndBranch(
|
|
|
| LInstruction* LChunkBuilder::DoSimulate(HSimulate* instr) {
|
| instr->ReplayEnvironment(current_block_->last_environment());
|
| -
|
| - // If there is an instruction pending deoptimization environment create a
|
| - // lazy bailout instruction to capture the environment.
|
| - if (!pending_deoptimization_ast_id_.IsNone()) {
|
| - ASSERT(pending_deoptimization_ast_id_ == instr->ast_id());
|
| - LLazyBailout* lazy_bailout = new(zone()) LLazyBailout;
|
| - LInstruction* result = AssignEnvironment(lazy_bailout);
|
| - // Store the lazy deopt environment with the instruction if needed. Right
|
| - // now it is only used for LInstanceOfKnownGlobal.
|
| - instruction_pending_deoptimization_environment_->
|
| - SetDeferredLazyDeoptimizationEnvironment(result->environment());
|
| - instruction_pending_deoptimization_environment_ = NULL;
|
| - pending_deoptimization_ast_id_ = BailoutId::None();
|
| - return result;
|
| - }
|
| -
|
| return NULL;
|
| }
|
|
|
|
|