231bb1a2ec
Reland of https://chromium-review.googlesource.com/c/543042/. Now the OSR phase is only used when OSRing from the ast graph builder. When OSRing from Turbofan, the implementation is now in the graph building phase, at the beginning of the VisitBytecode function. We are no longer generating any OSRLoopEntry or OSRNormalEntry nodes, nor nodes for the possible code of the OSRed function which is before the OSRed loops. The trimming and reducing of the OSR phase is not done either. This change in the way the way the OSR is done enabled to remove the workaround to the bug mentioned below. Bug: v8:6112 Bug: v8:6518 Change-Id: Ia02f2138f54fc79cab2f02fed68d9bb522d6ce14 Reviewed-on: https://chromium-review.googlesource.com/584756 Commit-Queue: Alexandre Talon <alexandret@google.com> Reviewed-by: Ross McIlroy <rmcilroy@chromium.org> Reviewed-by: Michael Starzinger <mstarzinger@chromium.org> Cr-Commit-Position: refs/heads/master@{#46899}
60 lines
1.5 KiB
JavaScript
60 lines
1.5 KiB
JavaScript
// Copyright 2017 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
|
|
|
|
// This tests checks some possible wrong exception handling due to,
|
|
// for instance, the OSR loop peeling. If exception handlers are not updated
|
|
// correctly, when we run the second iteration of the outermost loop, which
|
|
// is the OSR optimised version, the try-catch will fail... which should not
|
|
// fail on a correct code.
|
|
|
|
function SingleLoop() {
|
|
for (var a = 0; a < 2; a++) {
|
|
try { throw 'The exception should have been caught.'; }
|
|
catch(e) {}
|
|
for (var b = 0; b < 1; b++) {
|
|
%OptimizeOsr();
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
// These function could also fail if the exception handlers are not updated at
|
|
// the right time: a JSStackCheck gets created for the print, just after the
|
|
// bytecode for the while LoopHeader. If the OSR phase did not exit properly
|
|
// the exception before visiting the bytecode for the print, it will fail
|
|
// because some IfSuccess gets created for nothing (the IfException will
|
|
// become dead code and removed).
|
|
function EmptyBody() {
|
|
try {; } catch(e) {; }
|
|
var a = 0;
|
|
while (1) {
|
|
%OptimizeOsr();
|
|
print("foo");
|
|
|
|
if (a == 1) break;
|
|
a++;
|
|
}
|
|
}
|
|
|
|
function NestedLoops() {
|
|
for (var a = 0; a < 2; a++) {
|
|
try {; } catch(e) {; }
|
|
%OptimizeOsr();
|
|
var b = 0;
|
|
while (1) {
|
|
print("bar");
|
|
|
|
if (b == 1) break;
|
|
b++;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
SingleLoop();
|
|
EmptyBody();
|
|
NestedLoops();
|