From 60003cbc3f5a222d8e20da2db0db41a794fcd957 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 10 Jul 2026 12:52:30 -0700 Subject: [PATCH] wasm-reduce: Fix up EH nested pops when adding blocks --- src/tools/wasm-reduce/wasm-reduce.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/tools/wasm-reduce/wasm-reduce.cpp b/src/tools/wasm-reduce/wasm-reduce.cpp index 4fe986d13c4..42eb113bd34 100644 --- a/src/tools/wasm-reduce/wasm-reduce.cpp +++ b/src/tools/wasm-reduce/wasm-reduce.cpp @@ -28,6 +28,7 @@ #include #include "ir/branch-utils.h" +#include "ir/eh-utils.h" #include "ir/iteration.h" #include "ir/localize.h" #include "ir/properties.h" @@ -1089,9 +1090,13 @@ struct Reducer struct FunctionReplacer : public WalkerPass> { bool isFunctionParallel() override { return true; } + std::unique_ptr create() override { return std::make_unique(); }; + + bool needEHFixups = false; + void visitCall(Call* curr) { // Replace calls to functions we have removed. if (getModule()->getFunctionOrNull(curr->target)) { @@ -1112,6 +1117,9 @@ struct Reducer block->list.push_back(replacement); block->type = originalType; replaceCurrent(block); + // We added a block around content here, possibly causing us to need + // EH fixups later. + needEHFixups = true; } void visitRefFunc(RefFunc* curr) { // Replace references to functions we have removed. @@ -1122,6 +1130,11 @@ struct Reducer replaceCurrent( builder.makeBlock({builder.makeUnreachable()}, curr->type)); } + void visitFunction(Function* curr) { + if (needEHFixups) { + EHUtils::handleBlockNestedPops(curr, *getModule()); + } + } }; PassRunner runner(module.get()); runner.add(std::make_unique());