Skip to content

Commit d2e2521

Browse files
authored
memory.copy: use nop reductions only for ignoreImplicitTraps (#3074)
According to changes in spec: WebAssembly/bulk-memory-operations#124 WebAssembly/bulk-memory-operations#145 we unfortunately can't fold to nop even for memory.copy(x, y, 0). So this PR revert all reductions to nop but do this only under ignoreImplicitTraps flag
1 parent 33ccea3 commit d2e2521

5 files changed

+52
-11
lines changed

src/passes/OptimizeInstructions.cpp

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1399,15 +1399,27 @@ struct OptimizeInstructions
13991399
}
14001400

14011401
Expression* optimizeMemoryCopy(MemoryCopy* memCopy) {
1402+
PassOptions options = getPassOptions();
1403+
1404+
if (options.ignoreImplicitTraps) {
1405+
if (ExpressionAnalyzer::equal(memCopy->dest, memCopy->source)) {
1406+
Builder builder(*getModule());
1407+
return builder.makeBlock(
1408+
{builder.makeDrop(memCopy->dest), builder.makeDrop(memCopy->source)});
1409+
}
1410+
}
1411+
14021412
// memory.copy(dst, src, C) ==> store(dst, load(src))
14031413
if (auto* csize = memCopy->size->dynCast<Const>()) {
14041414
auto bytes = csize->value.geti32();
14051415
Builder builder(*getModule());
14061416

14071417
switch (bytes) {
14081418
case 0: {
1409-
return builder.makeBlock({builder.makeDrop(memCopy->dest),
1410-
builder.makeDrop(memCopy->source)});
1419+
if (options.ignoreImplicitTraps) {
1420+
return builder.makeBlock({builder.makeDrop(memCopy->dest),
1421+
builder.makeDrop(memCopy->source)});
1422+
}
14111423
break;
14121424
}
14131425
case 1:
@@ -1431,7 +1443,7 @@ struct OptimizeInstructions
14311443
Type::i64);
14321444
}
14331445
case 16: {
1434-
if (getPassOptions().shrinkLevel == 0) {
1446+
if (options.shrinkLevel == 0) {
14351447
// This adds an extra 2 bytes so apply it only for
14361448
// minimal shrink level
14371449
if (getModule()->features.hasSIMD()) {

test/passes/optimize-instructions_all-features.txt

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3734,13 +3734,10 @@
37343734
(local.get $dst)
37353735
(local.get $sz)
37363736
)
3737-
(block
3738-
(drop
3739-
(local.get $dst)
3740-
)
3741-
(drop
3742-
(local.get $src)
3743-
)
3737+
(memory.copy
3738+
(local.get $dst)
3739+
(local.get $src)
3740+
(i32.const 0)
37443741
)
37453742
(i32.store8
37463743
(local.get $dst)

test/passes/optimize-instructions_all-features.wast

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4240,7 +4240,7 @@
42404240
(local.get $sz)
42414241
)
42424242

4243-
(memory.copy ;; nop
4243+
(memory.copy ;; skip
42444244
(local.get $dst)
42454245
(local.get $src)
42464246
(i32.const 0)

test/passes/optimize-instructions_optimize-level=2_ignore-implicit-traps.txt renamed to test/passes/optimize-instructions_optimize-level=2_all-features_ignore-implicit-traps.txt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
(module
22
(type $i32_i32_=>_i32 (func (param i32 i32) (result i32)))
3+
(type $i32_i32_i32_=>_none (func (param i32 i32 i32)))
34
(type $none_=>_f64 (func (result f64)))
45
(memory $0 0)
56
(func $conditionals (param $0 i32) (param $1 i32) (result i32)
@@ -359,4 +360,22 @@
359360
)
360361
(f64.const -nan:0xfffffffffffff)
361362
)
363+
(func $optimize-bulk-memory-copy (param $dst i32) (param $src i32) (param $sz i32)
364+
(block
365+
(drop
366+
(local.get $dst)
367+
)
368+
(drop
369+
(local.get $dst)
370+
)
371+
)
372+
(block
373+
(drop
374+
(local.get $dst)
375+
)
376+
(drop
377+
(local.get $src)
378+
)
379+
)
380+
)
362381
)

test/passes/optimize-instructions_optimize-level=2_ignore-implicit-traps.wast renamed to test/passes/optimize-instructions_optimize-level=2_all-features_ignore-implicit-traps.wast

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,5 +361,18 @@
361361
)
362362
(f64.const -nan:0xfffffffffffff)
363363
)
364+
(func $optimize-bulk-memory-copy (param $dst i32) (param $src i32) (param $sz i32)
365+
(memory.copy ;; nop
366+
(local.get $dst)
367+
(local.get $dst)
368+
(local.get $sz)
369+
)
370+
371+
(memory.copy ;; nop
372+
(local.get $dst)
373+
(local.get $src)
374+
(i32.const 0)
375+
)
376+
)
364377
)
365378

0 commit comments

Comments
 (0)