1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc --mtriple=wasm32-unknown-unknown -mattr=+reference-types < %s | FileCheck %s
3
4%extern = type opaque
5%externref = type %extern addrspace(10)* ;; addrspace 10 is nonintegral
6%funcref = type i8 addrspace(20)*      ;; addrspace 20 is nonintegral
7
8declare %externref @llvm.wasm.ref.null.extern() nounwind
9declare %funcref @llvm.wasm.ref.null.func() nounwind
10declare i32 @llvm.wasm.ref.is_null.extern(%externref) nounwind
11declare i32 @llvm.wasm.ref.is_null.func(%funcref) nounwind
12
13define %externref @get_null_extern() {
14; CHECK-LABEL: get_null_extern:
15; CHECK:         .functype get_null_extern () -> (externref)
16; CHECK-NEXT:  # %bb.0:
17; CHECK-NEXT:    ref.null_extern
18; CHECK-NEXT:    # fallthrough-return
19  %null = call %externref @llvm.wasm.ref.null.extern()
20  ret %externref %null
21}
22
23define %funcref @get_null_func() {
24; CHECK-LABEL: get_null_func:
25; CHECK:         .functype get_null_func () -> (funcref)
26; CHECK-NEXT:  # %bb.0:
27; CHECK-NEXT:    ref.null_func
28; CHECK-NEXT:    # fallthrough-return
29  %null = call %funcref @llvm.wasm.ref.null.func()
30  ret %funcref %null
31}
32
33define i32 @ref_is_null_extern(%externref %eref) {
34; CHECK-LABEL: ref_is_null_extern:
35; CHECK:         .functype ref_is_null_extern (externref) -> (i32)
36; CHECK-NEXT:  # %bb.0:
37; CHECK-NEXT:    ref.null_extern
38; CHECK-NEXT:    ref.is_null
39; CHECK-NEXT:    local.get 0
40; CHECK-NEXT:    ref.is_null
41; CHECK-NEXT:    i32.add
42; CHECK-NEXT:    # fallthrough-return
43  %null = call %externref @llvm.wasm.ref.null.extern()
44  %is_null = call i32 @llvm.wasm.ref.is_null.extern(%externref %null)
45  %arg_is_null = call i32 @llvm.wasm.ref.is_null.extern(%externref %eref)
46  %res = add i32 %is_null, %arg_is_null
47  ret i32 %res
48}
49
50define i32 @ref_is_null_func(%funcref %fref) {
51; CHECK-LABEL: ref_is_null_func:
52; CHECK:         .functype ref_is_null_func (funcref) -> (i32)
53; CHECK-NEXT:  # %bb.0:
54; CHECK-NEXT:    ref.null_func
55; CHECK-NEXT:    ref.is_null
56; CHECK-NEXT:    local.get 0
57; CHECK-NEXT:    ref.is_null
58; CHECK-NEXT:    i32.add
59; CHECK-NEXT:    # fallthrough-return
60  %null = call %funcref @llvm.wasm.ref.null.func()
61  %is_null = call i32 @llvm.wasm.ref.is_null.func(%funcref %null)
62  %arg_is_null = call i32 @llvm.wasm.ref.is_null.func(%funcref %fref)
63  %res = add i32 %is_null, %arg_is_null
64  ret i32 %res
65}
66