[turbofan] Fixes rematerialization of truncated BigInts

Bug: chromium:1029530
Change-Id: I12aa4c238387f6a47bf149fd1a136ea83c385f4b
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1962278
Auto-Submit: Nico Hartmann <nicohartmann@chromium.org>
Commit-Queue: Georg Neis <neis@chromium.org>
Reviewed-by: Georg Neis <neis@chromium.org>
Cr-Commit-Position: refs/heads/master@{#65434}
This commit is contained in:
Nico Hartmann 2019-12-12 10:06:19 +01:00 committed by Commit Bot
parent 8e78e4f655
commit 8aa588976a
2 changed files with 49 additions and 0 deletions

View File

@ -175,6 +175,15 @@ Node* RepresentationChanger::GetRepresentationFor(
}
}
// Rematerialize any truncated BigInt if user is not expecting a BigInt.
if (output_type.Is(Type::BigInt()) &&
output_rep == MachineRepresentation::kWord64 &&
use_info.type_check() != TypeCheckKind::kBigInt) {
node =
InsertConversion(node, simplified()->ChangeUint64ToBigInt(), use_node);
output_rep = MachineRepresentation::kTaggedPointer;
}
switch (use_info.representation()) {
case MachineRepresentation::kTaggedSigned:
DCHECK(use_info.type_check() == TypeCheckKind::kNone ||

View File

@ -0,0 +1,40 @@
// 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 --interrupt-budget=1024
{
function f() {
const b = BigInt.asUintN(4,3n);
let i = 0;
while(i < 1) {
i + 1;
i = b;
}
}
%PrepareFunctionForOptimization(f);
f();
f();
%OptimizeFunctionOnNextCall(f);
f();
}
{
function f() {
const b = BigInt.asUintN(4,10n);
let i = 0.1;
while(i < 1.8) {
i + 1;
i = b;
}
}
%PrepareFunctionForOptimization(f);
f();
f();
%OptimizeFunctionOnNextCall(f);
f();
}