diff options
-rw-r--r-- | src/passes/OptimizeInstructions.cpp | 2 | ||||
-rw-r--r-- | test/passes/optimize-instructions_all-features.txt | 7 | ||||
-rw-r--r-- | test/passes/optimize-instructions_all-features.wast | 10 |
3 files changed, 18 insertions, 1 deletions
diff --git a/src/passes/OptimizeInstructions.cpp b/src/passes/OptimizeInstructions.cpp index b8f038dac..b7bbebf89 100644 --- a/src/passes/OptimizeInstructions.cpp +++ b/src/passes/OptimizeInstructions.cpp @@ -1404,6 +1404,8 @@ private: // memory.copy(x, x, sz) ==> nop if (!EffectAnalyzer(getPassOptions(), features, memCopy->dest) .hasSideEffects() && + !EffectAnalyzer(getPassOptions(), features, memCopy->size) + .hasSideEffects() && ExpressionAnalyzer::equal(memCopy->dest, memCopy->source)) { return ExpressionManipulator::nop(memCopy); } diff --git a/test/passes/optimize-instructions_all-features.txt b/test/passes/optimize-instructions_all-features.txt index b97106f2d..509a7825d 100644 --- a/test/passes/optimize-instructions_all-features.txt +++ b/test/passes/optimize-instructions_all-features.txt @@ -3793,6 +3793,13 @@ (local.get $src) (local.get $sz) ) + (memory.copy + (i32.const 0) + (i32.const 0) + (i32.load + (i32.const 3) + ) + ) ) ) (module diff --git a/test/passes/optimize-instructions_all-features.wast b/test/passes/optimize-instructions_all-features.wast index b62ecdcfd..7a37b366c 100644 --- a/test/passes/optimize-instructions_all-features.wast +++ b/test/passes/optimize-instructions_all-features.wast @@ -4294,7 +4294,7 @@ (i32.const 8) ) - (memory.copy + (memory.copy (local.get $dst) (local.get $src) (i32.const 16) @@ -4305,6 +4305,14 @@ (local.get $src) (local.get $sz) ) + + (memory.copy ;; skip + (i32.const 0) + (i32.const 0) + (i32.load + (i32.const 3) ;; side effect + ) + ) ) ) (module |