summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/passes/Vacuum.cpp13
1 files changed, 13 insertions, 0 deletions
diff --git a/src/passes/Vacuum.cpp b/src/passes/Vacuum.cpp
index 6adab04e9..208e973da 100644
--- a/src/passes/Vacuum.cpp
+++ b/src/passes/Vacuum.cpp
@@ -365,6 +365,19 @@ struct Vacuum : public WalkerPass<ExpressionStackWalker<Vacuum>> {
for (auto* catchBody : curr->catchBodies) {
typeUpdater.noteRecursiveRemoval(catchBody);
}
+ return;
+ }
+
+ // The try's body does throw. However, throwing may be the only thing it
+ // does, and if the try has a catch-all, then the entire try including
+ // children may have no effects. Note that this situation can only happen
+ // if we do have a catch-all, so avoid wasted work by checking that first.
+ // Also, we can't do this if a result is returned, so check the type.
+ if (curr->type == Type::none && curr->hasCatchAll() &&
+ !EffectAnalyzer(getPassOptions(), *getModule(), curr)
+ .hasUnremovableSideEffects()) {
+ typeUpdater.noteRecursiveRemoval(curr);
+ ExpressionManipulator::nop(curr);
}
}