summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMax Graey <maxgraey@gmail.com>2020-08-25 00:03:28 +0300
committerGitHub <noreply@github.com>2020-08-24 14:03:28 -0700
commit429b2611f3a159efe3b27f99be34d7aebe9bf45f (patch)
treeeb94bc1f3d273bf199408d674457fdea02735c56 /src
parentfa43b5070b9c46c88d725ceb76f61340324d2ea0 (diff)
downloadbinaryen-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.cpp7
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)});
}