From 89a7c881ffac4a7b46cc0f031456e08153c5a6fe Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 22 Oct 2025 16:32:16 -0700 Subject: [PATCH 1/3] work --- src/passes/GlobalTypeOptimization.cpp | 2 +- test/lit/passes/gto-removals.wast | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/passes/GlobalTypeOptimization.cpp b/src/passes/GlobalTypeOptimization.cpp index 6316dc7e57e..199a9d3ecbb 100644 --- a/src/passes/GlobalTypeOptimization.cpp +++ b/src/passes/GlobalTypeOptimization.cpp @@ -444,7 +444,7 @@ struct GlobalTypeOptimization : public Pass { // Clear the old names and write the new ones. nameInfo.fieldNames.clear(); - for (Index i = 0; i < oldFieldNames.size(); i++) { + for (Index i = 0; i < indexesAfterRemoval.size(); i++) { auto newIndex = indexesAfterRemoval[i]; if (newIndex != RemovedField && oldFieldNames.count(i)) { assert(oldFieldNames[i].is()); diff --git a/test/lit/passes/gto-removals.wast b/test/lit/passes/gto-removals.wast index 9dbb712bd28..805cb7992bb 100644 --- a/test/lit/passes/gto-removals.wast +++ b/test/lit/passes/gto-removals.wast @@ -1675,3 +1675,27 @@ ) ) ) + +(module + ;; A struct with partial names: only some fields are named. We should still + ;; update names properly when removing and reordering. + + (type $struct (sub (struct (field i32) (field $named i32) (field i32) (field $other i32)))) + + (func $func (param $x (ref $struct)) + ;; Use fields 1 and 2. + (struct.set $struct 1 + (local.get $x) + (struct.get $struct 1) + (local.get $x) + ) + ) + (struct.set $struct 2 + (local.get $x) + (struct.get $struct 2) + (local.get $x) + ) + ) + ) +) + From e0efa12dbf0a8e042e7737e046ff6e76c8369ac8 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 22 Oct 2025 16:36:19 -0700 Subject: [PATCH 2/3] test --- test/lit/passes/gto-removals.wast | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/test/lit/passes/gto-removals.wast b/test/lit/passes/gto-removals.wast index 805cb7992bb..814712bccc4 100644 --- a/test/lit/passes/gto-removals.wast +++ b/test/lit/passes/gto-removals.wast @@ -1680,19 +1680,37 @@ ;; A struct with partial names: only some fields are named. We should still ;; update names properly when removing and reordering. - (type $struct (sub (struct (field i32) (field $named i32) (field i32) (field $other i32)))) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $struct (sub (struct (field (mut i32)) (field $named (mut i32))))) + (type $struct (sub (struct (field (mut i32)) (field (mut i32)) (field $named (mut i32)) (field (mut i32)) (field (mut i32))))) + + ;; CHECK: (type $1 (func (param (ref $struct)))) + ;; CHECK: (func $func (type $1) (param $x (ref $struct)) + ;; CHECK-NEXT: (struct.set $struct 0 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (struct.get $struct 0 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (struct.set $struct $named + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (struct.get $struct $named + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) (func $func (param $x (ref $struct)) ;; Use fields 1 and 2. (struct.set $struct 1 (local.get $x) - (struct.get $struct 1) + (struct.get $struct 1 (local.get $x) ) ) (struct.set $struct 2 (local.get $x) - (struct.get $struct 2) + (struct.get $struct 2 (local.get $x) ) ) From fc8902c26dc76ed8e01d6c03c43e440392d35ebd Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 23 Oct 2025 08:02:33 -0700 Subject: [PATCH 3/3] use iter --- src/passes/GlobalTypeOptimization.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/passes/GlobalTypeOptimization.cpp b/src/passes/GlobalTypeOptimization.cpp index 199a9d3ecbb..c038a7a0a06 100644 --- a/src/passes/GlobalTypeOptimization.cpp +++ b/src/passes/GlobalTypeOptimization.cpp @@ -446,9 +446,11 @@ struct GlobalTypeOptimization : public Pass { nameInfo.fieldNames.clear(); for (Index i = 0; i < indexesAfterRemoval.size(); i++) { auto newIndex = indexesAfterRemoval[i]; - if (newIndex != RemovedField && oldFieldNames.count(i)) { - assert(oldFieldNames[i].is()); - nameInfo.fieldNames[newIndex] = oldFieldNames[i]; + if (newIndex != RemovedField) { + auto iter = oldFieldNames.find(i); + if (iter != oldFieldNames.end()) { + nameInfo.fieldNames[newIndex] = iter->second; + } } } }