diff options
author | Alon Zakai <azakai@google.com> | 2020-02-06 16:17:49 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-02-06 16:17:49 -0800 |
commit | 7168130594a226b6a48186a7c1dd68987f2007cf (patch) | |
tree | c06f34d2f963d6c5533ced85601c92ec2dc6c783 /src/passes/pass.cpp | |
parent | aab75ed890a3e491d00e652bbfbe19edd17d38cb (diff) | |
download | binaryen-7168130594a226b6a48186a7c1dd68987f2007cf.tar.gz binaryen-7168130594a226b6a48186a7c1dd68987f2007cf.tar.bz2 binaryen-7168130594a226b6a48186a7c1dd68987f2007cf.zip |
DWARF: Disable optimization passes not fully compatible with DWARF yet (#2640)
Anything that merges/swaps/etc. locals, or inlines, or merges functions,
must be disabled for now. However, that does still leave almost all
passes, so this should not affect output sizes much (and the full LLVM
optimizer can be run before too).
Over time we can resolve each of those FIXMEs.
The test output here shows how disabling those allows over twice as
much debug_line info to be preserved.
Diffstat (limited to 'src/passes/pass.cpp')
-rw-r--r-- | src/passes/pass.cpp | 53 |
1 files changed, 42 insertions, 11 deletions
diff --git a/src/passes/pass.cpp b/src/passes/pass.cpp index 9567d27b6..733b61467 100644 --- a/src/passes/pass.cpp +++ b/src/passes/pass.cpp @@ -26,6 +26,7 @@ #include "pass.h" #include "passes/passes.h" #include "support/colors.h" +#include "wasm-debug.h" #include "wasm-io.h" #include "wasm-validator.h" @@ -359,15 +360,25 @@ void PassRunner::addDefaultOptimizationPasses() { addDefaultGlobalOptimizationPostPasses(); } +// Check whether we should preserve valid DWARF while optimizing. If so, we +// disable optimizations that currently cause issues with debug info. +static bool shouldPreserveDWARF(PassOptions& options, Module& wasm) { + return options.debugInfo && Debug::hasDWARFSections(wasm); +} + void PassRunner::addDefaultFunctionOptimizationPasses() { + auto preserveDWARF = shouldPreserveDWARF(options, *wasm); // Untangling to semi-ssa form is helpful (but best to ignore merges // so as to not introduce new copies). - if (options.optimizeLevel >= 3 || options.shrinkLevel >= 1) { + // FIXME DWARF updating does not handle local changes yet. + if (!preserveDWARF && + (options.optimizeLevel >= 3 || options.shrinkLevel >= 1)) { add("ssa-nomerge"); } // if we are willing to work very very hard, flatten the IR and do opts // that depend on flat IR - if (options.optimizeLevel >= 4) { + // FIXME DWARF updating does not handle local changes yet. + if (!preserveDWARF && options.optimizeLevel >= 4) { add("flatten"); add("local-cse"); } @@ -402,15 +413,23 @@ void PassRunner::addDefaultFunctionOptimizationPasses() { // simplify-locals opens opportunities for optimizations add("remove-unused-brs"); // if we are willing to work hard, also optimize copies before coalescing - if (options.optimizeLevel >= 3 || options.shrinkLevel >= 2) { + // FIXME DWARF updating does not handle local changes yet. + if (!preserveDWARF && + (options.optimizeLevel >= 3 || options.shrinkLevel >= 2)) { add("merge-locals"); // very slow on e.g. sqlite } - add("coalesce-locals"); + // FIXME DWARF updating does not handle local changes yet. + if (!preserveDWARF) { + add("coalesce-locals"); + } add("simplify-locals"); add("vacuum"); add("reorder-locals"); - add("coalesce-locals"); - add("reorder-locals"); + // FIXME DWARF updating does not handle local changes yet. + if (!preserveDWARF) { + add("coalesce-locals"); + add("reorder-locals"); + } add("vacuum"); if (options.optimizeLevel >= 3 || options.shrinkLevel >= 1) { add("code-folding"); @@ -433,19 +452,31 @@ void PassRunner::addDefaultFunctionOptimizationPasses() { } void PassRunner::addDefaultGlobalOptimizationPrePasses() { - add("duplicate-function-elimination"); + // FIXME DWARF updating does not handle merging debug info with merged code. + if (!shouldPreserveDWARF(options, *wasm)) { + add("duplicate-function-elimination"); + } add("memory-packing"); } void PassRunner::addDefaultGlobalOptimizationPostPasses() { - if (options.optimizeLevel >= 2 || options.shrinkLevel >= 1) { + auto preserveDWARF = shouldPreserveDWARF(options, *wasm); + // FIXME DWARF may be badly affected currently as DAE changes function + // signatures and hence params and locals. + if (!preserveDWARF && + (options.optimizeLevel >= 2 || options.shrinkLevel >= 1)) { add("dae-optimizing"); } - if (options.optimizeLevel >= 2 || options.shrinkLevel >= 2) { + // FIXME DWARF updating does not handle inlining yet. + if (!preserveDWARF && + (options.optimizeLevel >= 2 || options.shrinkLevel >= 2)) { add("inlining-optimizing"); } - // optimizations show more functions as duplicate - add("duplicate-function-elimination"); + // Optimizations show more functions as duplicate, so run this here in Post. + // FIXME DWARF updating does not handle merging debug info with merged code. + if (!preserveDWARF) { + add("duplicate-function-elimination"); + } add("duplicate-import-elimination"); if (options.optimizeLevel >= 2 || options.shrinkLevel >= 2) { add("simplify-globals-optimizing"); |