Revision: 20068
Author:   [email protected]
Date:     Wed Mar 19 12:59:35 2014 UTC
Log:      Merged r19834, r19843 into 3.23 branch.

Fix lazy deopt after tagged binary ops

BUG=chromium:350434
LOG=N
[email protected]

Review URL: https://codereview.chromium.org/204353003
http://code.google.com/p/v8/source/detail?r=20068

Modified:
 /branches/3.23/src/arm/lithium-arm.cc
 /branches/3.23/src/arm/lithium-arm.h
 /branches/3.23/src/arm/lithium-codegen-arm.cc
 /branches/3.23/src/arm/lithium-codegen-arm.h
 /branches/3.23/src/deoptimizer.cc
 /branches/3.23/src/heap.cc
 /branches/3.23/src/hydrogen-instructions.cc
 /branches/3.23/src/hydrogen-instructions.h
 /branches/3.23/src/ia32/lithium-codegen-ia32.cc
 /branches/3.23/src/ia32/lithium-ia32.cc
 /branches/3.23/src/ia32/lithium-ia32.h
 /branches/3.23/src/mips/lithium-codegen-mips.cc
 /branches/3.23/src/mips/lithium-codegen-mips.h
 /branches/3.23/src/mips/lithium-mips.cc
 /branches/3.23/src/mips/lithium-mips.h
 /branches/3.23/src/safepoint-table.h
 /branches/3.23/src/serialize.h
 /branches/3.23/src/version.cc
 /branches/3.23/src/x64/lithium-codegen-x64.cc
 /branches/3.23/src/x64/lithium-codegen-x64.h
 /branches/3.23/src/x64/lithium-x64.cc
 /branches/3.23/src/x64/lithium-x64.h

=======================================
--- /branches/3.23/src/arm/lithium-arm.cc       Tue Dec  3 08:00:39 2013 UTC
+++ /branches/3.23/src/arm/lithium-arm.cc       Wed Mar 19 12:59:35 2014 UTC
@@ -631,15 +631,6 @@
   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
@@ -921,6 +912,26 @@
       instr = AssignEnvironment(instr);
     }
     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;
 }
@@ -2579,21 +2590,6 @@

 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_ == instr->ast_id()) {
-    LInstruction* result = new(zone()) LLazyBailout;
-    result = AssignEnvironment(result);
- // 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;
 }

=======================================
--- /branches/3.23/src/arm/lithium-arm.h        Tue Dec  3 08:00:39 2013 UTC
+++ /branches/3.23/src/arm/lithium-arm.h        Wed Mar 19 12:59:35 2014 UTC
@@ -2753,9 +2753,7 @@
         next_block_(NULL),
         argument_count_(0),
         allocator_(allocator),
-        position_(RelocInfo::kNoPosition),
-        instruction_pending_deoptimization_environment_(NULL),
-        pending_deoptimization_ast_id_(BailoutId::None()) { }
+        position_(RelocInfo::kNoPosition) { }

   // Build the sequence for the graph.
   LPlatformChunk* Build();
@@ -2908,8 +2906,6 @@
   int argument_count_;
   LAllocator* allocator_;
   int position_;
-  LInstruction* instruction_pending_deoptimization_environment_;
-  BailoutId pending_deoptimization_ast_id_;

   DISALLOW_COPY_AND_ASSIGN(LChunkBuilder);
 };
=======================================
--- /branches/3.23/src/arm/lithium-codegen-arm.cc Fri Feb 28 20:18:06 2014 UTC +++ /branches/3.23/src/arm/lithium-codegen-arm.cc Wed Mar 19 12:59:35 2014 UTC
@@ -257,6 +257,13 @@
   ASSERT(slots >= 0);
   __ sub(sp, sp, Operand(slots * kPointerSize));
 }
+
+
+void LCodeGen::GenerateBodyInstructionPre(LInstruction* instr) {
+  if (!instr->IsLazyBailout() && !instr->IsGap()) {
+    safepoints_.BumpLastLazySafepointIndex();
+  }
+}


 bool LCodeGen::GenerateDeferredCode() {
@@ -2190,7 +2197,6 @@
   // is in the correct position.
   Assembler::BlockConstPoolScope block_const_pool(masm());
   CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr);
-  __ nop();  // Signals no inlined code.
 }


=======================================
--- /branches/3.23/src/arm/lithium-codegen-arm.h Mon Nov 25 12:01:13 2013 UTC +++ /branches/3.23/src/arm/lithium-codegen-arm.h Wed Mar 19 12:59:35 2014 UTC
@@ -191,6 +191,7 @@

   // Code generation passes.  Returns true if code generation should
   // continue.
