diff options
-rw-r--r-- | src/passes/MemoryPacking.cpp | 7 | ||||
-rw-r--r-- | test/lit/passes/memory-packing_all-features.wast | 47 |
2 files changed, 52 insertions, 2 deletions
diff --git a/src/passes/MemoryPacking.cpp b/src/passes/MemoryPacking.cpp index 02f53e22a..7beed9a16 100644 --- a/src/passes/MemoryPacking.cpp +++ b/src/passes/MemoryPacking.cpp @@ -715,8 +715,10 @@ void MemoryPacking::createReplacements(Module* module, // Calculate dest, either as a const or as an addition to the dest local Expression* dest; + Type ptrType = init->dest->type; if (auto* c = init->dest->dynCast<Const>()) { - dest = builder.makeConst(int32_t(c->value.geti32() + bytesWritten)); + dest = + builder.makeConstPtr(c->value.getInteger() + bytesWritten, ptrType); } else { auto* get = builder.makeLocalGet(-1, Type::i32); getVars.push_back(&get->index); @@ -729,16 +731,17 @@ void MemoryPacking::createReplacements(Module* module, // How many bytes are read from this range size_t bytes = std::min(range.end, end) - std::max(range.start, start); - Expression* size = builder.makeConst(int32_t(bytes)); bytesWritten += bytes; // Create new memory.init or memory.fill if (range.isZero) { Expression* value = builder.makeConst(Literal::makeZero(Type::i32)); + Expression* size = builder.makeConstPtr(bytes, ptrType); appendResult(builder.makeMemoryFill(dest, value, size, init->memory)); } else { size_t offsetBytes = std::max(start, range.start) - range.start; Expression* offset = builder.makeConst(int32_t(offsetBytes)); + Expression* size = builder.makeConst(int32_t(bytes)); appendResult( builder.makeMemoryInit(initIndex, dest, offset, size, init->memory)); initIndex++; diff --git a/test/lit/passes/memory-packing_all-features.wast b/test/lit/passes/memory-packing_all-features.wast index ba5a4b505..890fe20e6 100644 --- a/test/lit/passes/memory-packing_all-features.wast +++ b/test/lit/passes/memory-packing_all-features.wast @@ -2297,3 +2297,50 @@ ) ) ) +(module + ;; memory64 works! + ;; CHECK: (type $none_=>_none (func)) + + ;; CHECK: (global $__mem_segment_drop_state (mut i32) (i32.const 0)) + + ;; CHECK: (memory $0 i64 1 1) + (memory $0 i64 1 1) + (data "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00wasm64\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00is cool") + ;; CHECK: (data "wasm64") + + ;; CHECK: (data "is cool") + + ;; CHECK: (func $0 (type $none_=>_none) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (global.get $__mem_segment_drop_state) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (memory.fill + ;; CHECK-NEXT: (i64.const 0) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (i64.const 57) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (memory.init 0 + ;; CHECK-NEXT: (i64.const 57) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (i32.const 6) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (memory.fill + ;; CHECK-NEXT: (i64.const 63) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (i64.const 57) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (memory.init 1 + ;; CHECK-NEXT: (i64.const 120) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (i32.const 7) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $0 + (memory.init 0 + (i64.const 0) + (i32.const 0) + (i32.const 127) + ) + ) +) |