diff options
author | Alon Zakai <alonzakai@gmail.com> | 2016-10-21 13:41:38 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2016-10-21 13:41:38 -0700 |
commit | 8f0bfac3a2b7618e2af6e813357193f7d1540219 (patch) | |
tree | 827e7637b9a654c3071f1d2be2133415b9276cda /src | |
parent | 5177e11e24b08c6a53215b59fe1ac25141763429 (diff) | |
download | binaryen-8f0bfac3a2b7618e2af6e813357193f7d1540219.tar.gz binaryen-8f0bfac3a2b7618e2af6e813357193f7d1540219.tar.bz2 binaryen-8f0bfac3a2b7618e2af6e813357193f7d1540219.zip |
LinearExecutionWalker cleanups: call noteNonLinear for only necessary blocks, as some do not have branches, and add a missing call for unreachable which just like return halts control flow
Diffstat (limited to 'src')
-rw-r--r-- | src/wasm-traversal.h | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/src/wasm-traversal.h b/src/wasm-traversal.h index 47b9d26e8..620ff0161 100644 --- a/src/wasm-traversal.h +++ b/src/wasm-traversal.h @@ -581,7 +581,9 @@ struct LinearExecutionWalker : public PostWalker<SubType, VisitorType> { case Expression::Id::InvalidId: abort(); case Expression::Id::BlockId: { self->pushTask(SubType::doVisitBlock, currp); - self->pushTask(SubType::doNoteNonLinear, currp); + if (curr->cast<Block>()->name.is()) { + self->pushTask(SubType::doNoteNonLinear, currp); + } auto& list = curr->cast<Block>()->list; for (int i = int(list.size()) - 1; i >= 0; i--) { self->pushTask(SubType::scan, &list[i]); @@ -624,6 +626,11 @@ struct LinearExecutionWalker : public PostWalker<SubType, VisitorType> { self->maybePushTask(SubType::scan, &curr->cast<Return>()->value); break; } + case Expression::Id::UnreachableId: { + self->pushTask(SubType::doVisitUnreachable, currp); + self->pushTask(SubType::doNoteNonLinear, currp); + break; + } default: { // other node types do not have control flow, use regular post-order PostWalker<SubType, VisitorType>::scan(self, currp); |