blob: 7483a72d0b96c2691467c29ef708d07723cd6e6f [file]
; 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
}