summaryrefslogtreecommitdiff
path: root/src/ir
diff options
context:
space:
mode:
Diffstat (limited to 'src/ir')
-rw-r--r--src/ir/ReFinalize.cpp6
-rw-r--r--src/ir/branch-utils.h2
-rw-r--r--src/ir/cost.h4
-rw-r--r--src/ir/effects.h2
4 files changed, 11 insertions, 3 deletions
diff --git a/src/ir/ReFinalize.cpp b/src/ir/ReFinalize.cpp
index 54dde65bc..b3639ba00 100644
--- a/src/ir/ReFinalize.cpp
+++ b/src/ir/ReFinalize.cpp
@@ -155,7 +155,11 @@ void ReFinalize::visitRefTest(RefTest* curr) { curr->finalize(); }
void ReFinalize::visitRefCast(RefCast* curr) { curr->finalize(); }
void ReFinalize::visitBrOnCast(BrOnCast* curr) {
curr->finalize();
- WASM_UNREACHABLE("TODO (gc): br_on_cast");
+ if (curr->type == Type::unreachable) {
+ replaceUntaken(curr->ref, nullptr);
+ } else {
+ updateBreakValueType(curr->name, curr->getCastType());
+ }
}
void ReFinalize::visitRttCanon(RttCanon* curr) { curr->finalize(); }
void ReFinalize::visitRttSub(RttSub* curr) { curr->finalize(); }
diff --git a/src/ir/branch-utils.h b/src/ir/branch-utils.h
index 6dfe216a2..d7a6edcae 100644
--- a/src/ir/branch-utils.h
+++ b/src/ir/branch-utils.h
@@ -81,6 +81,8 @@ void operateOnScopeNameUsesAndSentTypes(Expression* expr, T func) {
func(name, sw->value ? sw->value->type : Type::none);
} else if (auto* br = expr->dynCast<BrOnExn>()) {
func(name, br->sent);
+ } else if (auto* br = expr->dynCast<BrOnCast>()) {
+ func(name, br->getCastType());
} else {
WASM_UNREACHABLE("bad br type");
}
diff --git a/src/ir/cost.h b/src/ir/cost.h
index c5b77ea01..c218cbaab 100644
--- a/src/ir/cost.h
+++ b/src/ir/cost.h
@@ -576,7 +576,9 @@ struct CostAnalyzer : public OverriddenVisitor<CostAnalyzer, Index> {
Index visitRefCast(RefCast* curr) {
return 2 + nullCheckCost(curr->ref) + visit(curr->ref) + visit(curr->rtt);
}
- Index visitBrOnCast(BrOnCast* curr) { WASM_UNREACHABLE("TODO: GC"); }
+ Index visitBrOnCast(BrOnCast* curr) {
+ return 3 + nullCheckCost(curr->ref) + visit(curr->ref) + visit(curr->rtt);
+ }
Index visitRttCanon(RttCanon* curr) {
// TODO: investigate actual RTT costs in VMs
return 1;
diff --git a/src/ir/effects.h b/src/ir/effects.h
index 3cbddc491..5483242b5 100644
--- a/src/ir/effects.h
+++ b/src/ir/effects.h
@@ -551,7 +551,7 @@ private:
parent.implicitTrap = true;
}
void visitBrOnCast(BrOnCast* curr) {
- WASM_UNREACHABLE("TODO (gc): br_on_cast");
+ parent.breakTargets.insert(curr->name);
}
void visitRttCanon(RttCanon* curr) {}
void visitRttSub(RttSub* curr) {}