summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/passes/MemoryPacking.cpp3
-rw-r--r--test/lit/passes/memory-packing_all-features.wast26
2 files changed, 27 insertions, 2 deletions
diff --git a/src/passes/MemoryPacking.cpp b/src/passes/MemoryPacking.cpp
index c6fd0e313..7b4caf11e 100644
--- a/src/passes/MemoryPacking.cpp
+++ b/src/passes/MemoryPacking.cpp
@@ -473,7 +473,6 @@ void MemoryPacking::dropUnusedSegments(std::vector<Memory::Segment>& segments,
ReferrersMap usedReferrers;
// Remove segments that are never used
// TODO: remove unused portions of partially used segments as well
- size_t newSegIndex = 0;
for (size_t i = 0; i < segments.size(); ++i) {
bool used = false;
auto referrersIt = referrers.find(i);
@@ -494,7 +493,7 @@ void MemoryPacking::dropUnusedSegments(std::vector<Memory::Segment>& segments,
if (used) {
usedSegments.push_back(std::move(segments[i]));
if (hasReferrers) {
- usedReferrers[newSegIndex++] = std::move(referrersIt->second);
+ usedReferrers[usedSegments.size() - 1] = std::move(referrersIt->second);
}
} else if (hasReferrers) {
// All referrers are data.drops. Make them nops.
diff --git a/test/lit/passes/memory-packing_all-features.wast b/test/lit/passes/memory-packing_all-features.wast
index 5fbf92023..6bee38ca0 100644
--- a/test/lit/passes/memory-packing_all-features.wast
+++ b/test/lit/passes/memory-packing_all-features.wast
@@ -2270,4 +2270,30 @@
(data (i32.const 1024) "x")
(data (i32.const 2048) "\00")
)
+
;; CHECK: (data (i32.const 1024) "x")
+(module
+ ;; Regression test for a bug where referrers were accidentally associated with
+ ;; the wrong segments in the presence of unreferenced segments.
+ ;; CHECK: (type $none_=>_none (func))
+
+ ;; CHECK: (memory $0 (shared 1 1))
+ (memory $0 (shared 1 1))
+ (data (i32.const 0) "")
+ ;; CHECK: (data "foo")
+ (data "foo")
+ ;; CHECK: (func $0
+ ;; CHECK-NEXT: (memory.init 0
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: (i32.const 1)
+ ;; CHECK-NEXT: (i32.const 1)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $0
+ (memory.init 1
+ (i32.const 0)
+ (i32.const 1)
+ (i32.const 1)
+ )
+ )
+)