diff options
Diffstat (limited to 'src/ir')
-rw-r--r-- | src/ir/ReFinalize.cpp | 6 | ||||
-rw-r--r-- | src/ir/branch-utils.h | 2 | ||||
-rw-r--r-- | src/ir/cost.h | 4 | ||||
-rw-r--r-- | src/ir/effects.h | 2 |
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) {} |