a5a87e1e87
Maglev is mid-tier optimising compiler designed mainly for compilation speed that can still generate good code for straightforward JS. This initial commit is an MVP for Maglev which can compile and run some very simple code, and sets up a framework that we can build upon. Design: https://docs.google.com/document/d/13CwgSL4yawxuYg3iNlM-4ZPCB8RgJya6b8H_E2F-Aek/edit# Bug: v8:7700 Change-Id: I5ae074ae099126c2c0d50864ac9b3d6fa5c9e85a Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3483664 Reviewed-by: Jakob Gruber <jgruber@chromium.org> Reviewed-by: Toon Verwaest <verwaest@chromium.org> Commit-Queue: Leszek Swirski <leszeks@chromium.org> Cr-Commit-Position: refs/heads/main@{#79247}
40 lines
908 B
JavaScript
40 lines
908 B
JavaScript
// Copyright 2022 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
|
|
|
|
function f(x) {
|
|
return x.a
|
|
}
|
|
|
|
function Foo(a) {
|
|
this.a = a
|
|
}
|
|
%PrepareFunctionForOptimization(f);
|
|
|
|
// Smi
|
|
var o1_1 = new Foo(1);
|
|
var o1_2 = new Foo(1);
|
|
|
|
// Transition map to double, o1 is deprecated, o1's map is a deprecation target.
|
|
var o2 = new Foo(1.2);
|
|
|
|
// Transition map to tagged, o1 is still deprecated.
|
|
var an_object = {};
|
|
var o3 = new Foo(an_object);
|
|
|
|
assertEquals(1, f(o1_1));
|
|
assertEquals(1.2, f(o2));
|
|
assertEquals(an_object, f(o3));
|
|
|
|
// o1_1 got migrated, but o1_2 hasn't yet.
|
|
assertTrue(%HaveSameMap(o1_1,o3));
|
|
assertFalse(%HaveSameMap(o1_2,o3));
|
|
%OptimizeMaglevOnNextCall(f);
|
|
|
|
// Deprecated map works
|
|
assertEquals(1, f(o1_2));
|
|
// Non-deprecated map works
|
|
assertEquals(an_object, f(o3));
|