diff options
-rw-r--r-- | src/pass.h | 9 | ||||
-rw-r--r-- | src/tools/optimization-options.h | 9 |
2 files changed, 17 insertions, 1 deletions
diff --git a/src/pass.h b/src/pass.h index 4f9cd1b68..45dd549d1 100644 --- a/src/pass.h +++ b/src/pass.h @@ -107,6 +107,15 @@ struct PassOptions { // forth (which IEEE floats do not, strictly speaking). This is inspired by // gcc/clang's -ffast-math flag. bool fastMath = false; + // Whether to assume that an imported memory has not been modified. Without + // this, we can do fewer optimizations on memory segments, because if memory + // *was* modified then the wasm's segments may trample those previous + // modifications. If memory was not modified, we can assume it starts as zero, + // which allows us to remove zeros from wasm's segments. + // (This is not a problem if the memory is *not* imported, since then wasm + // creates it and we know it is all zeros right before the active segments are + // applied.) + bool unmodifiedImportedMemory = false; // Whether to try to preserve debug info through, which are special calls. bool debugInfo = false; // Arbitrary string arguments from the commandline, which we forward to diff --git a/src/tools/optimization-options.h b/src/tools/optimization-options.h index 5b6a643e6..f89dab347 100644 --- a/src/tools/optimization-options.h +++ b/src/tools/optimization-options.h @@ -193,7 +193,14 @@ struct OptimizationOptions : public ToolOptions { "-ffm", "Optimize floats without handling corner cases of NaNs and rounding", Options::Arguments::Zero, - [this](Options*, const std::string&) { passOptions.fastMath = true; }); + [this](Options*, const std::string&) { passOptions.fastMath = true; }) + .add("--unmodified-imported-mem", + "-uim", + "Assume that an imported memory will not have been modified", + Options::Arguments::Zero, + [this](Options*, const std::string&) { + passOptions.unmodifiedImportedMemory = true; + }); // add passes in registry for (const auto& p : PassRegistry::get()->getRegisteredNames()) { (*this).add( |