[turbofan] Extend typers of JSUnaryOps to BigInt

This CL fixes the types of JSUnaryOps with BigInt input.

Bug: chromium:1376930, v8:9407
Change-Id: I7a6603db08d3af1e40d440fe4c499e7f825b59d1
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3971119
Reviewed-by: Nico Hartmann <nicohartmann@chromium.org>
Commit-Queue: Qifan Pan <panq@google.com>
Cr-Commit-Position: refs/heads/main@{#83853}
This commit is contained in:
Qifan Pan 2022-10-21 12:20:15 +02:00 committed by V8 LUCI CQ
parent 5d7bbeb5ec
commit 7aa6a7e659
2 changed files with 32 additions and 0 deletions

View File

@ -434,6 +434,9 @@ Type Typer::Visitor::BitwiseNot(Type type, Typer* t) {
if (type.Is(Type::Number())) {
return NumberBitwiseXor(type, t->cache_->kSingletonMinusOne, t);
}
if (type.Is(Type::BigInt())) {
return Type::BigInt();
}
return Type::Numeric();
}
@ -442,6 +445,9 @@ Type Typer::Visitor::Decrement(Type type, Typer* t) {
if (type.Is(Type::Number())) {
return NumberSubtract(type, t->cache_->kSingletonOne, t);
}
if (type.Is(Type::BigInt())) {
return Type::BigInt();
}
return Type::Numeric();
}
@ -450,6 +456,9 @@ Type Typer::Visitor::Increment(Type type, Typer* t) {
if (type.Is(Type::Number())) {
return NumberAdd(type, t->cache_->kSingletonOne, t);
}
if (type.Is(Type::BigInt())) {
return Type::BigInt();
}
return Type::Numeric();
}
@ -458,6 +467,9 @@ Type Typer::Visitor::Negate(Type type, Typer* t) {
if (type.Is(Type::Number())) {
return NumberMultiply(type, t->cache_->kSingletonMinusOne, t);
}
if (type.Is(Type::BigInt())) {
return Type::BigInt();
}
return Type::Numeric();
}

View File

@ -0,0 +1,20 @@
// 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 --turbofan --no-always-turbofan
function f() {
let a = 42n;
// JSDecrement should be typed as BigInt.
let b = a--;
let c = -42n && 42n;
// JSDecrement was typed as Numeric instead of BigInt so the node could not
// be eliminated because of possible deoptimization.
let d = c & a;
};
%PrepareFunctionForOptimization(f);
f();
%OptimizeFunctionOnNextCall(f);
f();