summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/passes/OptimizeInstructions.cpp2
-rw-r--r--test/passes/optimize-instructions_all-features.txt7
-rw-r--r--test/passes/optimize-instructions_all-features.wast10
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