diff options
-rw-r--r-- | src/passes/RemoveUnusedBrs.cpp | 36 |
1 files changed, 20 insertions, 16 deletions
diff --git a/src/passes/RemoveUnusedBrs.cpp b/src/passes/RemoveUnusedBrs.cpp index 519f0c5a8..c4cb0c554 100644 --- a/src/passes/RemoveUnusedBrs.cpp +++ b/src/passes/RemoveUnusedBrs.cpp @@ -294,6 +294,24 @@ struct RemoveUnusedBrs : public WalkerPass<PostWalker<RemoveUnusedBrs, Visitor<R loops.clear(); if (anotherCycle) worked = true; } while (anotherCycle); + + if (worked) { + // Our work may alter block and if types, they may now return + struct TypeUpdater : public WalkerPass<PostWalker<TypeUpdater, Visitor<TypeUpdater>>> { + void visitBlock(Block* curr) { + curr->finalize(); + } + void visitLoop(Loop* curr) { + curr->finalize(); + } + void visitIf(If* curr) { + curr->finalize(); + } + }; + TypeUpdater typeUpdater; + typeUpdater.walkFunction(func); + } + // perform some final optimizations struct FinalOptimizer : public WalkerPass<PostWalker<FinalOptimizer, Visitor<FinalOptimizer>>> { void visitBlock(Block* curr) { @@ -350,22 +368,6 @@ struct RemoveUnusedBrs : public WalkerPass<PostWalker<RemoveUnusedBrs, Visitor<R FinalOptimizer finalOptimizer; finalOptimizer.setModule(getModule()); finalOptimizer.walkFunction(func); - if (worked) { - // Our work may alter block and if types, they may now return - struct TypeUpdater : public WalkerPass<PostWalker<TypeUpdater, Visitor<TypeUpdater>>> { - void visitBlock(Block* curr) { - curr->finalize(); - } - void visitLoop(Loop* curr) { - curr->finalize(); - } - void visitIf(If* curr) { - curr->finalize(); - } - }; - TypeUpdater typeUpdater; - typeUpdater.walkFunction(func); - } } }; @@ -373,4 +375,6 @@ Pass *createRemoveUnusedBrsPass() { return new RemoveUnusedBrs(); } +// TODO: jump threading, when a jump->jump->target => jump->target + } // namespace wasm |