+  void GenerateBodyInstructionPre(LInstruction* instr) V8_OVERRIDE;
   bool GeneratePrologue();
   bool GenerateDeferredCode();
   bool GenerateDeoptJumpTable();
=======================================
--- /branches/3.23/src/deoptimizer.cc   Fri Nov 29 11:43:20 2013 UTC
+++ /branches/3.23/src/deoptimizer.cc   Wed Mar 19 12:59:35 2014 UTC
@@ -392,10 +392,34 @@
     }
     element = next;
   }
+
+#ifdef DEBUG
+ // Make sure all activations of optimized code can deopt at their current PC.
+  for (StackFrameIterator it(isolate, isolate->thread_local_top());
+       !it.done(); it.Advance()) {
+    StackFrame::Type type = it.frame()->type();
+    if (type == StackFrame::OPTIMIZED) {
+      Code* code = it.frame()->LookupCode();
+      if (FLAG_trace_deopt) {
+        JSFunction* function =
+            static_cast<OptimizedFrame*>(it.frame())->function();
+        CodeTracer::Scope scope(isolate->GetCodeTracer());
+        PrintF(scope.file(), "[deoptimizer patches for lazy deopt: ");
+        function->PrintName(scope.file());
+        PrintF(scope.file(),
+ " / %" V8PRIxPTR "]\n", reinterpret_cast<intptr_t>(function));
+      }
+      SafepointEntry safepoint = code->GetSafepointEntry(it.frame()->pc());
+      int deopt_index = safepoint.deoptimization_index();
+      CHECK(deopt_index != Safepoint::kNoDeoptimizationIndex);
+    }
+  }
+#endif

// TODO(titzer): we need a handle scope only because of the macro assembler,
   // which is only used in EnsureCodeForDeoptimizationEntry.
   HandleScope scope(isolate);
+
   // Now patch all the codes for deoptimization.
   for (int i = 0; i < codes.length(); i++) {
     // It is finally time to die, code object.
=======================================
--- /branches/3.23/src/heap.cc  Fri Jan 10 13:13:22 2014 UTC
+++ /branches/3.23/src/heap.cc  Wed Mar 19 12:59:35 2014 UTC
@@ -561,6 +561,9 @@
   if (FLAG_code_stats) ReportCodeStatistics("After GC");
 #endif
   if (FLAG_deopt_every_n_garbage_collections > 0) {
+    // TODO(jkummerow/ulan/jarin): This is not safe! We can't assume that
+    // the topmost optimized frame can be deoptimized safely, because it
+    // might not have a lazy bailout point right after its current PC.
if (++gcs_since_last_deopt_ == FLAG_deopt_every_n_garbage_collections) {
       Deoptimizer::DeoptimizeAll(isolate());
       gcs_since_last_deopt_ = 0;
=======================================
--- /branches/3.23/src/hydrogen-instructions.cc Mon Mar 17 11:35:23 2014 UTC
+++ /branches/3.23/src/hydrogen-instructions.cc Wed Mar 19 12:59:35 2014 UTC
@@ -2436,6 +2436,7 @@


 void HSimulate::ReplayEnvironment(HEnvironment* env) {
+  if (done_with_replay_) return;
   ASSERT(env != NULL);
   env->set_ast_id(ast_id());
   env->Drop(pop_count());
@@ -2447,6 +2448,7 @@
       env->Push(value);
     }
   }
+  done_with_replay_ = true;
 }


=======================================
--- /branches/3.23/src/hydrogen-instructions.h  Mon Mar 17 10:03:40 2014 UTC
+++ /branches/3.23/src/hydrogen-instructions.h  Wed Mar 19 12:59:35 2014 UTC
@@ -1802,7 +1802,8 @@
         values_(2, zone),
         assigned_indexes_(2, zone),
         zone_(zone),
-        removable_(removable) {}
+        removable_(removable),
+        done_with_replay_(false) {}
   ~HSimulate() {}

   virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE;
@@ -1885,7 +1886,8 @@
   ZoneList<HValue*> values_;
   ZoneList<int> assigned_indexes_;
   Zone* zone_;
-  RemovableSimulate removable_;
+  RemovableSimulate removable_ : 2;
+  bool done_with_replay_ : 1;

 #ifdef DEBUG
   Handle<JSFunction> closure_;
=======================================
--- /branches/3.23/src/ia32/lithium-codegen-ia32.cc Fri Feb 28 20:18:06 2014 UTC +++ /branches/3.23/src/ia32/lithium-codegen-ia32.cc Wed Mar 19 12:59:35 2014 UTC
@@ -384,6 +384,9 @@


 void LCodeGen::GenerateBodyInstructionPre(LInstruction* instr) {
+  if (!instr->IsLazyBailout() && !instr->IsGap()) {
+    safepoints_.BumpLastLazySafepointIndex();
+  }
   if (!CpuFeatures::IsSupported(SSE2)) FlushX87StackIfNecessary(instr);
 }

@@ -2358,7 +2361,6 @@

   BinaryOpICStub stub(instr->op(), NO_OVERWRITE);
   CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr);
