Revision: 21371
Author: [email protected]
Date: Tue May 20 05:10:31 2014 UTC
Log: Version 3.25.28.18 (merged r20967)
Don't adopt the AST id from previous if id is none, since previous may have
mismatching expected stack height. Additionally, harden merging of
simulates after instructions with side effects and ensure there's a
simulate before HEnterInlined.
[email protected]
Review URL: https://codereview.chromium.org/298633002
http://code.google.com/p/v8/source/detail?r=21371
Added:
/branches/3.25/test/mjsunit/regress/regress-lazy-deopt-inlining2.js
Modified:
/branches/3.25/src/hydrogen-instructions.cc
/branches/3.25/src/hydrogen-removable-simulates.cc
/branches/3.25/src/version.cc
=======================================
--- /dev/null
+++ /branches/3.25/test/mjsunit/regress/regress-lazy-deopt-inlining2.js Tue
May 20 05:10:31 2014 UTC
@@ -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(1, f3(d), d);
+}
+
+function f2(v0, v1, v2) { return v1; }
+
+function f3(d) {
+ if (d) %DeoptimizeFunction(f1);
+ return 2;
+}
+
+%NeverOptimizeFunction(f3);
+
+f1(false);
+f1(false);
+%OptimizeFunctionOnNextCall(f1);
+assertEquals(3, f1(true));
=======================================
--- /branches/3.25/src/hydrogen-instructions.cc Wed May 14 13:19:52 2014 UTC
+++ /branches/3.25/src/hydrogen-instructions.cc Tue May 20 05:10:31 2014 UTC
@@ -2569,9 +2569,6 @@
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_;
=======================================
--- /branches/3.25/src/hydrogen-removable-simulates.cc Mon Jul 15 08:01:13
2013 UTC
+++ /branches/3.25/src/hydrogen-removable-simulates.cc Tue May 20 05:10:31
2014 UTC
@@ -41,14 +41,17 @@
bool first = true;
for (HInstructionIterator it(block); !it.Done(); it.Advance()) {
HInstruction* current = it.Current();
+ if (current->IsEnterInlined()) {
+ // Ensure there's a non-foldable HSimulate before an HEnterInlined
to
+ // avoid folding across HEnterInlined.
+ ASSERT(!HSimulate::cast(current->previous())->
+ is_candidate_for_removal());
+ }
if (current->IsLeaveInlined()) {
- // Never fold simulates from inlined environments into simulates
- // in the outer environment.
- // (Before each HEnterInlined, there is a non-foldable HSimulate
- // anyway, so we get the barrier in the other direction for free.)
- // Simply remove all accumulated simulates without merging. This
- // is safe because simulates after instructions with side effects
- // are never added to the merge list.
+ // Never fold simulates from inlined environments into simulates
in the
+ // outer environment. Simply remove all accumulated simulates
without
+ // merging. This is safe because simulates after instructions with
side
+ // effects are never added to the merge list.
while (!mergelist.is_empty()) {
mergelist.RemoveLast()->DeleteAndReplaceWith(NULL);
}
@@ -70,13 +73,24 @@
continue;
}
HSimulate* current_simulate = HSimulate::cast(current);
- if ((current_simulate->previous()->HasObservableSideEffects() &&
- !current_simulate->next()->IsSimulate()) ||
- !current_simulate->is_candidate_for_removal()) {
- // This simulate is not suitable for folding.
- // Fold the ones accumulated so far.
+ if (!current_simulate->is_candidate_for_removal()) {
+ current_simulate->MergeWith(&mergelist);
+ } else if (current_simulate->ast_id().IsNone()) {
+ ASSERT(current_simulate->next()->IsEnterInlined());
+ if (!mergelist.is_empty()) {
+ HSimulate* last = mergelist.RemoveLast();
+ last->MergeWith(&mergelist);
+ }
+ } else if (current_simulate->previous()->HasObservableSideEffects())
{
+ while (current_simulate->next()->IsSimulate()) {
+ it.Advance();
+ HSimulate* next_simulate = HSimulate::cast(it.Current());
+ if (next_simulate->ast_id().IsNone()) break;
+ mergelist.Add(current_simulate, zone());
+ current_simulate = next_simulate;
+ if (!current_simulate->is_candidate_for_removal()) break;
+ }
current_simulate->MergeWith(&mergelist);
- continue;
} else {
// Accumulate this simulate for folding later on.
mergelist.Add(current_simulate, zone());
=======================================
--- /branches/3.25/src/version.cc Wed May 14 13:19:52 2014 UTC
+++ /branches/3.25/src/version.cc Tue May 20 05:10:31 2014 UTC
@@ -35,7 +35,7 @@
#define MAJOR_VERSION 3
#define MINOR_VERSION 25
#define BUILD_NUMBER 28
-#define PATCH_LEVEL 17
+#define PATCH_LEVEL 18
// Use 1 for candidates and 0 otherwise.
// (Boolean macro values are not supported by all preprocessors.)
#define IS_CANDIDATE_VERSION 0
--
--
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.