diff options
author | Thomas Lively <tlively@google.com> | 2024-04-11 12:10:10 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-04-11 19:10:10 +0000 |
commit | da8b071ba8c5cd290853188a6b7704417ca254eb (patch) | |
tree | 0f0c61b5257c2b4bc6ed91d4be6467d3a3c0ba8d /src | |
parent | adea6e0f80c68108691f28ab4aa81b8f8973ac35 (diff) | |
download | binaryen-da8b071ba8c5cd290853188a6b7704417ca254eb.tar.gz binaryen-da8b071ba8c5cd290853188a6b7704417ca254eb.tar.bz2 binaryen-da8b071ba8c5cd290853188a6b7704417ca254eb.zip |
[Parser] Use unreachables to fulfill tuple requirements (#6488)
When we need to pop a tuple and the top value on the stack is unreachable, just
pop the unreachable rather than producing a tuple.make. This always produces
valid IR since an unreachable is always valid where a tuple would otherwise be
expected. It also avoids bloating the parsed IR, since we would previously parse
a `tuple.make` where all the children were unreachable in this case.
Diffstat (limited to 'src')
-rw-r--r-- | src/wasm/wasm-ir-builder.cpp | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/src/wasm/wasm-ir-builder.cpp b/src/wasm/wasm-ir-builder.cpp index 99462e9a8..7b88d345f 100644 --- a/src/wasm/wasm-ir-builder.cpp +++ b/src/wasm/wasm-ir-builder.cpp @@ -175,7 +175,9 @@ Result<Expression*> IRBuilder::pop(size_t size) { CHECK_ERR(packageHoistedValue(*hoisted, size)); auto* ret = scope.exprStack.back(); - if (ret->type.size() == size) { + // If the top value has the correct size, we can pop it and be done. + // Unreachable values satisfy any size. + if (ret->type.size() == size || ret->type == Type::unreachable) { scope.exprStack.pop_back(); return ret; } |