diff options
-rw-r--r-- | src/passes/MemoryPacking.cpp | 16 | ||||
-rw-r--r-- | test/passes/memory-packing.txt (renamed from test/passes/memory-packing_disable-bulk-memory.txt) | 0 | ||||
-rw-r--r-- | test/passes/memory-packing.wast (renamed from test/passes/memory-packing_disable-bulk-memory.wast) | 0 |
3 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; diff --git a/test/passes/memory-packing_disable-bulk-memory.txt b/test/passes/memory-packing.txt index 9805375f1..9805375f1 100644 --- a/test/passes/memory-packing_disable-bulk-memory.txt +++ b/test/passes/memory-packing.txt diff --git a/test/passes/memory-packing_disable-bulk-memory.wast b/test/passes/memory-packing.wast index 6cdd453d1..6cdd453d1 100644 --- a/test/passes/memory-packing_disable-bulk-memory.wast +++ b/test/passes/memory-packing.wast |