summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/passes/MemoryPacking.cpp16
-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