diff options
Diffstat (limited to 'src/passes/MemoryPacking.cpp')
-rw-r--r-- | src/passes/MemoryPacking.cpp | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/src/passes/MemoryPacking.cpp b/src/passes/MemoryPacking.cpp index d4d75e6d6..b6ee7acf9 100644 --- a/src/passes/MemoryPacking.cpp +++ b/src/passes/MemoryPacking.cpp @@ -97,7 +97,7 @@ struct MemoryPacking : public Pass { uint32_t maxSegments; void run(PassRunner* runner, Module* module) override; - bool canOptimize(const std::vector<Memory::Segment>& segments); + bool canOptimize(const Memory& memory, const PassOptions& passOptions); void optimizeBulkMemoryOps(PassRunner* runner, Module* module); void getSegmentReferrers(Module* module, std::vector<Referrers>& referrers); void dropUnusedSegments(std::vector<Memory::Segment>& segments, @@ -122,13 +122,7 @@ struct MemoryPacking : public Pass { }; void MemoryPacking::run(PassRunner* runner, Module* module) { - if (!module->memory.exists) { - return; - } - - auto& segments = module->memory.segments; - - if (!canOptimize(segments)) { + if (!canOptimize(module->memory, runner->options)) { return; } @@ -136,6 +130,8 @@ void MemoryPacking::run(PassRunner* runner, Module* module) { ? 63 : uint32_t(WebLimitations::MaxDataSegments); + auto& segments = module->memory.segments; + // For each segment, a list of bulk memory instructions that refer to it std::vector<Referrers> referrers(segments.size()); @@ -182,7 +178,21 @@ void MemoryPacking::run(PassRunner* runner, Module* module) { } } -bool MemoryPacking::canOptimize(const std::vector<Memory::Segment>& segments) { +bool MemoryPacking::canOptimize(const Memory& memory, + const PassOptions& passOptions) { + if (!memory.exists) { + return false; + } + + // We must optimize under the assumption that memory has been initialized to + // zero. That is the case for a memory declared in the module, but for a + // memory that is imported, we must be told that it is zero-initialized. + if (memory.imported() && !passOptions.zeroFilledMemory) { + return false; + } + + auto& segments = memory.segments; + // One segment is always ok to optimize, as it does not have the potential // problems handled below. if (segments.size() <= 1) { |