From d2e2521e55120465549ddbccc4660ff98e929008 Mon Sep 17 00:00:00 2001 From: Max Graey Date: Mon, 24 Aug 2020 18:30:33 +0300 Subject: 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 --- src/passes/OptimizeInstructions.cpp | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) (limited to 'src') 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()) { 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()) { -- cgit v1.2.3