diff options
author | Alon Zakai (kripken) <alonzakai@gmail.com> | 2017-05-20 14:38:23 -0700 |
---|---|---|
committer | Alon Zakai (kripken) <alonzakai@gmail.com> | 2017-05-20 15:08:50 -0700 |
commit | 2f3bcb914b55f469426418fed1d85e00d0e4db1b (patch) | |
tree | 4d3997948e7af59b1ff969684f6565726201b2ef /src | |
parent | 1462c0dbfa9980481058e17d2aac317420e45acc (diff) | |
download | binaryen-2f3bcb914b55f469426418fed1d85e00d0e4db1b.tar.gz binaryen-2f3bcb914b55f469426418fed1d85e00d0e4db1b.tar.bz2 binaryen-2f3bcb914b55f469426418fed1d85e00d0e4db1b.zip |
relooper improvements
Diffstat (limited to 'src')
-rw-r--r-- | src/cfg/Relooper.cpp | 7 | ||||
-rw-r--r-- | src/passes/ReReloop.cpp | 3 |
2 files changed, 9 insertions, 1 deletions
diff --git a/src/cfg/Relooper.cpp b/src/cfg/Relooper.cpp index 9fcc9c8be..b326d761d 100644 --- a/src/cfg/Relooper.cpp +++ b/src/cfg/Relooper.cpp @@ -328,7 +328,12 @@ wasm::Expression* Block::Render(RelooperBuilder& Builder, bool InLoop) { NextOuter->list.push_back(Outer); Outer->name = CurrName; // breaking on Outer leads to the content in NextOuter NextOuter->list.push_back(CurrContent); - NextOuter->list.push_back(Builder.makeBreak(SwitchLeave)); + // if this is not a dead end, also need to break to the outside + // this is both an optimization, and avoids incorrectness as adding + // a brak in unreachable code can make a place look reachable that isn't + if (CurrContent->type != wasm::unreachable) { + NextOuter->list.push_back(Builder.makeBreak(SwitchLeave)); + } // prepare for more nesting Outer = NextOuter; } else { diff --git a/src/passes/ReReloop.cpp b/src/passes/ReReloop.cpp index 6bdc0eb06..db2ec5698 100644 --- a/src/passes/ReReloop.cpp +++ b/src/passes/ReReloop.cpp @@ -28,6 +28,7 @@ #include "wasm-traversal.h" #include "pass.h" #include "cfg/Relooper.h" +#include "ast_utils.h" namespace wasm { @@ -314,6 +315,8 @@ struct ReReloop : public Pass { CFG::RelooperBuilder builder(*module, temp); function->body = relooper.Render(builder); } + // TODO: should this be in the relooper itself? + ReFinalize().walk(function->body); } }; |