[arm64] Fix UNREACHABLE in instruction selector
This ports crrev.com/c/4258648 to arm64.
Bug: v8:13700
Change-Id: If00bb492ea54ef5819835e7415294738a7ff3040
Fixed: chromium:1428537
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/4416016
Reviewed-by: Tobias Tebbi <tebbi@chromium.org>
Commit-Queue: Tobias Tebbi <tebbi@chromium.org>
Auto-Submit: Jakob Kummerow <jkummerow@chromium.org>
Cr-Commit-Position: refs/heads/main@{#87032}
diff --git a/src/compiler/backend/arm64/instruction-selector-arm64.cc b/src/compiler/backend/arm64/instruction-selector-arm64.cc
index f8cbca8..3afbdc3 100644
--- a/src/compiler/backend/arm64/instruction-selector-arm64.cc
+++ b/src/compiler/backend/arm64/instruction-selector-arm64.cc
@@ -2109,6 +2109,10 @@
immediate_mode = kLoadStoreImm16;
break;
case MachineRepresentation::kWord32:
+ case MachineRepresentation::kWord64:
+ // Since BitcastElider may remove nodes of
+ // IrOpcode::kTruncateInt64ToInt32 and directly use the inputs, values
+ // with kWord64 can also reach this line.
case MachineRepresentation::kTaggedSigned:
case MachineRepresentation::kTagged:
opcode = kArm64Ldrsw;
diff --git a/src/compiler/backend/x64/instruction-selector-x64.cc b/src/compiler/backend/x64/instruction-selector-x64.cc
index 164b69d..f1f83cc 100644
--- a/src/compiler/backend/x64/instruction-selector-x64.cc
+++ b/src/compiler/backend/x64/instruction-selector-x64.cc
@@ -1713,7 +1713,7 @@
break;
case MachineRepresentation::kWord32:
case MachineRepresentation::kWord64:
- // While BitcastElider may remove nodes of
+ // Since BitcastElider may remove nodes of
// IrOpcode::kTruncateInt64ToInt32 and directly use the inputs, values
// with kWord64 can also reach this line.
case MachineRepresentation::kTaggedSigned:
diff --git a/test/mjsunit/regress/wasm/regress-13700.js b/test/mjsunit/regress/wasm/regress-13700.js
index 03f5fa8..8855d80 100644
--- a/test/mjsunit/regress/wasm/regress-13700.js
+++ b/test/mjsunit/regress/wasm/regress-13700.js
@@ -10,7 +10,7 @@
let expects = [0n, 1234n, 0n, -1n];
for (let i = 0; i < bases.length; ++i) {
- var builder = new WasmModuleBuilder();
+ let builder = new WasmModuleBuilder();
let g0 = builder.addImportedGlobal("mod", "g0", kWasmI64, true);
builder.addExportOfKind('g0', kExternalGlobal, g0);
@@ -22,10 +22,30 @@
kExprGlobalSet, g0,
]).exportAs("trunci64");
- var to_imported = new WebAssembly.Global({value: "i64", mutable: true}, bases[i]);
- var instance = builder.instantiate({mod: { g0: to_imported }});
+ let to_imported =
+ new WebAssembly.Global({value: 'i64', mutable: true}, bases[i]);
+ let instance = builder.instantiate({mod: { g0: to_imported }});
assertEquals(bases[i], instance.exports.g0.value);
instance.exports.trunci64();
assertEquals(expects[i], instance.exports.g0.value);
}
+
+for (let i = 0; i < bases.length; ++i) {
+ let builder = new WasmModuleBuilder();
+ builder.addMemory(1, 1, true);
+
+ builder.addFunction("trunci64", kSig_l_v).exportFunc().addBody([
+ kExprI32Const, 0, // address for load: 0
+ kExprI64LoadMem, 0, 0, // alignment 0, offset 0
+ kExprI32ConvertI64,
+ kExprI64SConvertI32,
+ ]);
+
+ let instance = builder.instantiate();
+
+ let mem = new BigInt64Array(instance.exports.memory.buffer);
+ mem[0] = bases[i];
+ let result = instance.exports.trunci64();
+ assertEquals(result, expects[i]);
+}