diff options
author | Max Graey <maxgraey@gmail.com> | 2020-08-25 00:03:28 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-08-24 14:03:28 -0700 |
commit | 429b2611f3a159efe3b27f99be34d7aebe9bf45f (patch) | |
tree | eb94bc1f3d273bf199408d674457fdea02735c56 /src | |
parent | fa43b5070b9c46c88d725ceb76f61340324d2ea0 (diff) | |
download | binaryen-429b2611f3a159efe3b27f99be34d7aebe9bf45f.tar.gz binaryen-429b2611f3a159efe3b27f99be34d7aebe9bf45f.tar.bz2 binaryen-429b2611f3a159efe3b27f99be34d7aebe9bf45f.zip |
also drop size for memory.copy(x, x, y) (#3075)
This fixes a bug in which a side effect in the calculation of the size could be lost.
Diffstat (limited to 'src')
-rw-r--r-- | src/passes/OptimizeInstructions.cpp | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/src/passes/OptimizeInstructions.cpp b/src/passes/OptimizeInstructions.cpp index d43854c28..b4a5b9217 100644 --- a/src/passes/OptimizeInstructions.cpp +++ b/src/passes/OptimizeInstructions.cpp @@ -1403,9 +1403,11 @@ private: if (options.ignoreImplicitTraps) { if (ExpressionAnalyzer::equal(memCopy->dest, memCopy->source)) { + // memory.copy(x, x, sz) ==> {drop(x), drop(x), drop(sz)} Builder builder(*getModule()); - return builder.makeBlock( - {builder.makeDrop(memCopy->dest), builder.makeDrop(memCopy->source)}); + return builder.makeBlock({builder.makeDrop(memCopy->dest), + builder.makeDrop(memCopy->source), + builder.makeDrop(memCopy->size)}); } } @@ -1417,6 +1419,7 @@ private: switch (bytes) { case 0: { if (options.ignoreImplicitTraps) { + // memory.copy(dst, src, 0) ==> {drop(dst), drop(src)} return builder.makeBlock({builder.makeDrop(memCopy->dest), builder.makeDrop(memCopy->source)}); } |