Skip to content

Commit 8dca239

Browse files
authored
[Custom Descriptors] Add missing Heap2Local refinalize (WebAssembly#7924)
1 parent 9a96c2e commit 8dca239

File tree

2 files changed

+57
-1
lines changed

2 files changed

+57
-1
lines changed

src/passes/Heap2Local.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -945,6 +945,10 @@ struct Struct2Local : PostWalker<Struct2Local> {
945945
auto descIndex = localIndexes[fields.size()];
946946
Expression* value = builder.makeLocalGet(descIndex, descType);
947947
replaceCurrent(builder.blockify(builder.makeDrop(curr->ref), value));
948+
949+
// After removing the ref.get_desc, a null may be falling through,
950+
// requiring refinalization to update parents.
951+
refinalize = true;
948952
}
949953

950954
void visitStructSet(StructSet* curr) {

test/lit/passes/heap2local-desc.wast

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@
211211
;; CHECK-NEXT: (local $1 (ref (exact $sub.desc)))
212212
;; CHECK-NEXT: (block (result (ref (exact $sub.desc)))
213213
;; CHECK-NEXT: (drop
214-
;; CHECK-NEXT: (block (result (ref null $super))
214+
;; CHECK-NEXT: (block (result nullref)
215215
;; CHECK-NEXT: (block (result nullref)
216216
;; CHECK-NEXT: (local.set $1
217217
;; CHECK-NEXT: (struct.new_default $sub.desc)
@@ -1004,3 +1004,55 @@
10041004
)
10051005
)
10061006
)
1007+
1008+
(module
1009+
(rec
1010+
(type $A (descriptor $B (struct)))
1011+
(type $B (sub (describes $A (struct))))
1012+
)
1013+
;; CHECK: (type $0 (func))
1014+
1015+
;; CHECK: (func $test (type $0)
1016+
;; CHECK-NEXT: (local $0 (ref none))
1017+
;; CHECK-NEXT: (local $1 (ref none))
1018+
;; CHECK-NEXT: (block $block
1019+
;; CHECK-NEXT: (drop
1020+
;; CHECK-NEXT: (br_on_null $block
1021+
;; CHECK-NEXT: (block (result (ref none))
1022+
;; CHECK-NEXT: (drop
1023+
;; CHECK-NEXT: (block (result nullref)
1024+
;; CHECK-NEXT: (local.set $1
1025+
;; CHECK-NEXT: (ref.as_non_null
1026+
;; CHECK-NEXT: (ref.null none)
1027+
;; CHECK-NEXT: )
1028+
;; CHECK-NEXT: )
1029+
;; CHECK-NEXT: (local.set $0
1030+
;; CHECK-NEXT: (local.get $1)
1031+
;; CHECK-NEXT: )
1032+
;; CHECK-NEXT: (ref.null none)
1033+
;; CHECK-NEXT: )
1034+
;; CHECK-NEXT: )
1035+
;; CHECK-NEXT: (local.get $0)
1036+
;; CHECK-NEXT: )
1037+
;; CHECK-NEXT: )
1038+
;; CHECK-NEXT: )
1039+
;; CHECK-NEXT: (unreachable)
1040+
;; CHECK-NEXT: )
1041+
;; CHECK-NEXT: )
1042+
(func $test
1043+
;; After removing the ref.get_desc, the null descriptor falls through, and
1044+
;; we must update the br_on_null's type, or internal validation errors.
1045+
(block $block
1046+
(drop
1047+
(br_on_null $block
1048+
(ref.get_desc $A
1049+
(struct.new_default $A
1050+
(ref.null none)
1051+
)
1052+
)
1053+
)
1054+
)
1055+
(unreachable)
1056+
)
1057+
)
1058+
)

0 commit comments

Comments
 (0)