Reviewers: danno,
Description:
Merged bleeding edge r20949 into 3.25 branch.
Mark the simulate before EnterInlined with BailoutId::None(), and set
ReturnId
on EnterInlined. When merging simulates into the simulate before
enter-inlined,
adopt the last AST id that gets merged into it.
BUG=v8:3282
LOG=N
[email protected]
Please review this at https://codereview.chromium.org/283923003/
SVN Base: https://v8.googlecode.com/svn/branches/3.25
Affected files (+53, -9 lines):
M src/arm/lithium-arm.cc
M src/arm64/lithium-arm64.cc
M src/hydrogen.cc
M src/hydrogen-instructions.h
M src/hydrogen-instructions.cc
M src/ia32/lithium-ia32.cc
M src/mips/lithium-mips.cc
M src/version.cc
M src/x64/lithium-x64.cc
A test/mjsunit/regress/regress-lazy-deopt-inlining.js
Index: src/arm/lithium-arm.cc
diff --git a/src/arm/lithium-arm.cc b/src/arm/lithium-arm.cc
index
55705b8073cfd0a8e3f91b8d7aa1beca58b1b978..f13dd8320eb34fcb9760b1a583e22f534bac643a
100644
--- a/src/arm/lithium-arm.cc
+++ b/src/arm/lithium-arm.cc
@@ -2478,6 +2478,7 @@ LInstruction*
LChunkBuilder::DoStackCheck(HStackCheck* instr) {
LInstruction* LChunkBuilder::DoEnterInlined(HEnterInlined* instr) {
HEnvironment* outer = current_block_->last_environment();
+ outer->set_ast_id(instr->ReturnId());
HConstant* undefined = graph()->GetConstantUndefined();
HEnvironment* inner = outer->CopyForInlining(instr->closure(),
instr->arguments_count(),
Index: src/arm64/lithium-arm64.cc
diff --git a/src/arm64/lithium-arm64.cc b/src/arm64/lithium-arm64.cc
index
60bf51ebbdc7d33170faff92dcf106d777a1f7c4..411a39c3a0716ef3b753e3698f2300157352bb18
100644
--- a/src/arm64/lithium-arm64.cc
+++ b/src/arm64/lithium-arm64.cc
@@ -1447,6 +1447,7 @@ LInstruction* LChunkBuilder::DoDummyUse(HDummyUse*
instr) {
LInstruction* LChunkBuilder::DoEnterInlined(HEnterInlined* instr) {
HEnvironment* outer = current_block_->last_environment();
+ outer->set_ast_id(instr->ReturnId());
HConstant* undefined = graph()->GetConstantUndefined();
HEnvironment* inner = outer->CopyForInlining(instr->closure(),
instr->arguments_count(),
Index: src/hydrogen-instructions.cc
diff --git a/src/hydrogen-instructions.cc b/src/hydrogen-instructions.cc
index
84dcb18248e113bad54db2d9dc60a403856e996c..8333193db0ca99d46036567cb41e95d58dc98602
100644
--- a/src/hydrogen-instructions.cc
+++ b/src/hydrogen-instructions.cc
@@ -2569,6 +2569,9 @@ void HPhi::AddIndirectUsesTo(int* dest) {
void HSimulate::MergeWith(ZoneList<HSimulate*>* list) {
+ if (!list->is_empty() && !HasAstId()) {
+ set_ast_id(list->last()->ast_id());
+ }
while (!list->is_empty()) {
HSimulate* from = list->RemoveLast();
ZoneList<HValue*>* from_values = &from->values_;
@@ -4455,7 +4458,7 @@ void HPhi::Verify() {
void HSimulate::Verify() {
HInstruction::Verify();
- ASSERT(HasAstId());
+ ASSERT(HasAstId() || next()->IsEnterInlined());
}
Index: src/hydrogen-instructions.h
diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h
index
1e6ac19bf7f42dcedcd7fe1a953168967002bdfc..e6c508e694868845c2cacc3c1cac948e76402dc1
100644
--- a/src/hydrogen-instructions.h
+++ b/src/hydrogen-instructions.h
@@ -2069,14 +2069,15 @@ class HEnterInlined V8_FINAL : public
HTemplateInstruction<0> {
public:
static HEnterInlined* New(Zone* zone,
HValue* context,
+ BailoutId return_id,
Handle<JSFunction> closure,
int arguments_count,
FunctionLiteral* function,
InliningKind inlining_kind,
Variable* arguments_var,
HArgumentsObject* arguments_object) {
- return new(zone) HEnterInlined(closure, arguments_count, function,
- inlining_kind, arguments_var,
+ return new(zone) HEnterInlined(return_id, closure, arguments_count,
+ function, inlining_kind, arguments_var,
arguments_object, zone);
}
@@ -2091,6 +2092,7 @@ class HEnterInlined V8_FINAL : public
HTemplateInstruction<0> {
void set_arguments_pushed() { arguments_pushed_ = true; }
FunctionLiteral* function() const { return function_; }
InliningKind inlining_kind() const { return inlining_kind_; }
+ BailoutId ReturnId() const { return return_id_; }
virtual Representation RequiredInputRepresentation(int index)
V8_OVERRIDE {
return Representation::None();
@@ -2102,14 +2104,16 @@ class HEnterInlined V8_FINAL : public
HTemplateInstruction<0> {
DECLARE_CONCRETE_INSTRUCTION(EnterInlined)
private:
- HEnterInlined(Handle<JSFunction> closure,
+ HEnterInlined(BailoutId return_id,
+ Handle<JSFunction> closure,
int arguments_count,
FunctionLiteral* function,
InliningKind inlining_kind,
Variable* arguments_var,
HArgumentsObject* arguments_object,
Zone* zone)
- : closure_(closure),
+ : return_id_(return_id),
+ closure_(closure),
arguments_count_(arguments_count),
arguments_pushed_(false),
function_(function),
@@ -2119,6 +2123,7 @@ class HEnterInlined V8_FINAL : public
HTemplateInstruction<0> {
return_targets_(2, zone) {
}
+ BailoutId return_id_;
Handle<JSFunction> closure_;
int arguments_count_;
bool arguments_pushed_;
Index: src/hydrogen.cc
diff --git a/src/hydrogen.cc b/src/hydrogen.cc
index
e9779fd0e31d3ec7823089b4924b84a8e667a7a2..11095b784d1ab72d55257c22a501a577378700c5
100644
--- a/src/hydrogen.cc
+++ b/src/hydrogen.cc
@@ -7252,8 +7252,6 @@ bool
HOptimizedGraphBuilder::TryInline(Handle<JSFunction> target,
HConstant* context = Add<HConstant>(Handle<Context>(target->context()));
inner_env->BindContext(context);
- Add<HSimulate>(return_id);
- current_block()->UpdateEnvironment(inner_env);
HArgumentsObject* arguments_object = NULL;
// If the function uses arguments object create and bind one, also copy
@@ -7269,8 +7267,17 @@ bool
HOptimizedGraphBuilder::TryInline(Handle<JSFunction> target,
}
}
+ // Capture the state before invoking the inlined function for deopt in
the
+ // inlined function. This simulate has no bailout-id since it's not
directly
+ // reachable for deopt, and is only used to capture the state. If the
simulate
+ // becomes reachable by merging, the ast id of the simulate merged into
it is
+ // adopted.
+ Add<HSimulate>(BailoutId::None());
+
+ current_block()->UpdateEnvironment(inner_env);
+
HEnterInlined* enter_inlined =
- Add<HEnterInlined>(target, arguments_count, function,
+ Add<HEnterInlined>(return_id, target, arguments_count, function,
function_state()->inlining_kind(),
function->scope()->arguments(),
arguments_object);
Index: src/ia32/lithium-ia32.cc
diff --git a/src/ia32/lithium-ia32.cc b/src/ia32/lithium-ia32.cc
index
696c6be6e8159cd8ba3427dab2f8eb6e0717400c..2ed5a99624ed5924cc6ad8512d1408155ae88ad3
100644
--- a/src/ia32/lithium-ia32.cc
+++ b/src/ia32/lithium-ia32.cc
@@ -2642,6 +2642,7 @@ LInstruction*
LChunkBuilder::DoStackCheck(HStackCheck* instr) {
LInstruction* LChunkBuilder::DoEnterInlined(HEnterInlined* instr) {
HEnvironment* outer = current_block_->last_environment();
+ outer->set_ast_id(instr->ReturnId());
HConstant* undefined = graph()->GetConstantUndefined();
HEnvironment* inner = outer->CopyForInlining(instr->closure(),
instr->arguments_count(),
Index: src/mips/lithium-mips.cc
diff --git a/src/mips/lithium-mips.cc b/src/mips/lithium-mips.cc
index
752f67673d76841120c4a2b4be96fbef29ec84cd..41b459228aa6608199e14fa461a51227d15f1910
100644
--- a/src/mips/lithium-mips.cc
+++ b/src/mips/lithium-mips.cc
@@ -2431,6 +2431,7 @@ LInstruction*
LChunkBuilder::DoStackCheck(HStackCheck* instr) {
LInstruction* LChunkBuilder::DoEnterInlined(HEnterInlined* instr) {
HEnvironment* outer = current_block_->last_environment();
+ outer->set_ast_id(instr->ReturnId());
HConstant* undefined = graph()->GetConstantUndefined();
HEnvironment* inner = outer->CopyForInlining(instr->closure(),
instr->arguments_count(),
Index: src/version.cc
diff --git a/src/version.cc b/src/version.cc
index
44b1a203fd80167e628c635cef4c0ea2ceeb39db..6cb1b22b4197a3444d5e2b0069bb15eea7293456
100644
--- a/src/version.cc
+++ b/src/version.cc
@@ -35,7 +35,7 @@
#define MAJOR_VERSION 3
#define MINOR_VERSION 25
#define BUILD_NUMBER 28
-#define PATCH_LEVEL 16
+#define PATCH_LEVEL 17
// Use 1 for candidates and 0 otherwise.
// (Boolean macro values are not supported by all preprocessors.)
#define IS_CANDIDATE_VERSION 0
Index: src/x64/lithium-x64.cc
diff --git a/src/x64/lithium-x64.cc b/src/x64/lithium-x64.cc
index
c3de9a7f1ecffe85ffdfee9f4090d756e2009dab..eb9ae59f8b7495649b5c9f2f3b20112c20740475
100644
--- a/src/x64/lithium-x64.cc
+++ b/src/x64/lithium-x64.cc
@@ -2525,6 +2525,7 @@ LInstruction*
LChunkBuilder::DoStackCheck(HStackCheck* instr) {
LInstruction* LChunkBuilder::DoEnterInlined(HEnterInlined* instr) {
HEnvironment* outer = current_block_->last_environment();
+ outer->set_ast_id(instr->ReturnId());
HConstant* undefined = graph()->GetConstantUndefined();
HEnvironment* inner = outer->CopyForInlining(instr->closure(),
instr->arguments_count(),
Index: test/mjsunit/regress/regress-lazy-deopt-inlining.js
diff --git a/test/mjsunit/regress/regress-lazy-deopt-inlining.js
b/test/mjsunit/regress/regress-lazy-deopt-inlining.js
new file mode 100644
index
0000000000000000000000000000000000000000..6cda168dff5c948727d854c93d192c4fcac88a03
--- /dev/null
+++ b/test/mjsunit/regress/regress-lazy-deopt-inlining.js
@@ -0,0 +1,24 @@
+// Copyright 2014 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --allow-natives-syntax
+
+"use strict";
+function f1(d) {
+ return 1 + f2(f3(d));
+}
+
+function f2(v) { return v; }
+
+function f3(d) {
+ if (d) %DeoptimizeFunction(f1);
+ return 2;
+}
+
+%NeverOptimizeFunction(f3);
+
+f1(false);
+f1(false);
+%OptimizeFunctionOnNextCall(f1);
+assertEquals(3, f1(true));
--
--
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.