summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Graey <maxgraey@gmail.com>2020-08-24 18:30:33 +0300
committerGitHub <noreply@github.com>2020-08-24 08:30:33 -0700
commitd2e2521e55120465549ddbccc4660ff98e929008 (patch)
treeb03bad00edbc3ffa06e28be227d14816d657d4ed
parent33ccea3bdcb82f638c888b36bb779291d04568f3 (diff)
downloadbinaryen-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.cpp18
-rw-r--r--test/passes/optimize-instructions_all-features.txt11
-rw-r--r--test/passes/optimize-instructions_all-features.wast2
-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)
+ )
+ )
)