diff options
Diffstat (limited to 'src/passes/MemoryPacking.cpp')
-rw-r--r-- | src/passes/MemoryPacking.cpp | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/src/passes/MemoryPacking.cpp b/src/passes/MemoryPacking.cpp index 99eb2e285..0b24379e5 100644 --- a/src/passes/MemoryPacking.cpp +++ b/src/passes/MemoryPacking.cpp @@ -28,12 +28,20 @@ struct MemoryPacking : public Pass { bool modifiesBinaryenIR() override { return false; } void run(PassRunner* runner, Module* module) override { - // Conservatively refuse to change segments if bulk memory is enabled to - // avoid invalidating segment indices or segment contents referenced from + if (!module->memory.exists) { + return; + } + + // Conservatively refuse to change segments if any are passive to avoid + // invalidating segment indices or segment contents referenced from // memory.init instructions. // TODO: optimize in the presence of memory.init instructions - if (!module->memory.exists || module->features.hasBulkMemory()) { - return; + if (module->features.hasBulkMemory()) { + for (auto segment : module->memory.segments) { + if (segment.isPassive) { + return; + } + } } std::vector<Memory::Segment> packed; |