summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ir/ReFinalize.cpp3
-rw-r--r--src/ir/utils.h14
2 files changed, 17 insertions, 0 deletions
diff --git a/src/ir/ReFinalize.cpp b/src/ir/ReFinalize.cpp
index 422f462c0..6d20d6597 100644
--- a/src/ir/ReFinalize.cpp
+++ b/src/ir/ReFinalize.cpp
@@ -128,6 +128,9 @@ void ReFinalize::visitThrow(Throw* curr) { curr->finalize(); }
void ReFinalize::visitRethrow(Rethrow* curr) { curr->finalize(); }
void ReFinalize::visitBrOnExn(BrOnExn* curr) {
curr->finalize();
+ if (curr->exnref->type == Type::unreachable) {
+ replaceUntaken(curr->exnref, nullptr);
+ }
updateBreakValueType(curr->name, curr->sent);
}
void ReFinalize::visitNop(Nop* curr) { curr->finalize(); }
diff --git a/src/ir/utils.h b/src/ir/utils.h
index b7c5b9cba..7362cbe1a 100644
--- a/src/ir/utils.h
+++ b/src/ir/utils.h
@@ -301,6 +301,20 @@ struct AutoDrop : public WalkerPass<ExpressionStackWalker<AutoDrop>> {
}
}
+ void visitTry(Try* curr) {
+ bool acted = false;
+ if (maybeDrop(curr->body)) {
+ acted = true;
+ }
+ if (maybeDrop(curr->catchBody)) {
+ acted = true;
+ }
+ if (acted) {
+ reFinalize();
+ assert(curr->type == Type::none);
+ }
+ }
+
void doWalkFunction(Function* curr) {
ReFinalize().walkFunctionInModule(curr, getModule());
walk(curr->body);