c78a98bbc2
We now represent the SameValue operation explicitly in TurboFan and the operation can thus participate in all kinds of optimizations. Especially we get rid of the JSCall node in the general case, which blocks several optimizations across the call. The general, baseline performance is now always on par with StrictEqual. Once the StrictEqual operator is also a simplified operator, we should start unifying the type based optimizations in SimplifiedLowering. In the micro-benchmark we go from testStrictEqual: 1422 ms. testObjectIs: 1520 ms. testManualSameValue: 1759 ms. to testStrictEqual: 1426 ms. testObjectIs: 1357 ms. testManualSameValue: 1766 ms. which gives the expected result. Bug: v8:7007 Change-Id: I0de3ff6ff6209ab4c3edb69de6a16e387295a9c8 Reviewed-on: https://chromium-review.googlesource.com/741228 Reviewed-by: Jaroslav Sevcik <jarin@chromium.org> Commit-Queue: Benedikt Meurer <bmeurer@chromium.org> Cr-Commit-Position: refs/heads/master@{#48994}
175 lines
4.0 KiB
JavaScript
175 lines
4.0 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
|
|
|
|
(function() {
|
|
function foo(o) { return Object.is(o, -0); }
|
|
assertTrue(foo(-0));
|
|
assertFalse(foo(0));
|
|
assertFalse(foo(NaN));
|
|
assertFalse(foo(''));
|
|
assertFalse(foo([]));
|
|
assertFalse(foo({}));
|
|
%OptimizeFunctionOnNextCall(foo);
|
|
assertTrue(foo(-0));
|
|
assertFalse(foo(0));
|
|
assertFalse(foo(NaN));
|
|
assertFalse(foo(''));
|
|
assertFalse(foo([]));
|
|
assertFalse(foo({}));
|
|
})();
|
|
|
|
(function() {
|
|
function foo(o) { return Object.is(-0, o); }
|
|
assertTrue(foo(-0));
|
|
assertFalse(foo(0));
|
|
assertFalse(foo(NaN));
|
|
assertFalse(foo(''));
|
|
assertFalse(foo([]));
|
|
assertFalse(foo({}));
|
|
%OptimizeFunctionOnNextCall(foo);
|
|
assertTrue(foo(-0));
|
|
assertFalse(foo(0));
|
|
assertFalse(foo(NaN));
|
|
assertFalse(foo(''));
|
|
assertFalse(foo([]));
|
|
assertFalse(foo({}));
|
|
})();
|
|
|
|
(function() {
|
|
function foo(o) { return Object.is(+o, -0); }
|
|
assertTrue(foo(-0));
|
|
assertFalse(foo(0));
|
|
assertFalse(foo(NaN));
|
|
%OptimizeFunctionOnNextCall(foo);
|
|
assertTrue(foo(-0));
|
|
assertFalse(foo(0));
|
|
assertFalse(foo(NaN));
|
|
})();
|
|
|
|
(function() {
|
|
function foo(o) { return Object.is(-0, +o); }
|
|
assertTrue(foo(-0));
|
|
assertFalse(foo(0));
|
|
assertFalse(foo(NaN));
|
|
%OptimizeFunctionOnNextCall(foo);
|
|
assertTrue(foo(-0));
|
|
assertFalse(foo(0));
|
|
assertFalse(foo(NaN));
|
|
})();
|
|
|
|
(function() {
|
|
function foo(o) { return Object.is(o, NaN); }
|
|
assertFalse(foo(-0));
|
|
assertFalse(foo(0));
|
|
assertTrue(foo(NaN));
|
|
assertFalse(foo(''));
|
|
assertFalse(foo([]));
|
|
assertFalse(foo({}));
|
|
%OptimizeFunctionOnNextCall(foo);
|
|
assertFalse(foo(-0));
|
|
assertFalse(foo(0));
|
|
assertTrue(foo(NaN));
|
|
assertFalse(foo(''));
|
|
assertFalse(foo([]));
|
|
assertFalse(foo({}));
|
|
})();
|
|
|
|
(function() {
|
|
function foo(o) { return Object.is(NaN, o); }
|
|
assertFalse(foo(-0));
|
|
assertFalse(foo(0));
|
|
assertTrue(foo(NaN));
|
|
assertFalse(foo(''));
|
|
assertFalse(foo([]));
|
|
assertFalse(foo({}));
|
|
%OptimizeFunctionOnNextCall(foo);
|
|
assertFalse(foo(-0));
|
|
assertFalse(foo(0));
|
|
assertTrue(foo(NaN));
|
|
assertFalse(foo(''));
|
|
assertFalse(foo([]));
|
|
assertFalse(foo({}));
|
|
})();
|
|
|
|
(function() {
|
|
function foo(o) { return Object.is(+o, NaN); }
|
|
assertFalse(foo(-0));
|
|
assertFalse(foo(0));
|
|
assertTrue(foo(NaN));
|
|
%OptimizeFunctionOnNextCall(foo);
|
|
assertFalse(foo(-0));
|
|
assertFalse(foo(0));
|
|
assertTrue(foo(NaN));
|
|
})();
|
|
|
|
(function() {
|
|
function foo(o) { return Object.is(NaN, +o); }
|
|
assertFalse(foo(-0));
|
|
assertFalse(foo(0));
|
|
assertTrue(foo(NaN));
|
|
%OptimizeFunctionOnNextCall(foo);
|
|
assertFalse(foo(-0));
|
|
assertFalse(foo(0));
|
|
assertTrue(foo(NaN));
|
|
})();
|
|
|
|
(function() {
|
|
function foo(o) { return Object.is(`${o}`, "foo"); }
|
|
assertFalse(foo("bar"));
|
|
assertTrue(foo("foo"));
|
|
%OptimizeFunctionOnNextCall(foo);
|
|
assertFalse(foo("bar"));
|
|
assertTrue(foo("foo"));
|
|
})();
|
|
|
|
(function() {
|
|
function foo(o) { return Object.is(String(o), "foo"); }
|
|
assertFalse(foo("bar"));
|
|
assertTrue(foo("foo"));
|
|
%OptimizeFunctionOnNextCall(foo);
|
|
assertFalse(foo("bar"));
|
|
assertTrue(foo("foo"));
|
|
})();
|
|
|
|
(function() {
|
|
function foo(o) { return Object.is(o, o); }
|
|
assertTrue(foo(-0));
|
|
assertTrue(foo(0));
|
|
assertTrue(foo(NaN));
|
|
assertTrue(foo(''));
|
|
assertTrue(foo([]));
|
|
assertTrue(foo({}));
|
|
%OptimizeFunctionOnNextCall(foo);
|
|
assertTrue(foo(-0));
|
|
assertTrue(foo(0));
|
|
assertTrue(foo(NaN));
|
|
assertTrue(foo(''));
|
|
assertTrue(foo([]));
|
|
assertTrue(foo({}));
|
|
})();
|
|
|
|
(function() {
|
|
function foo(o) { return Object.is(o|0, 0); }
|
|
assertTrue(foo(0));
|
|
assertTrue(foo(-0));
|
|
assertTrue(foo(NaN));
|
|
assertFalse(foo(1));
|
|
%OptimizeFunctionOnNextCall(foo);
|
|
assertTrue(foo(0));
|
|
assertTrue(foo(-0));
|
|
assertTrue(foo(NaN));
|
|
assertFalse(foo(1));
|
|
})();
|
|
|
|
(function() {
|
|
const s = Symbol();
|
|
function foo() { return Object.is(s, Symbol()); }
|
|
assertFalse(foo());
|
|
assertFalse(foo());
|
|
%OptimizeFunctionOnNextCall(foo);
|
|
assertFalse(foo());
|
|
})();
|