diff --git a/src/compiler/representation-change.cc b/src/compiler/representation-change.cc index 99b3d644ab..9478e1510e 100644 --- a/src/compiler/representation-change.cc +++ b/src/compiler/representation-change.cc @@ -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 || diff --git a/test/mjsunit/regress/regress-1029530.js b/test/mjsunit/regress/regress-1029530.js new file mode 100644 index 0000000000..918a9ecbb4 --- /dev/null +++ b/test/mjsunit/regress/regress-1029530.js @@ -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(); +}