diff --git a/src/arm/lithium-arm.cc b/src/arm/lithium-arm.cc index 912072bc9a..18c7ccedcf 100644 --- a/src/arm/lithium-arm.cc +++ b/src/arm/lithium-arm.cc @@ -653,22 +653,6 @@ LInstruction* LChunkBuilder::AssignEnvironment(LInstruction* instr) { } -LInstruction* LChunkBuilder::SetInstructionPendingDeoptimizationEnvironment( - LInstruction* instr, int ast_id) { - ASSERT(instructions_pending_deoptimization_environment_ == NULL); - ASSERT(pending_deoptimization_ast_id_ == AstNode::kNoNumber); - instructions_pending_deoptimization_environment_ = instr; - pending_deoptimization_ast_id_ = ast_id; - return instr; -} - - -void LChunkBuilder::ClearInstructionPendingDeoptimizationEnvironment() { - instructions_pending_deoptimization_environment_ = NULL; - pending_deoptimization_ast_id_ = AstNode::kNoNumber; -} - - LInstruction* LChunkBuilder::MarkAsCall(LInstruction* instr, HInstruction* hinstr, CanDeoptimize can_deoptimize) { @@ -678,8 +662,8 @@ LInstruction* LChunkBuilder::MarkAsCall(LInstruction* instr, if (hinstr->HasSideEffects()) { ASSERT(hinstr->next()->IsSimulate()); HSimulate* sim = HSimulate::cast(hinstr->next()); - instr = SetInstructionPendingDeoptimizationEnvironment( - instr, sim->ast_id()); + ASSERT(pending_deoptimization_ast_id_ == AstNode::kNoNumber); + pending_deoptimization_ast_id_ = sim->ast_id(); } // If instruction does not have side-effects lazy deoptimization @@ -1826,12 +1810,11 @@ LInstruction* LChunkBuilder::DoSimulate(HSimulate* instr) { // If there is an instruction pending deoptimization environment create a // lazy bailout instruction to capture the environment. - if (pending_deoptimization_ast_id_ == instr->ast_id()) { - LInstruction* result = new LLazyBailout; - result = AssignEnvironment(result); - instructions_pending_deoptimization_environment_-> - set_deoptimization_environment(result->environment()); - ClearInstructionPendingDeoptimizationEnvironment(); + if (pending_deoptimization_ast_id_ != AstNode::kNoNumber) { + ASSERT(pending_deoptimization_ast_id_ == instr->ast_id()); + LInstruction* lazy_bailout = new LLazyBailout; + LInstruction* result = AssignEnvironment(lazy_bailout); + pending_deoptimization_ast_id_ = AstNode::kNoNumber; return result; } diff --git a/src/arm/lithium-arm.h b/src/arm/lithium-arm.h index eb90b8c646..dae3ead119 100644 --- a/src/arm/lithium-arm.h +++ b/src/arm/lithium-arm.h @@ -320,21 +320,10 @@ class LInstruction: public ZoneObject { void set_hydrogen_value(HValue* value) { hydrogen_value_ = value; } HValue* hydrogen_value() const { return hydrogen_value_; } - void set_deoptimization_environment(LEnvironment* env) { - deoptimization_environment_.set(env); - } - LEnvironment* deoptimization_environment() const { - return deoptimization_environment_.get(); - } - bool HasDeoptimizationEnvironment() const { - return deoptimization_environment_.is_set(); - } - private: SetOncePointer environment_; SetOncePointer pointer_map_; HValue* hydrogen_value_; - SetOncePointer deoptimization_environment_; }; @@ -1963,10 +1952,6 @@ class LChunkBuilder BASE_EMBEDDED { CanDeoptimize can_deoptimize = CANNOT_DEOPTIMIZE_EAGERLY); LInstruction* MarkAsSaveDoubles(LInstruction* instr); - LInstruction* SetInstructionPendingDeoptimizationEnvironment( - LInstruction* instr, int ast_id); - void ClearInstructionPendingDeoptimizationEnvironment(); - LEnvironment* CreateEnvironment(HEnvironment* hydrogen_env); void VisitInstruction(HInstruction* current); diff --git a/src/arm/lithium-codegen-arm.cc b/src/arm/lithium-codegen-arm.cc index f34724ce0a..ea88cb3f84 100644 --- a/src/arm/lithium-codegen-arm.cc +++ b/src/arm/lithium-codegen-arm.cc @@ -601,16 +601,20 @@ void LCodeGen::RegisterLazyDeoptimization(LInstruction* instr) { // Create the environment to bailout to. If the call has side effects // execution has to continue after the call otherwise execution can continue // from a previous bailout point repeating the call. - LEnvironment* deoptimization_environment; - if (instr->HasDeoptimizationEnvironment()) { - deoptimization_environment = instr->deoptimization_environment(); + LEnvironment* lazy_deoptimization_environment; + ASSERT(!instr->IsControl()); + ASSERT(instructions_->at(current_instruction_ + 1)->IsGap()); + LInstruction* next_instr = instructions_->at(current_instruction_ + 2); + if (next_instr->IsLazyBailout()) { + ASSERT(next_instr->HasEnvironment()); + lazy_deoptimization_environment = next_instr->environment(); } else { - deoptimization_environment = instr->environment(); + lazy_deoptimization_environment = instr->environment(); } - RegisterEnvironmentForDeoptimization(deoptimization_environment); + RegisterEnvironmentForDeoptimization(lazy_deoptimization_environment); RecordSafepoint(instr->pointer_map(), - deoptimization_environment->deoptimization_index()); + lazy_deoptimization_environment->deoptimization_index()); } diff --git a/src/ia32/lithium-ia32.cc b/src/ia32/lithium-ia32.cc index bc60bec53a..6276f33543 100644 --- a/src/ia32/lithium-ia32.cc +++ b/src/ia32/lithium-ia32.cc @@ -1858,7 +1858,8 @@ LInstruction* LChunkBuilder::DoSimulate(HSimulate* instr) { // If there is an instruction pending deoptimization environment create a // lazy bailout instruction to capture the environment. - if (pending_deoptimization_ast_id_ == instr->ast_id()) { + if (pending_deoptimization_ast_id_ != AstNode::kNoNumber) { + ASSERT(pending_deoptimization_ast_id_ == instr->ast_id()); LLazyBailout* lazy_bailout = new LLazyBailout; LInstruction* result = AssignEnvironment(lazy_bailout); pending_deoptimization_ast_id_ = AstNode::kNoNumber; diff --git a/src/x64/lithium-codegen-x64.cc b/src/x64/lithium-codegen-x64.cc index f0e55f970d..eaa70b9f0b 100644 --- a/src/x64/lithium-codegen-x64.cc +++ b/src/x64/lithium-codegen-x64.cc @@ -374,16 +374,20 @@ void LCodeGen::RegisterLazyDeoptimization(LInstruction* instr) { // Create the environment to bailout to. If the call has side effects // execution has to continue after the call otherwise execution can continue // from a previous bailout point repeating the call. - LEnvironment* deoptimization_environment; - if (instr->HasDeoptimizationEnvironment()) { - deoptimization_environment = instr->deoptimization_environment(); + LEnvironment* lazy_deoptimization_environment; + ASSERT(!instr->IsControl()); + ASSERT(instructions_->at(current_instruction_ + 1)->IsGap()); + LInstruction* next_instr = instructions_->at(current_instruction_ + 2); + if (next_instr->IsLazyBailout()) { + ASSERT(next_instr->HasEnvironment()); + lazy_deoptimization_environment = next_instr->environment(); } else { - deoptimization_environment = instr->environment(); + lazy_deoptimization_environment = instr->environment(); } - RegisterEnvironmentForDeoptimization(deoptimization_environment); + RegisterEnvironmentForDeoptimization(lazy_deoptimization_environment); RecordSafepoint(instr->pointer_map(), - deoptimization_environment->deoptimization_index()); + lazy_deoptimization_environment->deoptimization_index()); } diff --git a/src/x64/lithium-x64.cc b/src/x64/lithium-x64.cc index eff6d51e83..6b536eec52 100644 --- a/src/x64/lithium-x64.cc +++ b/src/x64/lithium-x64.cc @@ -651,22 +651,6 @@ LInstruction* LChunkBuilder::AssignEnvironment(LInstruction* instr) { } -LInstruction* LChunkBuilder::SetInstructionPendingDeoptimizationEnvironment( - LInstruction* instr, int ast_id) { - ASSERT(instructions_pending_deoptimization_environment_ == NULL); - ASSERT(pending_deoptimization_ast_id_ == AstNode::kNoNumber); - instructions_pending_deoptimization_environment_ = instr; - pending_deoptimization_ast_id_ = ast_id; - return instr; -} - - -void LChunkBuilder::ClearInstructionPendingDeoptimizationEnvironment() { - instructions_pending_deoptimization_environment_ = NULL; - pending_deoptimization_ast_id_ = AstNode::kNoNumber; -} - - LInstruction* LChunkBuilder::MarkAsCall(LInstruction* instr, HInstruction* hinstr, CanDeoptimize can_deoptimize) { @@ -676,8 +660,8 @@ LInstruction* LChunkBuilder::MarkAsCall(LInstruction* instr, if (hinstr->HasSideEffects()) { ASSERT(hinstr->next()->IsSimulate()); HSimulate* sim = HSimulate::cast(hinstr->next()); - instr = SetInstructionPendingDeoptimizationEnvironment( - instr, sim->ast_id()); + ASSERT(pending_deoptimization_ast_id_ == AstNode::kNoNumber); + pending_deoptimization_ast_id_ = sim->ast_id(); } // If instruction does not have side-effects lazy deoptimization @@ -1569,12 +1553,11 @@ LInstruction* LChunkBuilder::DoSimulate(HSimulate* instr) { // If there is an instruction pending deoptimization environment create a // lazy bailout instruction to capture the environment. - if (pending_deoptimization_ast_id_ == instr->ast_id()) { + if (pending_deoptimization_ast_id_ != AstNode::kNoNumber) { + ASSERT(pending_deoptimization_ast_id_ == instr->ast_id()); LLazyBailout* lazy_bailout = new LLazyBailout; LInstruction* result = AssignEnvironment(lazy_bailout); - instructions_pending_deoptimization_environment_-> - set_deoptimization_environment(result->environment()); - ClearInstructionPendingDeoptimizationEnvironment(); + pending_deoptimization_ast_id_ = AstNode::kNoNumber; return result; } diff --git a/src/x64/lithium-x64.h b/src/x64/lithium-x64.h index 9b7d56827e..237038ab07 100644 --- a/src/x64/lithium-x64.h +++ b/src/x64/lithium-x64.h @@ -317,21 +317,10 @@ class LInstruction: public ZoneObject { void set_hydrogen_value(HValue* value) { hydrogen_value_ = value; } HValue* hydrogen_value() const { return hydrogen_value_; } - void set_deoptimization_environment(LEnvironment* env) { - deoptimization_environment_.set(env); - } - LEnvironment* deoptimization_environment() const { - return deoptimization_environment_.get(); - } - bool HasDeoptimizationEnvironment() const { - return deoptimization_environment_.is_set(); - } - private: SetOncePointer environment_; SetOncePointer pointer_map_; HValue* hydrogen_value_; - SetOncePointer deoptimization_environment_; };