-  __ nop();  // Signals no inlined code.
 }


=======================================
--- /branches/3.23/src/ia32/lithium-ia32.cc     Tue Dec  3 08:00:39 2013 UTC
+++ /branches/3.23/src/ia32/lithium-ia32.cc     Wed Mar 19 12:59:35 2014 UTC
@@ -696,15 +696,6 @@
   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
@@ -995,6 +986,26 @@
       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;
 }
@@ -2692,22 +2703,6 @@

 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;
 }

=======================================
--- /branches/3.23/src/ia32/lithium-ia32.h      Tue Dec  3 08:00:39 2013 UTC
+++ /branches/3.23/src/ia32/lithium-ia32.h      Wed Mar 19 12:59:35 2014 UTC
@@ -2767,9 +2767,7 @@
         current_block_(NULL),
         next_block_(NULL),
         argument_count_(0),
-        allocator_(allocator),
-        instruction_pending_deoptimization_environment_(NULL),
-        pending_deoptimization_ast_id_(BailoutId::None()) { }
+        allocator_(allocator) { }

   // Build the sequence for the graph.
   LPlatformChunk* Build();
@@ -2931,8 +2929,6 @@
   HBasicBlock* next_block_;
   int argument_count_;
   LAllocator* allocator_;
-  LInstruction* instruction_pending_deoptimization_environment_;
-  BailoutId pending_deoptimization_ast_id_;

   DISALLOW_COPY_AND_ASSIGN(LChunkBuilder);
 };
=======================================
--- /branches/3.23/src/mips/lithium-codegen-mips.cc Fri Feb 28 20:18:06 2014 UTC +++ /branches/3.23/src/mips/lithium-codegen-mips.cc Wed Mar 19 12:59:35 2014 UTC
@@ -254,6 +254,13 @@
   ASSERT(slots >= 0);
   __ Subu(sp, sp, Operand(slots * kPointerSize));
 }
+
+
+void LCodeGen::GenerateBodyInstructionPre(LInstruction* instr) {
+  if (!instr->IsLazyBailout() && !instr->IsGap()) {
+    safepoints_.BumpLastLazySafepointIndex();
+  }
+}


 bool LCodeGen::GenerateDeferredCode() {
=======================================
--- /branches/3.23/src/mips/lithium-codegen-mips.h Mon Nov 25 12:01:13 2013 UTC +++ /branches/3.23/src/mips/lithium-codegen-mips.h Wed Mar 19 12:59:35 2014 UTC
@@ -191,6 +191,7 @@

   // Code generation passes.  Returns true if code generation should
   // continue.
+  void GenerateBodyInstructionPre(LInstruction* instr) V8_OVERRIDE;
   bool GeneratePrologue();
   bool GenerateDeferredCode();
   bool GenerateDeoptJumpTable();
=======================================
--- /branches/3.23/src/mips/lithium-mips.cc     Tue Dec  3 08:00:39 2013 UTC
+++ /branches/3.23/src/mips/lithium-mips.cc     Wed Mar 19 12:59:35 2014 UTC
@@ -636,15 +636,6 @@
   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
@@ -929,6 +920,26 @@
       instr = AssignEnvironment(instr);
     }
     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;
 }
@@ -2505,21 +2516,6 @@

 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_ == instr->ast_id()) {
-    LInstruction* result = new(zone()) LLazyBailout;
-    result = AssignEnvironment(result);
- // 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;
 }

=======================================
--- /branches/3.23/src/mips/lithium-mips.h      Tue Dec  3 08:00:39 2013 UTC
+++ /branches/3.23/src/mips/lithium-mips.h      Wed Mar 19 12:59:35 2014 UTC
@@ -2729,9 +2729,7 @@
         next_block_(NULL),
         argument_count_(0),
         allocator_(allocator),
-        position_(RelocInfo::kNoPosition),
-        instruction_pending_deoptimization_environment_(NULL),
-        pending_deoptimization_ast_id_(BailoutId::None()) { }
+        position_(RelocInfo::kNoPosition) { }

   // Build the sequence for the graph.
   LPlatformChunk* Build();
@@ -2883,8 +2881,6 @@
   int argument_count_;
   LAllocator* allocator_;
   int position_;
-  LInstruction* instruction_pending_deoptimization_environment_;
-  BailoutId pending_deoptimization_ast_id_;

   DISALLOW_COPY_AND_ASSIGN(LChunkBuilder);
 };
