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