80 lines · plain
1; RUN: llc --mtriple=wasm32-unknown-unknown -asm-verbose=false -mattr=+reference-types < %s | FileCheck %s2 3%funcref = type ptr addrspace(20) ;; addrspace 20 is nonintegral4 5@funcref_table = local_unnamed_addr addrspace(1) global [0 x %funcref] undef6 7declare void @llvm.wasm.table.set.funcref(ptr addrspace(1), i32, %funcref) nounwind8 9define void @set_funcref_table(%funcref %g, i32 %i) {10; CHECK-LABEL: set_funcref_table:11; CHECK-NEXT: .functype set_funcref_table (funcref, i32) -> ()12; CHECK-NEXT: local.get 113; CHECK-NEXT: local.get 014; CHECK-NEXT: table.set funcref_table15; CHECK-NEXT: end_function16 17;; this generates a table.set of @funcref_table18 call void @llvm.wasm.table.set.funcref(ptr addrspace(1) @funcref_table, i32 %i, %funcref %g)19 ret void20}21 22define void @set_funcref_table_const(%funcref %g) {23; CHECK-LABEL: set_funcref_table_const:24; CHECK-NEXT: .functype set_funcref_table_const (funcref) -> ()25; CHECK-NEXT: i32.const 026; CHECK-NEXT: local.get 027; CHECK-NEXT: table.set funcref_table28; CHECK-NEXT: end_function29 call void @llvm.wasm.table.set.funcref(ptr addrspace(1) @funcref_table, i32 0, %funcref %g)30 ret void31}32 33define void @set_funcref_table_with_offset(%funcref %g, i32 %i) {34; CHECK-LABEL: set_funcref_table_with_offset:35; CHECK-NEXT: .functype set_funcref_table_with_offset (funcref, i32) -> ()36; CHECK-NEXT: local.get 137; CHECK-NEXT: i32.const 238; CHECK-NEXT: i32.add39; CHECK-NEXT: local.get 040; CHECK-NEXT: table.set funcref_table41; CHECK-NEXT: end_function42 %off = add nsw i32 %i, 243 call void @llvm.wasm.table.set.funcref(ptr addrspace(1) @funcref_table, i32 %off, %funcref %g)44 ret void45}46 47define void @set_funcref_table_with_var_offset(%funcref %g, i32 %i, i32 %j) {48; CHECK-LABEL: set_funcref_table_with_var_offset:49; CHECK-NEXT: .functype set_funcref_table_with_var_offset (funcref, i32, i32) -> ()50; CHECK-NEXT: local.get 151; CHECK-NEXT: local.get 252; CHECK-NEXT: i32.add53; CHECK-NEXT: local.get 054; CHECK-NEXT: table.set funcref_table55; CHECK-NEXT: end_function56 %off = add nsw i32 %i, %j57 call void @llvm.wasm.table.set.funcref(ptr addrspace(1) @funcref_table, i32 %off, %funcref %g)58 ret void59}60 61declare i32 @set_offset()62 63define void @set_funcref_table_with_var_offset2(%funcref %g, i32 %i) {64; CHECK-LABEL: set_funcref_table_with_var_offset2:65; CHECK-NEXT: .functype set_funcref_table_with_var_offset2 (funcref, i32) -> ()66; CHECK-NEXT: local.get 167; CHECK-NEXT: call set_offset68; CHECK-NEXT: i32.add69; CHECK-NEXT: local.get 070; CHECK-NEXT: table.set funcref_table71; CHECK-NEXT: end_function72 %j = call i32 @set_offset()73 %off = add nsw i32 %i, %j74 call void @llvm.wasm.table.set.funcref(ptr addrspace(1) @funcref_table, i32 %off, %funcref %g)75 ret void76}77 78; CHECK: .tabletype funcref_table, funcref79; CHECK-LABEL: funcref_table:80