summaryrefslogtreecommitdiff
path: root/src/wasm/wasm-ir-builder.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/wasm/wasm-ir-builder.cpp')
-rw-r--r--src/wasm/wasm-ir-builder.cpp11
1 files changed, 9 insertions, 2 deletions
diff --git a/src/wasm/wasm-ir-builder.cpp b/src/wasm/wasm-ir-builder.cpp
index 43a989c6e..e8a2a2386 100644
--- a/src/wasm/wasm-ir-builder.cpp
+++ b/src/wasm/wasm-ir-builder.cpp
@@ -430,6 +430,11 @@ Result<Expression*> IRBuilder::getBranchValue(Name labelName,
}
Result<> IRBuilder::visitBreak(Break* curr, std::optional<Index> label) {
+ if (curr->condition) {
+ auto cond = pop();
+ CHECK_ERR(cond);
+ curr->condition = *cond;
+ }
auto value = getBranchValue(curr->name, label);
CHECK_ERR(value);
curr->value = *value;
@@ -961,13 +966,15 @@ Result<> IRBuilder::makeLoop(Name label, Type type) {
return visitLoopStart(loop);
}
-Result<> IRBuilder::makeBreak(Index label) {
+Result<> IRBuilder::makeBreak(Index label, bool isConditional) {
auto name = getLabelName(label);
CHECK_ERR(name);
Break curr;
curr.name = *name;
+ // Use a dummy condition value if we need to pop a condition.
+ curr.condition = isConditional ? &curr : nullptr;
CHECK_ERR(visitBreak(&curr, label));
- push(builder.makeBreak(curr.name, curr.value));
+ push(builder.makeBreak(curr.name, curr.value, curr.condition));
return Ok{};
}