diff options
author | Alon Zakai <alonzakai@gmail.com> | 2017-09-09 10:01:34 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2017-09-09 10:01:34 -0700 |
commit | 67133b57486339249f65872b5959873fef390455 (patch) | |
tree | c2ccac8f11d6e35ceb7e6f48e112e36627e58b75 /src | |
parent | cec102e94e594a9e74d6e5940a6899168daf6d5f (diff) | |
download | binaryen-67133b57486339249f65872b5959873fef390455.tar.gz binaryen-67133b57486339249f65872b5959873fef390455.tar.bz2 binaryen-67133b57486339249f65872b5959873fef390455.zip |
code-folding must propagate types when it optimizes something
Diffstat (limited to 'src')
-rw-r--r-- | src/passes/CodeFolding.cpp | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/src/passes/CodeFolding.cpp b/src/passes/CodeFolding.cpp index ae2f81283..047eee452 100644 --- a/src/passes/CodeFolding.cpp +++ b/src/passes/CodeFolding.cpp @@ -226,13 +226,17 @@ struct CodeFolding : public WalkerPass<ControlFlowWalker<CodeFolding>> { // optimize returns at the end, so we can benefit from a fallthrough if there is a value TODO: separate passes for them? optimizeTerminatingTails(returnTails); // TODO add fallthrough for returns - // TODO optimzier returns not in blocks, a big return value can be worth it + // TODO optimize returns not in blocks, a big return value can be worth it // clean up breakTails.clear(); unreachableTails.clear(); returnTails.clear(); unoptimizables.clear(); modifieds.clear(); + // if we did any work, types may need to be propagated + if (anotherPass) { + ReFinalize().walkFunctionInModule(func, getModule()); + } } } @@ -371,8 +375,7 @@ private: if (!tail.isFallthrough()) { tail.block->list.push_back(last); } - // the blocks lose their endings, so any values are gone, and the blocks - // are now either none or unreachable + // the block type may change if we removed final values tail.block->finalize(); } // since we managed a merge, then it might open up more opportunities later |