=======================================
--- /branches/3.23/src/safepoint-table.h        Fri Nov  8 10:23:52 2013 UTC
+++ /branches/3.23/src/safepoint-table.h        Wed Mar 19 12:59:35 2014 UTC
@@ -219,6 +219,9 @@
   // Record deoptimization index for lazy deoptimization for the last
   // outstanding safepoints.
   void RecordLazyDeoptimizationIndex(int index);
+  void BumpLastLazySafepointIndex() {
+    last_lazy_safepoint_ = deopt_index_list_.length();
+  }

   // Emit the safepoint table after the body. The number of bits per
   // entry must be enough to hold all the pointer indexes.
=======================================
--- /branches/3.23/src/serialize.h      Wed Jan  8 10:34:14 2014 UTC
+++ /branches/3.23/src/serialize.h      Wed Mar 19 12:59:35 2014 UTC
@@ -60,7 +60,7 @@
 const int kDebugRegisterBits = 4;
 const int kDebugIdShift = kDebugRegisterBits;

-const int kDeoptTableSerializeEntryCount = 8;
+const int kDeoptTableSerializeEntryCount = 12;

 // ExternalReferenceTable is a helper class that defines the relationship
 // between external references and their encodings. It is used to build
=======================================
--- /branches/3.23/src/version.cc       Wed Mar 19 11:23:59 2014 UTC
+++ /branches/3.23/src/version.cc       Wed Mar 19 12:59:35 2014 UTC
@@ -35,7 +35,7 @@
 #define MAJOR_VERSION     3
 #define MINOR_VERSION     23
 #define BUILD_NUMBER      17
-#define PATCH_LEVEL       27
+#define PATCH_LEVEL       28
 // Use 1 for candidates and 0 otherwise.
 // (Boolean macro values are not supported by all preprocessors.)
 #define IS_CANDIDATE_VERSION 0
=======================================
--- /branches/3.23/src/x64/lithium-codegen-x64.cc Mon Mar 17 11:35:23 2014 UTC +++ /branches/3.23/src/x64/lithium-codegen-x64.cc Wed Mar 19 12:59:35 2014 UTC
@@ -266,6 +266,13 @@
   ASSERT(slots >= 0);
   __ subq(rsp, Immediate(slots * kPointerSize));
 }
+
+
+void LCodeGen::GenerateBodyInstructionPre(LInstruction* instr) {
+  if (!instr->IsLazyBailout() && !instr->IsGap()) {
+    safepoints_.BumpLastLazySafepointIndex();
+  }
+}


 bool LCodeGen::GenerateJumpTable() {
@@ -1953,7 +1960,6 @@

   BinaryOpICStub stub(instr->op(), NO_OVERWRITE);
   CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr);
-  __ nop();  // Signals no inlined code.
 }


=======================================
--- /branches/3.23/src/x64/lithium-codegen-x64.h Mon Nov 25 12:01:13 2013 UTC +++ /branches/3.23/src/x64/lithium-codegen-x64.h Wed Mar 19 12:59:35 2014 UTC
@@ -159,6 +159,7 @@

   // Code generation passes.  Returns true if code generation should
   // continue.
+  void GenerateBodyInstructionPre(LInstruction* instr) V8_OVERRIDE;
   bool GeneratePrologue();
   bool GenerateDeferredCode();
   bool GenerateJumpTable();
=======================================
--- /branches/3.23/src/x64/lithium-x64.cc       Mon Mar 17 10:03:40 2014 UTC
+++ /branches/3.23/src/x64/lithium-x64.cc       Wed Mar 19 12:59:35 2014 UTC
@@ -640,15 +640,6 @@
   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
@@ -924,6 +915,26 @@
       instr = AssignEnvironment(instr);
     }
     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;
 }
@@ -2529,21 +2540,6 @@

 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_ == 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;
 }

=======================================
--- /branches/3.23/src/x64/lithium-x64.h        Mon Mar 17 10:03:40 2014 UTC
+++ /branches/3.23/src/x64/lithium-x64.h        Wed Mar 19 12:59:35 2014 UTC
@@ -2687,9 +2687,7 @@
         current_block_(NULL),
         next_block_(NULL),
         argument_count_(0),
-        allocator_(allocator),
-        instruction_pending_deoptimization_environment_(NULL),
-        pending_deoptimization_ast_id_(BailoutId::None()) { }
+        allocator_(allocator) { }

   // Build the sequence for the graph.
   LPlatformChunk* Build();
@@ -2840,8 +2838,6 @@
   HBasicBlock* next_block_;
   int argument_count_;
   LAllocator* allocator_;
-  LInstruction* instruction_pending_deoptimization_environment_;
-  BailoutId pending_deoptimization_ast_id_;

   DISALLOW_COPY_AND_ASSIGN(LChunkBuilder);
 };

--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to