Commit e797f9fb authored by Benedikt Meurer's avatar Benedikt Meurer Committed by Commit Bot

[turbofan] Improve typing rule for NumberTrunc.

This extends the typing rule for NumberTrunc to deal with general number
inputs properly, thus addressing a long-standing TODO. We also add test
cases to ensure that the typing rule gets the corner cases for NaN and
-0 right.

Bug: v8:5267, v8:7109
Change-Id: Iedc541a0f4619f37da37ea36940f92472034cdf2
Reviewed-on: https://chromium-review.googlesource.com/792932Reviewed-by: 's avatarYang Guo <yangguo@chromium.org>
Commit-Queue: Benedikt Meurer <bmeurer@chromium.org>
Cr-Commit-Position: refs/heads/master@{#49652}
parent 71f3ab8e
......@@ -476,8 +476,9 @@ Type* OperationTyper::NumberTanh(Type* type) {
Type* OperationTyper::NumberTrunc(Type* type) {
DCHECK(type->Is(Type::Number()));
if (type->Is(cache_.kIntegerOrMinusZeroOrNaN)) return type;
// TODO(bmeurer): We could infer a more precise type here.
return cache_.kIntegerOrMinusZeroOrNaN;
type = Type::Intersect(type, Type::NaN(), zone());
type = Type::Union(type, cache_.kIntegerOrMinusZero, zone());
return type;
}
Type* OperationTyper::NumberToBoolean(Type* type) {
......
// 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
// Ensure that the typing rule for Math.trunc deals correctly with
// inputs in the range (-1.0,0.0), which are mapped to -0.
(function() {
function foo(x) {
// Arrange x such that TurboFan infers type PlainNumber \/ NaN.
x = +x;
x = Math.abs(x) - 1.0;
return Object.is(-0, Math.trunc(x));
}
assertFalse(foo(1.5));
assertTrue(foo(0.5));
%OptimizeFunctionOnNextCall(foo);
assertFalse(foo(1.5));
assertTrue(foo(0.5));
})();
// Ensure that the typing rule for Math.trunc deals correctly with
// NaN inputs, which are mapped to NaN.
(function() {
function foo(x) {
// Arrange x such that TurboFan infers type PlainNumber \/ NaN.
x = +x;
x = Math.abs(x) - 1.0;
return Object.is(NaN, Math.trunc(x));
}
assertFalse(foo(1.5));
assertTrue(foo(NaN));
%OptimizeFunctionOnNextCall(foo);
assertFalse(foo(1.5));
assertTrue(foo(NaN));
})();
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment