summaryrefslogtreecommitdiff
path: root/deps/v8/test/mjsunit/wasm/gc-optimizations.js
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/test/mjsunit/wasm/gc-optimizations.js')
-rw-r--r--deps/v8/test/mjsunit/wasm/gc-optimizations.js89
1 files changed, 85 insertions, 4 deletions
diff --git a/deps/v8/test/mjsunit/wasm/gc-optimizations.js b/deps/v8/test/mjsunit/wasm/gc-optimizations.js
index a7ac2e8deb..faa6822b10 100644
--- a/deps/v8/test/mjsunit/wasm/gc-optimizations.js
+++ b/deps/v8/test/mjsunit/wasm/gc-optimizations.js
@@ -2,7 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-// Flags: --experimental-wasm-gc --no-liftoff
+// Flags: --experimental-wasm-gc --no-liftoff --no-wasm-lazy-compilation
+// Flags: --no-wasm-inlining --no-wasm-speculative-inlining
// This tests are meant to examine if Turbofan CsaLoadElimination works
// correctly for wasm. The TurboFan graphs can be examined with --trace-turbo.
@@ -314,6 +315,52 @@ d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js");
assertEquals(value_0 + value_1, instance.exports.main());
})();
+(function WasmLoadEliminationArrayLength() {
+ print(arguments.callee.name);
+
+ let builder = new WasmModuleBuilder();
+ let array = builder.addArray(kWasmI32, true);
+ builder.addFunction("producer", makeSig([kWasmI32], [wasmRefType(array)]))
+ .addBody([kExprLocalGet, 0, kGCPrefix, kExprArrayNewDefault, array])
+ .exportFunc();
+ let side_effect = builder.addFunction("side_effect", kSig_v_v).addBody([]);
+ builder.addFunction("tester", makeSig([wasmRefType(array)], [kWasmI32]))
+ .addBody([kExprLocalGet, 0, kGCPrefix, kExprArrayLen,
+ kExprI32Const, 1, kExprI32Add,
+ kGCPrefix, kExprArrayNewDefault, array,
+ kExprCallFunction, side_effect.index, // unknown side-effect
+ kGCPrefix, kExprArrayLen,
+ kExprLocalGet, 0, kGCPrefix, kExprArrayLen,
+ kExprI32Mul])
+ .exportFunc();
+ let instance = builder.instantiate();
+ assertEquals(10 * 11,
+ instance.exports.tester(instance.exports.producer(10)));
+})();
+
+(function WasmLoadEliminationUnrelatedTypes() {
+ print(arguments.callee.name);
+
+ let builder = new WasmModuleBuilder();
+ let struct1 = builder.addStruct([makeField(kWasmI32, true)]);
+ let struct2 = builder.addStruct([makeField(kWasmI32, true),
+ makeField(kWasmI64, true)]);
+
+ builder.addFunction("tester",
+ makeSig([wasmRefType(struct1), wasmRefType(struct2)], [kWasmI32]))
+ // f(x, y) { y.f = x.f + 10; return y.f * x.f }
+ // x.f load in the state should survive y.f store.
+ .addBody([kExprLocalGet, 1,
+ kExprLocalGet, 0, kGCPrefix, kExprStructGet, struct1, 0,
+ kExprI32Const, 10, kExprI32Add,
+ kGCPrefix, kExprStructSet, struct2, 0,
+ kExprLocalGet, 0, kGCPrefix, kExprStructGet, struct1, 0,
+ kExprLocalGet, 1, kGCPrefix, kExprStructGet, struct2, 0,
+ kExprI32Mul]);
+
+ builder.instantiate()
+})();
+
(function EscapeAnalysisWithLoadElimination() {
print(arguments.callee.name);
@@ -468,9 +515,8 @@ d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js");
.addBody([
// Cast from struct_a to struct_b via common base type struct_super.
kExprLocalGet, 0,
- // TODO(7748): Replace cast op with "ref.cast null".
- kGCPrefix, kExprRefCastDeprecated, struct_super,
- kGCPrefix, kExprRefCastDeprecated, struct_b, // annotated as 'ref null none'
+ kGCPrefix, kExprRefCastNull, struct_super,
+ kGCPrefix, kExprRefCastNull, struct_b, // annotated as 'ref null none'
kExprRefIsNull,
]);
@@ -592,3 +638,38 @@ d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js");
builder.instantiate({});
})();
+
+(function RedundantExternalizeInternalize() {
+ print(arguments.callee.name);
+ let builder = new WasmModuleBuilder();
+ let array = builder.addArray(kWasmI32, true);
+
+ builder.addFunction('createArray',
+ makeSig([kWasmI32], [kWasmExternRef]))
+ .addBody([
+ kExprLocalGet, 0,
+ kGCPrefix, kExprArrayNewFixed, array, 1,
+ kGCPrefix, kExprExternExternalize,
+ ])
+ .exportFunc();
+
+ builder.addFunction('get', makeSig([kWasmExternRef, kWasmI32], [kWasmI32]))
+ .addBody([
+ kExprLocalGet, 0,
+ kGCPrefix, kExprExternInternalize,
+ // The following two operations are optimized away.
+ kGCPrefix, kExprExternExternalize,
+ kGCPrefix, kExprExternInternalize,
+ //
+ kGCPrefix, kExprRefCastNull, array,
+ kExprLocalGet, 1,
+ kGCPrefix, kExprArrayGet, array,
+ ])
+ .exportFunc();
+
+ let instance = builder.instantiate({});
+ let wasm = instance.exports;
+
+ let wasmArray = wasm.createArray(10);
+ assertEquals(10, wasm.get(wasmArray, 0));
+})();