From 6159fb42fcd2dae593ee61ebb7e3e163445ae9d0 Mon Sep 17 00:00:00 2001 From: "Alon Zakai (kripken)" Date: Tue, 11 Jul 2017 09:45:10 -0700 Subject: fix handling of unreachable br values in merge-blocks --- src/passes/MergeBlocks.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/passes/MergeBlocks.cpp b/src/passes/MergeBlocks.cpp index 8ffbb345d..2c983d991 100644 --- a/src/passes/MergeBlocks.cpp +++ b/src/passes/MergeBlocks.cpp @@ -122,6 +122,11 @@ struct BreakValueDropper : public ControlFlowWalker { if (curr->value && curr->name == origin) { Builder builder(*getModule()); auto* value = curr->value; + if (value->type == unreachable) { + // the break isn't even reached + replaceCurrent(value); + return; + } curr->value = nullptr; curr->finalize(); replaceCurrent(builder.makeSequence(builder.makeDrop(value), curr)); @@ -130,7 +135,8 @@ struct BreakValueDropper : public ControlFlowWalker { void visitDrop(Drop* curr) { // if we dropped a br_if whose value we removed, then we are now dropping a (block (drop value) (br_if)) with type none, which does not need a drop - if (curr->value->type == none) { + // likewise, unreachable does not need to be dropped, so we just leave drops of concrete values + if (!isConcreteWasmType(curr->value->type)) { replaceCurrent(curr->value); } } -- cgit v1.2.3