diff options
author | Max Graey <maxgraey@gmail.com> | 2020-08-24 18:30:33 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-08-24 08:30:33 -0700 |
commit | d2e2521e55120465549ddbccc4660ff98e929008 (patch) | |
tree | b03bad00edbc3ffa06e28be227d14816d657d4ed | |
parent | 33ccea3bdcb82f638c888b36bb779291d04568f3 (diff) | |
download | binaryen-d2e2521e55120465549ddbccc4660ff98e929008.tar.gz binaryen-d2e2521e55120465549ddbccc4660ff98e929008.tar.bz2 binaryen-d2e2521e55120465549ddbccc4660ff98e929008.zip |
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
-rw-r--r-- | src/passes/OptimizeInstructions.cpp | 18 | ||||
-rw-r--r-- | test/passes/optimize-instructions_all-features.txt | 11 | ||||
-rw-r--r-- | test/passes/optimize-instructions_all-features.wast | 2 | ||||
-rw-r--r-- | test/passes/optimize-instructions_optimize-level=2_all-features_ignore-implicit-traps.txt (renamed from test/passes/optimize-instructions_optimize-level=2_ignore-implicit-traps.txt) | 19 | ||||
-rw-r--r-- | test/passes/optimize-instructions_optimize-level=2_all-features_ignore-implicit-traps.wast (renamed from test/passes/optimize-instructions_optimize-level=2_ignore-implicit-traps.wast) | 13 |
5 files changed, 52 insertions, 11 deletions
diff --git a/src/passes/OptimizeInstructions.cpp b/src/passes/OptimizeInstructions.cpp index 78cdc4718..d43854c28 100644 --- a/src/passes/OptimizeInstructions.cpp +++ b/src/passes/OptimizeInstructions.cpp @@ -1399,6 +1399,16 @@ private: } Expression* optimizeMemoryCopy(MemoryCopy* memCopy) { + PassOptions options = getPassOptions(); + + if (options.ignoreImplicitTraps) { + if (ExpressionAnalyzer::equal(memCopy->dest, memCopy->source)) { + Builder builder(*getModule()); + return builder.makeBlock( + {builder.makeDrop(memCopy->dest), builder.makeDrop(memCopy->source)}); + } + } + // memory.copy(dst, src, C) ==> store(dst, load(src)) if (auto* csize = memCopy->size->dynCast<Const>()) { auto bytes = csize->value.geti32(); @@ -1406,8 +1416,10 @@ private: switch (bytes) { case 0: { - return builder.makeBlock({builder.makeDrop(memCopy->dest), - builder.makeDrop(memCopy->source)}); + if (options.ignoreImplicitTraps) { + return builder.makeBlock({builder.makeDrop(memCopy->dest), + builder.makeDrop(memCopy->source)}); + } break; } case 1: @@ -1431,7 +1443,7 @@ private: Type::i64); } case 16: { - if (getPassOptions().shrinkLevel == 0) { + if (options.shrinkLevel == 0) { // This adds an extra 2 bytes so apply it only for // minimal shrink level if (getModule()->features.hasSIMD()) { diff --git a/test/passes/optimize-instructions_all-features.txt b/test/passes/optimize-instructions_all-features.txt index e865fd9f8..2aaba9071 100644 --- a/test/passes/optimize-instructions_all-features.txt +++ b/test/passes/optimize-instructions_all-features.txt @@ -3734,13 +3734,10 @@ (local.get $dst) (local.get $sz) ) - (block - (drop - (local.get $dst) - ) - (drop - (local.get $src) - ) + (memory.copy + (local.get $dst) + (local.get $src) + (i32.const 0) ) (i32.store8 (local.get $dst) diff --git a/test/passes/optimize-instructions_all-features.wast b/test/passes/optimize-instructions_all-features.wast index 9a560fc91..e336ac2f9 100644 --- a/test/passes/optimize-instructions_all-features.wast +++ b/test/passes/optimize-instructions_all-features.wast @@ -4240,7 +4240,7 @@ (local.get $sz) ) - (memory.copy ;; nop + (memory.copy ;; skip (local.get $dst) (local.get $src) (i32.const 0) diff --git a/test/passes/optimize-instructions_optimize-level=2_ignore-implicit-traps.txt b/test/passes/optimize-instructions_optimize-level=2_all-features_ignore-implicit-traps.txt index c5e21b86b..ee14c6e61 100644 --- a/test/passes/optimize-instructions_optimize-level=2_ignore-implicit-traps.txt +++ b/test/passes/optimize-instructions_optimize-level=2_all-features_ignore-implicit-traps.txt @@ -1,5 +1,6 @@ (module (type $i32_i32_=>_i32 (func (param i32 i32) (result i32))) + (type $i32_i32_i32_=>_none (func (param i32 i32 i32))) (type $none_=>_f64 (func (result f64))) (memory $0 0) (func $conditionals (param $0 i32) (param $1 i32) (result i32) @@ -359,4 +360,22 @@ ) (f64.const -nan:0xfffffffffffff) ) + (func $optimize-bulk-memory-copy (param $dst i32) (param $src i32) (param $sz i32) + (block + (drop + (local.get $dst) + ) + (drop + (local.get $dst) + ) + ) + (block + (drop + (local.get $dst) + ) + (drop + (local.get $src) + ) + ) + ) ) diff --git a/test/passes/optimize-instructions_optimize-level=2_ignore-implicit-traps.wast b/test/passes/optimize-instructions_optimize-level=2_all-features_ignore-implicit-traps.wast index 802ca1875..b97597582 100644 --- a/test/passes/optimize-instructions_optimize-level=2_ignore-implicit-traps.wast +++ b/test/passes/optimize-instructions_optimize-level=2_all-features_ignore-implicit-traps.wast @@ -361,5 +361,18 @@ ) (f64.const -nan:0xfffffffffffff) ) + (func $optimize-bulk-memory-copy (param $dst i32) (param $src i32) (param $sz i32) + (memory.copy ;; nop + (local.get $dst) + (local.get $dst) + (local.get $sz) + ) + + (memory.copy ;; nop + (local.get $dst) + (local.get $src) + (i32.const 0) + ) + ) ) |