diff options
-rw-r--r-- | src/passes/MergeBlocks.cpp | 8 | ||||
-rw-r--r-- | test/passes/remove-unused-names_merge-blocks.txt | 76 | ||||
-rw-r--r-- | test/passes/remove-unused-names_merge-blocks.wast | 32 |
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) + ) + ) + ) + ) + ) + ) ) |