99df710d4c
This change implements lowering of speculative BigInt addition as well as BigInt heap constants to corresponding int64 versions, if they are used in a context where the result is truncated to the least significant 64 bits (e.g. using asUintN). The JSHeapBroker is extended to provide access to the BigInt's least significant digit during concurrent compilation. The BigInt context (required to introduce correct conversions) is recognized in the RepresentationChanger by either the output type propagated downward or the TypeCheckKind propagated upward. This is necessary, because the TypeCheckKind may only be set by nodes that may potentially deopt (and sit in the effect chain). This is the case for SpeculativeBigIntAdd, but not for BigIntAsUintN. This CL contains a simple fix to prevent int64-lowered BigInts to flow into state values as the deoptimizer cannot handle them yet. A more sophisticated solution to allow the deoptimizer to materialize truncated BigInts will be added in a following CL. Bug: v8:9407 Change-Id: I96a293e9077962f53e5f199857644f004e3ae56e Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1684183 Commit-Queue: Nico Hartmann <nicohartmann@google.com> Reviewed-by: Georg Neis <neis@chromium.org> Reviewed-by: Sigurd Schneider <sigurds@chromium.org> Reviewed-by: Maya Lekova <mslekova@chromium.org> Cr-Commit-Position: refs/heads/master@{#62665}
37 lines
909 B
JavaScript
37 lines
909 B
JavaScript
// Copyright 2019 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 --no-always-opt
|
|
|
|
|
|
const big = 2n ** BigInt((2 ** 30)-1);
|
|
|
|
|
|
function testAdd(x, y) {
|
|
return x + y;
|
|
}
|
|
|
|
|
|
%PrepareFunctionForOptimization(testAdd);
|
|
testAdd(3n, 7n);
|
|
testAdd(17n, -54n);
|
|
%OptimizeFunctionOnNextCall(testAdd);
|
|
assertEquals(testAdd(6n, 2n), 8n);
|
|
assertOptimized(testAdd);
|
|
|
|
assertThrows(() => testAdd(big, big), RangeError);
|
|
assertUnoptimized(testAdd);
|
|
|
|
%PrepareFunctionForOptimization(testAdd);
|
|
testAdd(30n, -50n);
|
|
testAdd(23n, 5n);
|
|
%OptimizeFunctionOnNextCall(testAdd);
|
|
assertEquals(testAdd(-7n, -12n), -19n);
|
|
assertOptimized(testAdd);
|
|
|
|
assertThrows(() => testAdd(big, big), RangeError);
|
|
assertOptimized(testAdd);
|
|
assertThrows(() => testAdd(big, big), RangeError);
|
|
assertOptimized(testAdd);
|