summaryrefslogtreecommitdiff
path: root/src/passes/MergeBlocks.cpp
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2017-07-12 19:27:17 -0700
committerGitHub <noreply@github.com>2017-07-12 19:27:17 -0700
commitb2c17a105e9fbe86c059793032ee0be676245a8a (patch)
tree72cf9673e9de93c4c3106612416ebd9e0329a19c /src/passes/MergeBlocks.cpp
parent25cbf641c6133d5156e8591072d2705fde92752b (diff)
parent6159fb42fcd2dae593ee61ebb7e3e163445ae9d0 (diff)
downloadbinaryen-b2c17a105e9fbe86c059793032ee0be676245a8a.tar.gz
binaryen-b2c17a105e9fbe86c059793032ee0be676245a8a.tar.bz2
binaryen-b2c17a105e9fbe86c059793032ee0be676245a8a.zip
Merge pull request #1087 from WebAssembly/fuzz-2
Fuzz fixes
Diffstat (limited to 'src/passes/MergeBlocks.cpp')
-rw-r--r--src/passes/MergeBlocks.cpp11
1 files changed, 9 insertions, 2 deletions
diff --git a/src/passes/MergeBlocks.cpp b/src/passes/MergeBlocks.cpp
index 1ec8843d6..2c983d991 100644
--- a/src/passes/MergeBlocks.cpp
+++ b/src/passes/MergeBlocks.cpp
@@ -63,8 +63,9 @@
#include <wasm.h>
#include <pass.h>
-#include <ast_utils.h>
#include <wasm-builder.h>
+#include <ast_utils.h>
+#include <ast/effects.h>
namespace wasm {
@@ -121,6 +122,11 @@ struct BreakValueDropper : public ControlFlowWalker<BreakValueDropper> {
if (curr->value && curr->name == origin) {
Builder builder(*getModule());
auto* value = curr->value;
+ if (value->type == unreachable) {
+ // the break isn't even reached
+ replaceCurrent(value);
+ return;
+ }
curr->value = nullptr;
curr->finalize();
replaceCurrent(builder.makeSequence(builder.makeDrop(value), curr));
@@ -129,7 +135,8 @@ struct BreakValueDropper : public ControlFlowWalker<BreakValueDropper> {
void visitDrop(Drop* curr) {
// if we dropped a br_if whose value we removed, then we are now dropping a (block (drop value) (br_if)) with type none, which does not need a drop
- if (curr->value->type == none) {
+ // likewise, unreachable does not need to be dropped, so we just leave drops of concrete values
+ if (!isConcreteWasmType(curr->value->type)) {
replaceCurrent(curr->value);
}
}