diff options
author | Alon Zakai <alonzakai@gmail.com> | 2017-08-07 15:43:36 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-08-07 15:43:36 -0700 |
commit | 4f0bf336e0e04ec349c7524d86ffd2c4066cb644 (patch) | |
tree | d50a12f9701f8eb4b5f28770cf43a55877c931a8 /src/passes/pass.cpp | |
parent | b93ea39b239052314123d3641df29ff5c5730515 (diff) | |
download | binaryen-4f0bf336e0e04ec349c7524d86ffd2c4066cb644.tar.gz binaryen-4f0bf336e0e04ec349c7524d86ffd2c4066cb644.tar.bz2 binaryen-4f0bf336e0e04ec349c7524d86ffd2c4066cb644.zip |
Improve and enable inlining pass (#966)
* improve inlining pass to inline single-use functions that are fairly small, which makes it useful for removing unnecessary global constructors from clang. add an inlining-optimizing pass that also optimizes where it inlined, as new opportunities arise. enable that it by default in O2+
* fix a bug where we didn't run all passes properly - refactor addDefaultGlobalOptimizationPasses() into a pre and post version. we can only run the post version in incremental optimizing builds (functions appear one by one, we optimize them first, and do global stuff when all are done), but can run both when doing a full optimize
* copy in inlining, allowing multiple inlinings of the same function in the future
Diffstat (limited to 'src/passes/pass.cpp')
-rw-r--r-- | src/passes/pass.cpp | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/src/passes/pass.cpp b/src/passes/pass.cpp index fc0a583fb..37eb50a0b 100644 --- a/src/passes/pass.cpp +++ b/src/passes/pass.cpp @@ -73,6 +73,7 @@ void PassRegistry::registerPasses() { registerPass("extract-function", "leaves just one function (useful for debugging)", createExtractFunctionPass); registerPass("flatten-control-flow", "flattens out control flow to be only on blocks, not nested as expressions", createFlattenControlFlowPass); registerPass("inlining", "inlines functions (currently only ones with a single use)", createInliningPass); + registerPass("inlining-optimizing", "inlines functions (currently only ones with a single use) and optimizes where we inlined", createInliningOptimizingPass); registerPass("legalize-js-interface", "legalizes i64 types on the import/export boundary", createLegalizeJSInterfacePass); registerPass("local-cse", "common subexpression elimination inside basic blocks", createLocalCSEPass); registerPass("log-execution", "instrument the build with logging of where execution goes", createLogExecutionPass); @@ -110,11 +111,9 @@ void PassRegistry::registerPasses() { } void PassRunner::addDefaultOptimizationPasses() { - add("duplicate-function-elimination"); + addDefaultGlobalOptimizationPrePasses(); addDefaultFunctionOptimizationPasses(); - add("duplicate-function-elimination"); // optimizations show more functions as duplicate - add("remove-unused-module-elements"); - add("memory-packing"); + addDefaultGlobalOptimizationPostPasses(); } void PassRunner::addDefaultFunctionOptimizationPasses() { @@ -154,9 +153,16 @@ void PassRunner::addDefaultFunctionOptimizationPasses() { add("vacuum"); // just to be safe } -void PassRunner::addDefaultGlobalOptimizationPasses() { +void PassRunner::addDefaultGlobalOptimizationPrePasses() { add("duplicate-function-elimination"); +} + +void PassRunner::addDefaultGlobalOptimizationPostPasses() { + add("duplicate-function-elimination"); // optimizations show more functions as duplicate add("remove-unused-module-elements"); + if (options.optimizeLevel >= 2 || options.shrinkLevel >= 2) { + add("inlining-optimizing"); + } add("memory-packing"); } |