diff options
author | Alon Zakai <alonzakai@gmail.com> | 2016-05-25 17:51:17 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2016-05-25 17:51:17 -0700 |
commit | bbff98549d2c29b050ea1b867c226ec09c9d78f5 (patch) | |
tree | 92c065d7179bcdac6e6c6ca202a55766d1cc05d0 | |
parent | 21d93d50b8eba98ca619897528fb707d1b15e265 (diff) | |
download | binaryen-bbff98549d2c29b050ea1b867c226ec09c9d78f5.tar.gz binaryen-bbff98549d2c29b050ea1b867c226ec09c9d78f5.tar.bz2 binaryen-bbff98549d2c29b050ea1b867c226ec09c9d78f5.zip |
fix a merge-blocks bug where we merged named blocks
-rw-r--r-- | src/passes/MergeBlocks.cpp | 2 | ||||
-rw-r--r-- | test/passes/merge-blocks.txt | 537 | ||||
-rw-r--r-- | test/passes/remove-unused-names_merge-blocks.txt | 425 | ||||
-rw-r--r-- | test/passes/remove-unused-names_merge-blocks.wast (renamed from test/passes/merge-blocks.wast) | 0 |
4 files changed, 426 insertions, 538 deletions
diff --git a/src/passes/MergeBlocks.cpp b/src/passes/MergeBlocks.cpp index 5794e1379..7b9723b0b 100644 --- a/src/passes/MergeBlocks.cpp +++ b/src/passes/MergeBlocks.cpp @@ -100,7 +100,7 @@ struct MergeBlocks : public WalkerPass<PostWalker<MergeBlocks, Visitor<MergeBloc if (dependency1 && *dependency1 && EffectAnalyzer(*dependency1).hasSideEffects()) return outer; if (dependency2 && *dependency2 && EffectAnalyzer(*dependency2).hasSideEffects()) return outer; if (auto* block = child->dynCast<Block>()) { - if (block->list.size() >= 2) { + if (!block->name.is() && block->list.size() >= 2) { child = block->list.back(); if (outer == nullptr) { // reuse the block, move it out diff --git a/test/passes/merge-blocks.txt b/test/passes/merge-blocks.txt deleted file mode 100644 index f5d772c74..000000000 --- a/test/passes/merge-blocks.txt +++ /dev/null @@ -1,537 +0,0 @@ -(module - (memory 256 256) - (type $i (func (param i32))) - (type $ii (func (param i32 i32))) - (type $iii (func (param i32 i32 i32))) - (table $call-i) - (func $call-i (param $0 i32) - (nop) - ) - (func $call-ii (param $0 i32) (param $1 i32) - (nop) - ) - (func $call-iii (param $0 i32) (param $1 i32) (param $2 i32) - (nop) - ) - (func $b0-yes (param $i1 i32) - (block $topmost - (block $block0 - (i32.const 10) - ) - ) - ) - (func $b1-yes (param $i1 i32) - (block $topmost - (block $block0 - (block $block1 - (i32.const 10) - ) - ) - ) - ) - (func $b2-yes (param $i1 i32) - (block $topmost - (i32.const 5) - (block $block0 - (i32.const 10) - ) - (i32.const 15) - ) - ) - (func $b3-yes (param $i1 i32) - (block $topmost - (i32.const 3) - (block $block0 - (i32.const 6) - (block $block1 - (i32.const 10) - ) - (i32.const 15) - ) - (i32.const 20) - ) - ) - (func $b4 (param $i1 i32) - (block $topmost - (block $inner - (i32.const 10) - (br $inner) - ) - ) - ) - (func $b5 (param $i1 i32) - (block $topmost - (block $middle - (block $inner - (i32.const 10) - (br $inner) - ) - (br $middle) - ) - ) - ) - (func $b6 (param $i1 i32) - (block $topmost - (i32.const 5) - (block $inner - (i32.const 10) - (br $inner) - ) - (i32.const 15) - ) - ) - (func $b7 (param $i1 i32) - (block $topmost - (i32.const 3) - (block $middle - (i32.const 6) - (block $inner - (i32.const 10) - (br $inner) - ) - (i32.const 15) - (br $middle) - ) - (i32.const 20) - ) - ) - (func $unary - (local $x i32) - (i32.eqz - (block $block0 - (i32.const 10) - ) - ) - (block $block1 - (i32.const 10) - (i32.eqz - (i32.const 20) - ) - ) - (block $block2 - (i32.const 10) - (i32.const 20) - (i32.eqz - (i32.const 30) - ) - ) - (block $block3 - (i32.const 10) - (set_local $x - (i32.const 20) - ) - ) - (block $block4 - (i32.const 10) - (i32.load - (i32.const 20) - ) - ) - (block $block5 - (i32.const 10) - (return - (unreachable) - ) - ) - ) - (func $binary - (i32.add - (block $block0 - (i32.const 10) - ) - (i32.const 20) - ) - (block $block1 - (i32.const 10) - (i32.add - (i32.const 20) - (i32.const 30) - ) - ) - (block $block2 - (i32.const 10) - (i32.const 20) - (i32.add - (i32.const 30) - (i32.const 40) - ) - ) - (i32.add - (i32.const 10) - (block $block3 - (i32.const 20) - ) - ) - (block $block4 - (i32.const 20) - (i32.add - (i32.const 10) - (i32.const 30) - ) - ) - (block $block5 - (i32.const 20) - (i32.const 30) - (i32.add - (i32.const 10) - (i32.const 40) - ) - ) - (i32.add - (block $block6 - (i32.const 10) - ) - (block $block7 - (i32.const 20) - ) - ) - (block $block8 - (i32.const 10) - (i32.const 30) - (i32.add - (i32.const 20) - (i32.const 40) - ) - ) - (block $block10 - (i32.const 10) - (i32.const 20) - (i32.const 40) - (i32.const 50) - (i32.add - (i32.const 30) - (i32.const 60) - ) - ) - (block $block12 - (i32.const 20) - (i32.store - (i32.const 10) - (i32.const 30) - ) - ) - (block $block13 - (i32.const 10) - (i32.store - (i32.const 20) - (i32.const 30) - ) - ) - (i32.add - (unreachable) - (block $block14 - (i32.const 10) - (i32.const 20) - ) - ) - (block $block15 - (unreachable) - (i32.const 20) - (i32.add - (i32.const 10) - (i32.const 30) - ) - ) - ) - (func $trinary - (block $block0 - (i32.const 10) - (i32.const 30) - (i32.const 50) - (select - (i32.const 20) - (i32.const 40) - (i32.const 60) - ) - ) - (block $block4 - (i32.const 20) - (i32.const 40) - (select - (block $block3 - (i32.const 10) - ) - (i32.const 30) - (i32.const 50) - ) - ) - (block $block6 - (i32.const 10) - (i32.const 40) - (select - (i32.const 20) - (block $block7 - (i32.const 30) - ) - (i32.const 50) - ) - ) - (block $block9 - (i32.const 10) - (i32.const 30) - (select - (i32.const 20) - (i32.const 40) - (block $block11 - (i32.const 50) - ) - ) - ) - (block $block14 - (i32.const 30) - (select - (block $block12 - (i32.const 10) - ) - (block $block13 - (i32.const 20) - ) - (i32.const 40) - ) - ) - (block $block16 - (i32.const 20) - (select - (block $block15 - (i32.const 10) - ) - (i32.const 30) - (block $block17 - (i32.const 40) - ) - ) - ) - (block $block18 - (i32.const 10) - (select - (i32.const 20) - (block $block19 - (i32.const 30) - ) - (block $block20 - (i32.const 40) - ) - ) - ) - (block $block21 - (unreachable) - (i32.const 30) - (i32.const 50) - (select - (i32.const 20) - (i32.const 40) - (i32.const 60) - ) - ) - (block $block24 - (i32.const 10) - (select - (unreachable) - (block $block25 - (i32.const 30) - (i32.const 40) - ) - (block $block26 - (i32.const 50) - (i32.const 60) - ) - ) - ) - (block $block27 - (i32.const 10) - (unreachable) - (i32.const 50) - (select - (i32.const 20) - (i32.const 40) - (i32.const 60) - ) - ) - (block $block30 - (i32.const 10) - (i32.const 30) - (select - (i32.const 20) - (unreachable) - (block $block32 - (i32.const 50) - (i32.const 60) - ) - ) - ) - (block $block33 - (i32.const 10) - (i32.const 30) - (unreachable) - (select - (i32.const 20) - (i32.const 40) - (i32.const 60) - ) - ) - (block $block36 - (i32.const 10) - (i32.const 30) - (i32.const 50) - (select - (i32.const 20) - (i32.const 40) - (unreachable) - ) - ) - ) - (func $breaks - (block $out - (block $block0 - (i32.const 10) - (br $out - (i32.const 20) - ) - ) - (block $block1 - (i32.const 10) - (br_if $out - (i32.const 20) - ) - ) - (block $block2 - (i32.const 10) - (i32.const 30) - (br_if $out - (i32.const 20) - (i32.const 40) - ) - ) - (block $block4 - (i32.const 10) - (br_table $out $out - (i32.const 20) - ) - ) - (block $block5 - (i32.const 10) - (i32.const 30) - (br_table $out $out - (i32.const 20) - (i32.const 40) - ) - ) - ) - ) - (func $calls - (call $call-i - (block $block0 - (i32.const 10) - ) - ) - (block $block1 - (i32.const 10) - (call $call-i - (i32.const 20) - ) - ) - (block $block2 - (i32.const 10) - (i32.const 20) - (call $call-i - (i32.const 30) - ) - ) - (block $block3 - (i32.const 10) - (i32.const 30) - (call $call-ii - (i32.const 20) - (i32.const 40) - ) - ) - (block $block5 - (unreachable) - (i32.const 20) - (call $call-ii - (i32.const 10) - (i32.const 30) - ) - ) - (block $block7 - (i32.const 10) - (call $call-ii - (unreachable) - (block $block8 - (i32.const 20) - (i32.const 30) - ) - ) - ) - (block $block9 - (i32.const 10) - (unreachable) - (call $call-ii - (i32.const 20) - (i32.const 30) - ) - ) - (block $block11 - (i32.const 10) - (i32.const 30) - (call $call-ii - (i32.const 20) - (unreachable) - ) - ) - (block $block13 - (i32.const 10) - (i32.const 30) - (i32.const 50) - (call $call-iii - (i32.const 20) - (i32.const 40) - (i32.const 60) - ) - ) - (block $block16 - (i32.const 10) - (i32.const 40) - (call $call-iii - (i32.const 20) - (i32.const 30) - (i32.const 50) - ) - ) - (block $block18 - (i32.const 10) - (i32.const 30) - (i32.const 50) - (call_indirect $ii - (i32.const 20) - (i32.const 40) - (i32.const 60) - ) - ) - (call_indirect $ii - (unreachable) - (block $block21 - (i32.const 30) - (i32.const 40) - ) - (block $block22 - (i32.const 50) - (i32.const 60) - ) - ) - ) - (func $block-type-change - (local $0 f64) - (local $1 f64) - (if - (block $block0 - (nop) - (f64.gt - (get_local $0) - (get_local $1) - ) - ) - (nop) - ) - ) -) diff --git a/test/passes/remove-unused-names_merge-blocks.txt b/test/passes/remove-unused-names_merge-blocks.txt new file mode 100644 index 000000000..585f079ed --- /dev/null +++ b/test/passes/remove-unused-names_merge-blocks.txt @@ -0,0 +1,425 @@ +(module + (memory 256 256) + (type $i (func (param i32))) + (type $ii (func (param i32 i32))) + (type $iii (func (param i32 i32 i32))) + (table $call-i) + (func $call-i (param $0 i32) + (nop) + ) + (func $call-ii (param $0 i32) (param $1 i32) + (nop) + ) + (func $call-iii (param $0 i32) (param $1 i32) (param $2 i32) + (nop) + ) + (func $b0-yes (param $i1 i32) + (i32.const 10) + ) + (func $b1-yes (param $i1 i32) + (i32.const 10) + ) + (func $b2-yes (param $i1 i32) + (i32.const 5) + (i32.const 10) + (i32.const 15) + ) + (func $b3-yes (param $i1 i32) + (i32.const 3) + (i32.const 6) + (i32.const 10) + (i32.const 15) + (i32.const 20) + ) + (func $b4 (param $i1 i32) + (block $inner + (i32.const 10) + (br $inner) + ) + ) + (func $b5 (param $i1 i32) + (block $middle + (block $inner + (i32.const 10) + (br $inner) + ) + (br $middle) + ) + ) + (func $b6 (param $i1 i32) + (i32.const 5) + (block $inner + (i32.const 10) + (br $inner) + ) + (i32.const 15) + ) + (func $b7 (param $i1 i32) + (i32.const 3) + (block $middle + (i32.const 6) + (block $inner + (i32.const 10) + (br $inner) + ) + (i32.const 15) + (br $middle) + ) + (i32.const 20) + ) + (func $unary + (local $x i32) + (i32.eqz + (block + (i32.const 10) + ) + ) + (i32.const 10) + (i32.eqz + (i32.const 20) + ) + (i32.const 10) + (i32.const 20) + (i32.eqz + (i32.const 30) + ) + (i32.const 10) + (set_local $x + (i32.const 20) + ) + (i32.const 10) + (i32.load + (i32.const 20) + ) + (i32.const 10) + (return + (unreachable) + ) + ) + (func $binary + (i32.add + (block + (i32.const 10) + ) + (i32.const 20) + ) + (i32.const 10) + (i32.add + (i32.const 20) + (i32.const 30) + ) + (i32.const 10) + (i32.const 20) + (i32.add + (i32.const 30) + (i32.const 40) + ) + (i32.add + (i32.const 10) + (block + (i32.const 20) + ) + ) + (i32.const 20) + (i32.add + (i32.const 10) + (i32.const 30) + ) + (i32.const 20) + (i32.const 30) + (i32.add + (i32.const 10) + (i32.const 40) + ) + (i32.add + (block + (i32.const 10) + ) + (block + (i32.const 20) + ) + ) + (i32.const 10) + (i32.const 30) + (i32.add + (i32.const 20) + (i32.const 40) + ) + (i32.const 10) + (i32.const 20) + (i32.const 40) + (i32.const 50) + (i32.add + (i32.const 30) + (i32.const 60) + ) + (i32.const 20) + (i32.store + (i32.const 10) + (i32.const 30) + ) + (i32.const 10) + (i32.store + (i32.const 20) + (i32.const 30) + ) + (i32.add + (unreachable) + (block + (i32.const 10) + (i32.const 20) + ) + ) + (unreachable) + (i32.const 20) + (i32.add + (i32.const 10) + (i32.const 30) + ) + ) + (func $trinary + (i32.const 10) + (i32.const 30) + (i32.const 50) + (select + (i32.const 20) + (i32.const 40) + (i32.const 60) + ) + (i32.const 20) + (i32.const 40) + (select + (block + (i32.const 10) + ) + (i32.const 30) + (i32.const 50) + ) + (i32.const 10) + (i32.const 40) + (select + (i32.const 20) + (block + (i32.const 30) + ) + (i32.const 50) + ) + (i32.const 10) + (i32.const 30) + (select + (i32.const 20) + (i32.const 40) + (block + (i32.const 50) + ) + ) + (i32.const 30) + (select + (block + (i32.const 10) + ) + (block + (i32.const 20) + ) + (i32.const 40) + ) + (i32.const 20) + (select + (block + (i32.const 10) + ) + (i32.const 30) + (block + (i32.const 40) + ) + ) + (i32.const 10) + (select + (i32.const 20) + (block + (i32.const 30) + ) + (block + (i32.const 40) + ) + ) + (unreachable) + (i32.const 30) + (i32.const 50) + (select + (i32.const 20) + (i32.const 40) + (i32.const 60) + ) + (i32.const 10) + (select + (unreachable) + (block + (i32.const 30) + (i32.const 40) + ) + (block + (i32.const 50) + (i32.const 60) + ) + ) + (i32.const 10) + (unreachable) + (i32.const 50) + (select + (i32.const 20) + (i32.const 40) + (i32.const 60) + ) + (i32.const 10) + (i32.const 30) + (select + (i32.const 20) + (unreachable) + (block + (i32.const 50) + (i32.const 60) + ) + ) + (i32.const 10) + (i32.const 30) + (unreachable) + (select + (i32.const 20) + (i32.const 40) + (i32.const 60) + ) + (i32.const 10) + (i32.const 30) + (i32.const 50) + (select + (i32.const 20) + (i32.const 40) + (unreachable) + ) + ) + (func $breaks + (block $out + (i32.const 10) + (br $out + (i32.const 20) + ) + (i32.const 10) + (br_if $out + (i32.const 20) + ) + (i32.const 10) + (i32.const 30) + (br_if $out + (i32.const 20) + (i32.const 40) + ) + (i32.const 10) + (br_table $out $out + (i32.const 20) + ) + (i32.const 10) + (i32.const 30) + (br_table $out $out + (i32.const 20) + (i32.const 40) + ) + ) + ) + (func $calls + (call $call-i + (block + (i32.const 10) + ) + ) + (i32.const 10) + (call $call-i + (i32.const 20) + ) + (i32.const 10) + (i32.const 20) + (call $call-i + (i32.const 30) + ) + (i32.const 10) + (i32.const 30) + (call $call-ii + (i32.const 20) + (i32.const 40) + ) + (unreachable) + (i32.const 20) + (call $call-ii + (i32.const 10) + (i32.const 30) + ) + (i32.const 10) + (call $call-ii + (unreachable) + (block + (i32.const 20) + (i32.const 30) + ) + ) + (i32.const 10) + (unreachable) + (call $call-ii + (i32.const 20) + (i32.const 30) + ) + (i32.const 10) + (i32.const 30) + (call $call-ii + (i32.const 20) + (unreachable) + ) + (i32.const 10) + (i32.const 30) + (i32.const 50) + (call $call-iii + (i32.const 20) + (i32.const 40) + (i32.const 60) + ) + (i32.const 10) + (i32.const 40) + (call $call-iii + (i32.const 20) + (i32.const 30) + (i32.const 50) + ) + (i32.const 10) + (i32.const 30) + (i32.const 50) + (call_indirect $ii + (i32.const 20) + (i32.const 40) + (i32.const 60) + ) + (call_indirect $ii + (unreachable) + (block + (i32.const 30) + (i32.const 40) + ) + (block + (i32.const 50) + (i32.const 60) + ) + ) + ) + (func $block-type-change + (local $0 f64) + (local $1 f64) + (if + (block + (nop) + (f64.gt + (get_local $0) + (get_local $1) + ) + ) + (nop) + ) + ) +) diff --git a/test/passes/merge-blocks.wast b/test/passes/remove-unused-names_merge-blocks.wast index a4a9873e9..a4a9873e9 100644 --- a/test/passes/merge-blocks.wast +++ b/test/passes/remove-unused-names_merge-blocks.wast |