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.