From 429b2611f3a159efe3b27f99be34d7aebe9bf45f Mon Sep 17 00:00:00 2001 From: Max Graey Date: Tue, 25 Aug 2020 00:03:28 +0300 Subject: 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. --- src/passes/OptimizeInstructions.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'src') 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)}); } -- cgit v1.2.3