diff options
-rw-r--r-- | src/ir/gc-type-utils.h | 8 | ||||
-rw-r--r-- | test/lit/extern-conversions.wast | 20 |
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) ) |