| ; 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 | |
| } |