| Index: src/x64/lithium-x64.cc
|
| diff --git a/src/x64/lithium-x64.cc b/src/x64/lithium-x64.cc
|
| index ddaae82022cef07d66f42448d2bc2219633d583f..9815e874592b5925ae34fd3c104a042ff5b180c2 100644
|
| --- a/src/x64/lithium-x64.cc
|
| +++ b/src/x64/lithium-x64.cc
|
| @@ -639,12 +639,18 @@ LInstruction* LChunkBuilder::MarkAsCall(LInstruction* instr,
|
| 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());
|
| + // For Control instructions we cannot verify the ast_id, since there is no
|
| + // 1:1 mapping but it corresponds to two simulates for each branch.
|
| + if (!hinstr->IsControlInstruction()) {
|
| + ASSERT(hinstr->next()->IsSimulate());
|
| + HSimulate* sim = HSimulate::cast(hinstr->next());
|
| + pending_deoptimization_ast_id_ = sim->ast_id();
|
| + } else {
|
| + pending_deoptimization_ast_id_ = BailoutId::PendingMarker();
|
| + }
|
| instruction_pending_deoptimization_environment_ = instr;
|
| - pending_deoptimization_ast_id_ = sim->ast_id();
|
| }
|
|
|
| // If instruction does not have side-effects lazy deoptimization
|
| @@ -1600,13 +1606,13 @@ LInstruction* LChunkBuilder::DoRandom(HRandom* instr) {
|
| }
|
|
|
|
|
| -LInstruction* LChunkBuilder::DoCompareGeneric(HCompareGeneric* instr) {
|
| +LInstruction* LChunkBuilder::DoCompareGenericAndBranch(
|
| + HCompareGenericAndBranch* instr) {
|
| ASSERT(instr->left()->representation().IsTagged());
|
| ASSERT(instr->right()->representation().IsTagged());
|
| LOperand* left = UseFixed(instr->left(), rdx);
|
| LOperand* right = UseFixed(instr->right(), rax);
|
| - LCmpT* result = new(zone()) LCmpT(left, right);
|
| - return MarkAsCall(DefineFixed(result, rax), instr);
|
| + return MarkAsCall(new(zone()) LCompareGenericAndBranch(left, right), instr);
|
| }
|
|
|
|
|
| @@ -2434,7 +2440,9 @@ 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_.IsNone()) {
|
| + ASSERT(pending_deoptimization_ast_id_ == instr->ast_id() ||
|
| + pending_deoptimization_ast_id_.IsPendingMarker());
|
| LLazyBailout* lazy_bailout = new(zone()) LLazyBailout;
|
| LInstruction* result = AssignEnvironment(lazy_bailout);
|
| // Store the lazy deopt environment with the instruction if needed. Right
|
|
|