; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6 ; RUN: llc < %s --mtriple=wasm32-unknown-unknown -mattr=+reference-types | FileCheck %s ; The zero value of a WebAssembly reference type is the null reference, so a ; zeroinitializer (or null) reference constant must lower to ref.null rather ; than crash instruction selection. %externref = type target("wasm.externref") %funcref = type target("wasm.funcref") declare void @take_externref(%externref) declare i32 @llvm.wasm.ref.is_null.extern(%externref) define %externref @ret_zero_externref() { ; CHECK-LABEL: ret_zero_externref: ; CHECK: .functype ret_zero_externref () -> (externref) ; CHECK-NEXT: # %bb.0: ; CHECK-NEXT: ref.null_extern ; CHECK-NEXT: # fallthrough-return ret %externref zeroinitializer } define %funcref @ret_zero_funcref() { ; CHECK-LABEL: ret_zero_funcref: ; CHECK: .functype ret_zero_funcref () -> (funcref) ; CHECK-NEXT: # %bb.0: ; CHECK-NEXT: ref.null_func ; CHECK-NEXT: # fallthrough-return ret %funcref zeroinitializer } define void @pass_zero_externref() { ; CHECK-LABEL: pass_zero_externref: ; CHECK: .functype pass_zero_externref () -> () ; CHECK-NEXT: # %bb.0: ; CHECK-NEXT: ref.null_extern ; CHECK-NEXT: call take_externref ; CHECK-NEXT: # fallthrough-return call void @take_externref(%externref zeroinitializer) ret void } define %externref @select_zero_externref(i1 %c, %externref %x) { ; CHECK-LABEL: select_zero_externref: ; CHECK: .functype select_zero_externref (i32, externref) -> (externref) ; CHECK-NEXT: # %bb.0: ; CHECK-NEXT: local.get 1 ; CHECK-NEXT: ref.null_extern ; CHECK-NEXT: local.get 0 ; CHECK-NEXT: i32.const 1 ; CHECK-NEXT: i32.and ; CHECK-NEXT: externref.select ; CHECK-NEXT: # fallthrough-return %r = select i1 %c, %externref %x, %externref zeroinitializer ret %externref %r } define i32 @is_null_zero_externref() { ; CHECK-LABEL: is_null_zero_externref: ; CHECK: .functype is_null_zero_externref () -> (i32) ; CHECK-NEXT: # %bb.0: ; CHECK-NEXT: ref.null_extern ; CHECK-NEXT: ref.is_null ; CHECK-NEXT: # fallthrough-return %r = call i32 @llvm.wasm.ref.is_null.extern(%externref zeroinitializer) ret i32 %r }