diff options
Diffstat (limited to 'src/passes/RemoveUnusedNames.cpp')
-rw-r--r-- | src/passes/RemoveUnusedNames.cpp | 44 |
1 files changed, 15 insertions, 29 deletions
diff --git a/src/passes/RemoveUnusedNames.cpp b/src/passes/RemoveUnusedNames.cpp index d2fc51379..64640aefe 100644 --- a/src/passes/RemoveUnusedNames.cpp +++ b/src/passes/RemoveUnusedNames.cpp @@ -19,12 +19,15 @@ // merge names when possible (by merging their blocks) // +#include <ir/branch-utils.h> #include <pass.h> #include <wasm.h> namespace wasm { -struct RemoveUnusedNames : public WalkerPass<PostWalker<RemoveUnusedNames>> { +struct RemoveUnusedNames + : public WalkerPass<PostWalker<RemoveUnusedNames, + UnifiedExpressionVisitor<RemoveUnusedNames>>> { bool isFunctionParallel() override { return true; } Pass* create() override { return new RemoveUnusedNames; } @@ -33,17 +36,19 @@ struct RemoveUnusedNames : public WalkerPass<PostWalker<RemoveUnusedNames>> { // a parent block, we know if it was branched to std::map<Name, std::set<Expression*>> branchesSeen; - void visitBreak(Break* curr) { branchesSeen[curr->name].insert(curr); } - - void visitSwitch(Switch* curr) { - for (auto name : curr->targets) { - branchesSeen[name].insert(curr); + void visitExpression(Expression* curr) { + if (auto* block = curr->dynCast<Block>()) { + visitBlock(block); + return; + } + if (auto* loop = curr->dynCast<Loop>()) { + visitLoop(loop); + return; } - branchesSeen[curr->default_].insert(curr); + BranchUtils::operateOnScopeNameUses( + curr, [&](Name& name) { branchesSeen[name].insert(curr); }); } - void visitBrOnExn(BrOnExn* curr) { branchesSeen[curr->name].insert(curr); } - void handleBreakTarget(Name& name) { if (name.is()) { if (branchesSeen.find(name) == branchesSeen.end()) { @@ -62,26 +67,7 @@ struct RemoveUnusedNames : public WalkerPass<PostWalker<RemoveUnusedNames>> { // same place as breaking out of us, we just need one name (and block) auto& branches = branchesSeen[curr->name]; for (auto* branch : branches) { - if (Break* br = branch->dynCast<Break>()) { - if (br->name == curr->name) { - br->name = child->name; - } - } else if (Switch* sw = branch->dynCast<Switch>()) { - for (auto& target : sw->targets) { - if (target == curr->name) { - target = child->name; - } - } - if (sw->default_ == curr->name) { - sw->default_ = child->name; - } - } else if (BrOnExn* br = branch->dynCast<BrOnExn>()) { - if (br->name == curr->name) { - br->name = child->name; - } - } else { - WASM_UNREACHABLE("unexpected expr type"); - } + BranchUtils::replacePossibleTarget(branch, curr->name, child->name); } child->finalize(child->type); replaceCurrent(child); |