summaryrefslogtreecommitdiff
path: root/src
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 /src
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
Diffstat (limited to 'src')
-rw-r--r--src/passes/OptimizeInstructions.cpp18
1 files changed, 15 insertions, 3 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()) {