diff options
Diffstat (limited to 'src/wasm/wasm-ir-builder.cpp')
-rw-r--r-- | src/wasm/wasm-ir-builder.cpp | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/src/wasm/wasm-ir-builder.cpp b/src/wasm/wasm-ir-builder.cpp index 6322a5786..91e990180 100644 --- a/src/wasm/wasm-ir-builder.cpp +++ b/src/wasm/wasm-ir-builder.cpp @@ -929,13 +929,18 @@ Result<> IRBuilder::visitEnd() { auto maybeWrapForLabel = [&](Expression* curr) -> Expression* { bool isTry = scope.getTry() || scope.getCatch() || scope.getCatchAll(); auto& label = isTry ? scope.branchLabel : scope.label; - if (label) { - return builder.makeBlock(label, - {curr}, - scope.labelUsed ? originalScopeType - : scope.getResultType()); + if (!label) { + return curr; } - return curr; + auto blockType = + scope.labelUsed ? originalScopeType : scope.getResultType(); + // We can re-use unnamed blocks instead of wrapping them. + if (auto* block = curr->dynCast<Block>(); block && !block->name) { + block->name = label; + block->type = blockType; + return block; + } + return builder.makeBlock(label, {curr}, blockType); }; if (auto* func = scope.getFunction()) { |