585b4eef6a
The NumberMultiply typing rule gave up in the presence of NaN inputs, but we can still infer useful ranges here and just union the result of that with the NaN propagation (similar for MinusZero propagation). This way we can still makes sense of these ranges at the uses. Bug: v8:8015 Change-Id: Ic4c5e8edc6c68776ff3baca9628ad7de0f8e2a92 Reviewed-on: https://chromium-review.googlesource.com/c/1261143 Commit-Queue: Benedikt Meurer <bmeurer@chromium.org> Reviewed-by: Sigurd Schneider <sigurds@chromium.org> Cr-Commit-Position: refs/heads/master@{#56539}
60 lines
1.4 KiB
JavaScript
60 lines
1.4 KiB
JavaScript
// Copyright 2018 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 --opt
|
|
|
|
// Test the extreme case where -0 is produced by rounding errors.
|
|
(function() {
|
|
function bar(x) {
|
|
return 1e-308 * x;
|
|
}
|
|
bar(1);
|
|
|
|
function foo() {
|
|
return Object.is(-0, bar(-1e-308));
|
|
}
|
|
|
|
assertTrue(foo());
|
|
assertTrue(foo());
|
|
%OptimizeFunctionOnNextCall(foo);
|
|
assertTrue(foo());
|
|
})();
|
|
|
|
// Test that multiplication of integer by 0 produces the correct results.
|
|
(function() {
|
|
function foo(x) {
|
|
return 0 * Math.round(x);
|
|
}
|
|
|
|
assertEquals(0, foo(0.1));
|
|
assertEquals(-0, foo(-0.1));
|
|
assertEquals(NaN, foo(NaN));
|
|
assertEquals(NaN, foo(Infinity));
|
|
assertEquals(NaN, foo(-Infinity));
|
|
%OptimizeFunctionOnNextCall(foo);
|
|
assertEquals(0, foo(0.1));
|
|
assertEquals(-0, foo(-0.1));
|
|
assertEquals(NaN, foo(NaN));
|
|
assertEquals(NaN, foo(Infinity));
|
|
assertEquals(NaN, foo(-Infinity));
|
|
})();
|
|
|
|
// Test that multiplication properly preserves -0 and NaN, and doesn't
|
|
// cut it short incorrectly.
|
|
(function() {
|
|
function foo(x, y) {
|
|
x = Math.sign(x);
|
|
y = Math.sign(y);
|
|
return Math.min(x * y, 0);
|
|
}
|
|
|
|
assertEquals(0, foo(1, 0));
|
|
assertEquals(-0, foo(1, -0));
|
|
assertEquals(NaN, foo(NaN, -0));
|
|
%OptimizeFunctionOnNextCall(foo);
|
|
assertEquals(0, foo(1, 0));
|
|
assertEquals(-0, foo(1, -0));
|
|
assertEquals(NaN, foo(NaN, -0));
|
|
})();
|