summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/ir/gc-type-utils.h8
-rw-r--r--test/lit/extern-conversions.wast20
2 files changed, 19 insertions, 9 deletions
diff --git a/src/ir/gc-type-utils.h b/src/ir/gc-type-utils.h
index cec4490e2..abe5f2dfc 100644
--- a/src/ir/gc-type-utils.h
+++ b/src/ir/gc-type-utils.h
@@ -100,7 +100,7 @@ inline EvaluationResult evaluateKindCheck(Expression* curr) {
expected = I31;
break;
default:
- WASM_UNREACHABLE("unhandled BrOn");
+ WASM_UNREACHABLE("unhandled RefIs");
}
child = is->value;
} else if (auto* as = curr->dynCast<RefAs>()) {
@@ -117,8 +117,12 @@ inline EvaluationResult evaluateKindCheck(Expression* curr) {
case RefAsI31:
expected = I31;
break;
+ case ExternInternalize:
+ case ExternExternalize:
+ // These instructions can never be removed.
+ return Unknown;
default:
- WASM_UNREACHABLE("unhandled BrOn");
+ WASM_UNREACHABLE("unhandled RefAs");
}
child = as->value;
} else {
diff --git a/test/lit/extern-conversions.wast b/test/lit/extern-conversions.wast
index 403b558f6..d3ad4d2d5 100644
--- a/test/lit/extern-conversions.wast
+++ b/test/lit/extern-conversions.wast
@@ -1,31 +1,37 @@
;; NOTE: Assertions have been generated by update_lit_checks.py --all-items and should not be edited.
;; Check that extern conversion instructions are emitted properly in the binary format.
+;; Also check that the optimizer does not break on this code.
+
+;; RUN: wasm-opt %s -all -O1 --roundtrip -S -o - | filecheck %s
-;; RUN: wasm-opt %s -all --roundtrip -S -o - | filecheck %s
(module
;; CHECK: (type $ref|any|_=>_ref|extern| (func (param (ref any)) (result (ref extern))))
;; CHECK: (type $externref_=>_anyref (func (param externref) (result anyref)))
- ;; CHECK: (func $extern.externalize (param $x (ref any)) (result (ref extern))
+ ;; CHECK: (export "ext" (func $extern.externalize))
+
+ ;; CHECK: (export "int" (func $extern.internalize))
+
+ ;; CHECK: (func $extern.externalize (param $0 (ref any)) (result (ref extern))
;; CHECK-NEXT: (extern.externalize
- ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
- (func $extern.externalize (param $x (ref any)) (result (ref extern))
+ (func $extern.externalize (export "ext") (param $x (ref any)) (result (ref extern))
(extern.externalize
(local.get $x)
)
)
- ;; CHECK: (func $extern.internalize (param $x externref) (result anyref)
+ ;; CHECK: (func $extern.internalize (param $0 externref) (result anyref)
;; CHECK-NEXT: (extern.internalize
- ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
- (func $extern.internalize (param $x (ref null extern)) (result (ref null any))
+ (func $extern.internalize (export "int") (param $x (ref null extern)) (result (ref null any))
(extern.internalize
(local.get $x)
)