summaryrefslogtreecommitdiff
path: root/src/passes/RemoveUnusedBrs.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/passes/RemoveUnusedBrs.cpp')
-rw-r--r--src/passes/RemoveUnusedBrs.cpp14
1 files changed, 12 insertions, 2 deletions
diff --git a/src/passes/RemoveUnusedBrs.cpp b/src/passes/RemoveUnusedBrs.cpp
index 96db281d8..44549f68d 100644
--- a/src/passes/RemoveUnusedBrs.cpp
+++ b/src/passes/RemoveUnusedBrs.cpp
@@ -1146,6 +1146,7 @@ struct RemoveUnusedBrs : public WalkerPass<PostWalker<RemoveUnusedBrs>> {
PassOptions& passOptions;
bool needUniqify = false;
+ bool refinalize = false;
FinalOptimizer(PassOptions& passOptions) : passOptions(passOptions) {}
@@ -1419,8 +1420,14 @@ struct RemoveUnusedBrs : public WalkerPass<PostWalker<RemoveUnusedBrs>> {
if (condition.invalidates(ifTrue) || condition.invalidates(ifFalse)) {
return nullptr;
}
- return Builder(*getModule())
- .makeSelect(iff->condition, iff->ifTrue, iff->ifFalse);
+ auto* select = Builder(*getModule())
+ .makeSelect(iff->condition, iff->ifTrue, iff->ifFalse);
+ if (select->type != iff->type) {
+ // If the select is more refined than the if it replaces, we must
+ // propagate that outwards.
+ refinalize = true;
+ }
+ return select;
}
void visitLocalSet(LocalSet* curr) {
@@ -1793,6 +1800,9 @@ struct RemoveUnusedBrs : public WalkerPass<PostWalker<RemoveUnusedBrs>> {
if (finalOptimizer.needUniqify) {
wasm::UniqueNameMapper::uniquify(func->body);
}
+ if (finalOptimizer.refinalize) {
+ ReFinalize().walkFunctionInModule(func, getModule());
+ }
}
};