diff options
author | Max Graey <maxgraey@gmail.com> | 2022-01-12 23:44:10 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-01-12 13:44:10 -0800 |
commit | 5cf3521708cfada341285414df2dc7366d7e5454 (patch) | |
tree | 9bbbe36b8f1d4a66813c937f35682ed77a63893c /src | |
parent | 29604f1a7e9ef9dcc2825f076849cd6a452a8a19 (diff) | |
download | binaryen-5cf3521708cfada341285414df2dc7366d7e5454.tar.gz binaryen-5cf3521708cfada341285414df2dc7366d7e5454.tar.bz2 binaryen-5cf3521708cfada341285414df2dc7366d7e5454.zip |
[OptimizeInstructions] Optimize zero sized bulk memory ops even without "ignoreImplicitTraps" (#4295)
Diffstat (limited to 'src')
-rw-r--r-- | src/passes/OptimizeInstructions.cpp | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/src/passes/OptimizeInstructions.cpp b/src/passes/OptimizeInstructions.cpp index 347ebbbe4..6187e2879 100644 --- a/src/passes/OptimizeInstructions.cpp +++ b/src/passes/OptimizeInstructions.cpp @@ -3406,6 +3406,16 @@ private: // memory.copy(dst, src, 0) ==> {drop(dst), drop(src)} return builder.makeBlock({builder.makeDrop(memCopy->dest), builder.makeDrop(memCopy->source)}); + } else { + // memory.copy(dst, src, 0) ==> { + // drop(i32.load8_u(dst)), + // drop(i32.load8_u(src)) + // } + return builder.makeBlock( + {builder.makeDrop( + builder.makeLoad(1, false, 0, 1, memCopy->dest, Type::i32)), + builder.makeDrop(builder.makeLoad( + 1, false, 0, 1, memCopy->source, Type::i32))}); } break; } @@ -3468,11 +3478,17 @@ private: auto* csize = memFill->size->cast<Const>(); auto bytes = csize->value.getInteger(); - if (bytes == 0LL && - (options.ignoreImplicitTraps || options.trapsNeverHappen)) { - // memory.fill(d, v, 0) ==> { drop(d), drop(v) } - return builder.makeBlock( - {builder.makeDrop(memFill->dest), builder.makeDrop(memFill->value)}); + if (bytes == 0LL) { + if (options.ignoreImplicitTraps || options.trapsNeverHappen) { + // memory.fill(d, v, 0) ==> { drop(d), drop(v) } + return builder.makeBlock( + {builder.makeDrop(memFill->dest), builder.makeDrop(memFill->value)}); + } else { + // memory.fill(d, v, 0) ==> { drop(i32.load8_u(d)), drop(v) } + return builder.makeBlock({builder.makeDrop(builder.makeLoad( + 1, false, 0, 1, memFill->dest, Type::i32)), + builder.makeDrop(memFill->value)}); + } } const uint32_t offset = 0, align = 1; |