diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/wasm-ir-builder.h | 7 | ||||
-rw-r--r-- | src/wasm/wasm-ir-builder.cpp | 6 |
2 files changed, 9 insertions, 4 deletions
diff --git a/src/wasm-ir-builder.h b/src/wasm-ir-builder.h index d6e453149..30e770e28 100644 --- a/src/wasm-ir-builder.h +++ b/src/wasm-ir-builder.h @@ -507,16 +507,19 @@ private: // its stack. std::unordered_map<Name, std::vector<Index>> labelDepths; - Name makeFresh(Name label) { + Name makeFresh(Name label, Index hint = 0) { return Names::getValidName( label, [&](Name candidate) { return labelDepths.insert({candidate, {}}).second; }, - 0, + hint, ""); } + Index blockHint = 0; + Index labelHint = 0; + void pushScope(ScopeCtx scope) { if (auto label = scope.getOriginalLabel()) { // Assign a fresh label to the scope, if necessary. diff --git a/src/wasm/wasm-ir-builder.cpp b/src/wasm/wasm-ir-builder.cpp index 5253c91ee..a73c7f2ac 100644 --- a/src/wasm/wasm-ir-builder.cpp +++ b/src/wasm/wasm-ir-builder.cpp @@ -987,6 +987,8 @@ Result<> IRBuilder::visitEnd() { EHUtils::handleBlockNestedPops(func, wasm); } this->func = nullptr; + blockHint = 0; + labelHint = 0; } else if (auto* block = scope.getBlock()) { assert(*expr == block); block->name = scope.label; @@ -1073,9 +1075,9 @@ Result<Name> IRBuilder::getLabelName(Index label, bool forDelegate) { if (!scopeLabel) { // The scope does not already have a name, so we need to create one. if ((*scope)->getBlock()) { - scopeLabel = makeFresh("block"); + scopeLabel = makeFresh("block", blockHint++); } else { - scopeLabel = makeFresh("label"); + scopeLabel = makeFresh("label", labelHint++); } } if (!forDelegate) { |