v8/test/mjsunit/compiler/number-multiply.js
Benedikt Meurer 585b4eef6a [turbofan] Improve NumberMultiply typing rule.
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}
2018-10-10 18:16:17 +00:00

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));
})();