From e17202e4d20bf79bd285425bac606a31bf3a8131 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Sun, 6 Aug 2017 14:00:55 -0700 Subject: properly handle merging of blocks with concrete unreachable elements in the middle --- src/passes/MergeBlocks.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/passes/MergeBlocks.cpp b/src/passes/MergeBlocks.cpp index 1ef34117e..619d7b5a5 100644 --- a/src/passes/MergeBlocks.cpp +++ b/src/passes/MergeBlocks.cpp @@ -220,16 +220,20 @@ static void optimizeBlock(Block* curr, Module* module, PassOptions& passOptions) } for (auto item : child->list) { merged.push_back(item); - if (item->type == unreachable) { - // we don't need anything else from the child, - // and it is always valid to end on an unreachable, - // so stop there (otherwise, we need to be careful) - break; - } } for (size_t j = i + 1; j < curr->list.size(); j++) { merged.push_back(curr->list[j]); } + // if we merged a concrete element in the middle, drop it + if (!merged.empty()) { + auto* last = merged.back(); + for (auto*& item : merged) { + if (item != last && isConcreteWasmType(item->type)) { + Builder builder(*module); + item = builder.makeDrop(item); + } + } + } curr->list.swap(merged); more = true; changed = true; -- cgit v1.2.3