[compiler][x64] Fix bug in InstructionSelector::ChangeInt32ToInt64
Bug: chromium:1196683 Change-Id: Ib4ea738b47b64edc81450583be4c80a41698c3d1 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2820971 Commit-Queue: Georg Neis <neis@chromium.org> Reviewed-by: Nico Hartmann <nicohartmann@chromium.org> Cr-Commit-Position: refs/heads/master@{#73903}
This commit is contained in:
parent
1e4b1c521a
commit
02f84c745f
@ -1376,7 +1376,9 @@ void InstructionSelector::VisitChangeInt32ToInt64(Node* node) {
|
||||
opcode = load_rep.IsSigned() ? kX64Movsxwq : kX64Movzxwq;
|
||||
break;
|
||||
case MachineRepresentation::kWord32:
|
||||
opcode = load_rep.IsSigned() ? kX64Movsxlq : kX64Movl;
|
||||
// ChangeInt32ToInt64 must interpret its input as a _signed_ 32-bit
|
||||
// integer, so here we must sign-extend the loaded value in any case.
|
||||
opcode = kX64Movsxlq;
|
||||
break;
|
||||
default:
|
||||
UNREACHABLE();
|
||||
|
56
test/mjsunit/compiler/regress-1196683.js
Normal file
56
test/mjsunit/compiler/regress-1196683.js
Normal file
@ -0,0 +1,56 @@
|
||||
// Copyright 2021 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
|
||||
|
||||
|
||||
(function() {
|
||||
const arr = new Uint32Array([2**31]);
|
||||
function foo() {
|
||||
return (arr[0] ^ 0) + 1;
|
||||
}
|
||||
%PrepareFunctionForOptimization(foo);
|
||||
assertEquals(-(2**31) + 1, foo());
|
||||
%OptimizeFunctionOnNextCall(foo);
|
||||
assertEquals(-(2**31) + 1, foo());
|
||||
});
|
||||
|
||||
|
||||
// The remaining tests already passed without the bugfix.
|
||||
|
||||
|
||||
(function() {
|
||||
const arr = new Uint16Array([2**15]);
|
||||
function foo() {
|
||||
return (arr[0] ^ 0) + 1;
|
||||
}
|
||||
%PrepareFunctionForOptimization(foo);
|
||||
assertEquals(2**15 + 1, foo());
|
||||
%OptimizeFunctionOnNextCall(foo);
|
||||
assertEquals(2**15 + 1, foo());
|
||||
})();
|
||||
|
||||
|
||||
(function() {
|
||||
const arr = new Uint8Array([2**7]);
|
||||
function foo() {
|
||||
return (arr[0] ^ 0) + 1;
|
||||
}
|
||||
%PrepareFunctionForOptimization(foo);
|
||||
assertEquals(2**7 + 1, foo());
|
||||
%OptimizeFunctionOnNextCall(foo);
|
||||
assertEquals(2**7 + 1, foo());
|
||||
})();
|
||||
|
||||
|
||||
(function() {
|
||||
const arr = new Int32Array([-(2**31)]);
|
||||
function foo() {
|
||||
return (arr[0] >>> 0) + 1;
|
||||
}
|
||||
%PrepareFunctionForOptimization(foo);
|
||||
assertEquals(2**31 + 1, foo());
|
||||
%OptimizeFunctionOnNextCall(foo);
|
||||
assertEquals(2**31 + 1, foo());
|
||||
})();
|
Loading…
Reference in New Issue
Block a user