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 /src | |
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
Diffstat (limited to 'src')
-rw-r--r-- | src/passes/OptimizeInstructions.cpp | 18 |
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()) { |