summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/passes/MergeBlocks.cpp8
-rw-r--r--test/passes/remove-unused-names_merge-blocks.txt76
-rw-r--r--test/passes/remove-unused-names_merge-blocks.wast32
3 files changed, 98 insertions, 18 deletions
diff --git a/src/passes/MergeBlocks.cpp b/src/passes/MergeBlocks.cpp
index 95d680ec7..467ffb4ed 100644
--- a/src/passes/MergeBlocks.cpp
+++ b/src/passes/MergeBlocks.cpp
@@ -214,8 +214,12 @@ struct MergeBlocks : public WalkerPass<PostWalker<MergeBlocks, Visitor<MergeBloc
Block* optimize(Expression* curr, Expression*& child, Block* outer = nullptr, Expression** dependency1 = nullptr, Expression** dependency2 = nullptr) {
if (!child) return outer;
- if (dependency1 && *dependency1 && EffectAnalyzer(*dependency1).hasSideEffects()) return outer;
- if (dependency2 && *dependency2 && EffectAnalyzer(*dependency2).hasSideEffects()) return outer;
+ if ((dependency1 && *dependency1) || (dependency2 && *dependency2)) {
+ // there are dependencies, things we must be reordered through. make sure no problems there
+ EffectAnalyzer childEffects(child);
+ if (dependency1 && *dependency1 && EffectAnalyzer(*dependency1).invalidates(childEffects)) return outer;
+ if (dependency2 && *dependency2 && EffectAnalyzer(*dependency2).invalidates(childEffects)) return outer;
+ }
if (auto* block = child->dynCast<Block>()) {
if (!block->name.is() && block->list.size() >= 2) {
child = block->list.back();
diff --git a/test/passes/remove-unused-names_merge-blocks.txt b/test/passes/remove-unused-names_merge-blocks.txt
index 0d13bcaa3..413fe32c2 100644
--- a/test/passes/remove-unused-names_merge-blocks.txt
+++ b/test/passes/remove-unused-names_merge-blocks.txt
@@ -447,27 +447,33 @@
(drop
(i32.const 10)
)
- (unreachable)
- (drop
- (i32.const 50)
- )
(drop
(select
(i32.const 20)
- (i32.const 40)
- (i32.const 60)
+ (block i32
+ (unreachable)
+ (i32.const 40)
+ )
+ (block i32
+ (drop
+ (i32.const 50)
+ )
+ (i32.const 60)
+ )
)
)
(drop
(i32.const 10)
)
(drop
- (i32.const 30)
- )
- (drop
(select
(i32.const 20)
- (unreachable)
+ (block i32
+ (drop
+ (i32.const 30)
+ )
+ (unreachable)
+ )
(block i32
(drop
(i32.const 50)
@@ -482,12 +488,14 @@
(drop
(i32.const 30)
)
- (unreachable)
(drop
(select
(i32.const 20)
(i32.const 40)
- (i32.const 60)
+ (block i32
+ (unreachable)
+ (i32.const 60)
+ )
)
)
(drop
@@ -497,13 +505,15 @@
(i32.const 30)
)
(drop
- (i32.const 50)
- )
- (drop
(select
(i32.const 20)
(i32.const 40)
- (unreachable)
+ (block i32
+ (drop
+ (i32.const 50)
+ )
+ (unreachable)
+ )
)
)
)
@@ -693,4 +703,38 @@
(nop)
)
)
+ (func $do-reorder (type $i) (param $x i32)
+ (local $y i32)
+ (if
+ (i32.const 1)
+ (block
+ (set_local $y
+ (i32.const 5)
+ )
+ (set_local $x
+ (i32.le_u
+ (get_local $x)
+ (i32.const 10)
+ )
+ )
+ )
+ )
+ )
+ (func $do-not-reorder (type $i) (param $x i32)
+ (local $y i32)
+ (if
+ (i32.const 1)
+ (set_local $x
+ (i32.le_u
+ (get_local $y)
+ (block i32
+ (set_local $y
+ (i32.const 5)
+ )
+ (i32.const 10)
+ )
+ )
+ )
+ )
+ )
)
diff --git a/test/passes/remove-unused-names_merge-blocks.wast b/test/passes/remove-unused-names_merge-blocks.wast
index 895eae2aa..2127f4cef 100644
--- a/test/passes/remove-unused-names_merge-blocks.wast
+++ b/test/passes/remove-unused-names_merge-blocks.wast
@@ -869,4 +869,36 @@
(nop)
)
)
+ (func $do-reorder (param $x i32)
+ (local $y i32)
+ (if (i32.const 1)
+ (block
+ (set_local $x
+ (i32.le_u
+ (get_local $x)
+ (block i32
+ (set_local $y (i32.const 5))
+ (i32.const 10)
+ )
+ )
+ )
+ )
+ )
+ )
+ (func $do-not-reorder (param $x i32)
+ (local $y i32)
+ (if (i32.const 1)
+ (block
+ (set_local $x
+ (i32.le_u
+ (get_local $y)
+ (block i32
+ (set_local $y (i32.const 5))
+ (i32.const 10)
+ )
+ )
+ )
+ )
+ )
+ )
)