Skip to content

Commit 1f56a15

Browse files
authored
[Custom Descriptors] Preserve trap in Heap2Local (#7692)
Insert a ref.as_non_null when optimizing struct.new with a nullable descriptor to preserve the trap if the descriptor is null.
1 parent 5082d07 commit 1f56a15

File tree

2 files changed

+22
-7
lines changed

2 files changed

+22
-7
lines changed

src/passes/Heap2Local.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -752,8 +752,13 @@ struct Struct2Local : PostWalker<Struct2Local> {
752752
}
753753
}
754754
if (curr->desc) {
755-
contents.push_back(
756-
builder.makeLocalSet(tempIndexes[numTemps - 1], curr->desc));
755+
// Preserve the trapping on null descriptors by inserting a
756+
// ref.as_non_null.
757+
Expression* desc = curr->desc;
758+
if (curr->desc->type.isNullable()) {
759+
desc = builder.makeRefAs(RefAsNonNull, desc);
760+
}
761+
contents.push_back(builder.makeLocalSet(tempIndexes[numTemps - 1], desc));
757762
}
758763

759764
// Store the values into the locals representing the fields.

test/lit/passes/heap2local-desc.wast

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,9 @@
5656
;; CHECK-NEXT: (i32.const 1)
5757
;; CHECK-NEXT: )
5858
;; CHECK-NEXT: (local.set $3
59-
;; CHECK-NEXT: (global.get $desc)
59+
;; CHECK-NEXT: (ref.as_non_null
60+
;; CHECK-NEXT: (global.get $desc)
61+
;; CHECK-NEXT: )
6062
;; CHECK-NEXT: )
6163
;; CHECK-NEXT: (local.set $0
6264
;; CHECK-NEXT: (local.get $2)
@@ -84,7 +86,9 @@
8486
;; CHECK-NEXT: (drop
8587
;; CHECK-NEXT: (block (result nullref)
8688
;; CHECK-NEXT: (local.set $2
87-
;; CHECK-NEXT: (global.get $desc)
89+
;; CHECK-NEXT: (ref.as_non_null
90+
;; CHECK-NEXT: (global.get $desc)
91+
;; CHECK-NEXT: )
8892
;; CHECK-NEXT: )
8993
;; CHECK-NEXT: (local.set $0
9094
;; CHECK-NEXT: (i32.const 0)
@@ -240,7 +244,9 @@
240244
;; CHECK-NEXT: (drop
241245
;; CHECK-NEXT: (block (result nullref)
242246
;; CHECK-NEXT: (local.set $2
243-
;; CHECK-NEXT: (local.get $desc)
247+
;; CHECK-NEXT: (ref.as_non_null
248+
;; CHECK-NEXT: (local.get $desc)
249+
;; CHECK-NEXT: )
244250
;; CHECK-NEXT: )
245251
;; CHECK-NEXT: (local.set $1
246252
;; CHECK-NEXT: (local.get $2)
@@ -328,7 +334,9 @@
328334
;; CHECK-NEXT: (drop
329335
;; CHECK-NEXT: (block (result nullref)
330336
;; CHECK-NEXT: (local.set $2
331-
;; CHECK-NEXT: (local.get $desc)
337+
;; CHECK-NEXT: (ref.as_non_null
338+
;; CHECK-NEXT: (local.get $desc)
339+
;; CHECK-NEXT: )
332340
;; CHECK-NEXT: )
333341
;; CHECK-NEXT: (local.set $1
334342
;; CHECK-NEXT: (local.get $2)
@@ -423,7 +431,9 @@
423431
;; CHECK-NEXT: (drop
424432
;; CHECK-NEXT: (block (result nullref)
425433
;; CHECK-NEXT: (local.set $3
426-
;; CHECK-NEXT: (local.get $desc)
434+
;; CHECK-NEXT: (ref.as_non_null
435+
;; CHECK-NEXT: (local.get $desc)
436+
;; CHECK-NEXT: )
427437
;; CHECK-NEXT: )
428438
;; CHECK-NEXT: (local.set $2
429439
;; CHECK-NEXT: (local.get $3)

0 commit comments

Comments
 (0)