94 lines · plain
1; RUN: llc --mtriple=wasm32-unknown-unknown -asm-verbose=false -mattr=+reference-types < %s | FileCheck %s2 3%externref = type ptr addrspace(10) ;; addrspace 10 is nonintegral4 5@externref_table = local_unnamed_addr addrspace(1) global [0 x %externref] undef6 7declare void @llvm.wasm.table.set.externref(ptr addrspace(1), i32, %externref) nounwind8 9define void @set_externref_table(%externref %g, i32 %i) {10; CHECK-LABEL: set_externref_table:11; CHECK-NEXT: .functype set_externref_table (externref, i32) -> ()12; CHECK-NEXT: local.get 113; CHECK-NEXT: local.get 014; CHECK-NEXT: table.set externref_table15; CHECK-NEXT: end_function16 17;; this generates a table.set of @externref_table18 call void @llvm.wasm.table.set.externref(ptr addrspace(1) @externref_table, i32 %i, %externref %g)19 ret void20}21 22define void @set_externref_table_const(%externref %g) {23; CHECK-LABEL: set_externref_table_const:24; CHECK-NEXT: .functype set_externref_table_const (externref) -> ()25; CHECK-NEXT: i32.const 026; CHECK-NEXT: local.get 027; CHECK-NEXT: table.set externref_table28; CHECK-NEXT: end_function29 call void @llvm.wasm.table.set.externref(ptr addrspace(1) @externref_table, i32 0, %externref %g)30 ret void31}32 33define void @set_externref_table_with_offset(%externref %g, i32 %i) {34; CHECK-LABEL: set_externref_table_with_offset:35; CHECK-NEXT: .functype set_externref_table_with_offset (externref, 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 externref_table41; CHECK-NEXT: end_function42 %off = add nsw i32 %i, 243 call void @llvm.wasm.table.set.externref(ptr addrspace(1) @externref_table, i32 %off, %externref %g)44 ret void45}46 47define void @set_externref_table_with_var_offset(%externref %g, i32 %i, i32 %j) {48; CHECK-LABEL: set_externref_table_with_var_offset:49; CHECK-NEXT: .functype set_externref_table_with_var_offset (externref, 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 externref_table55; CHECK-NEXT: end_function56 %off = add nsw i32 %i, %j57 call void @llvm.wasm.table.set.externref(ptr addrspace(1) @externref_table, i32 %off, %externref %g)58 ret void59}60 61declare i32 @set_offset()62 63define void @set_externref_table_with_var_offset2(%externref %g, i32 %i) {64; CHECK-LABEL: set_externref_table_with_var_offset2:65; CHECK-NEXT: .functype set_externref_table_with_var_offset2 (externref, 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 externref_table71; CHECK-NEXT: end_function72 %j = call i32 @set_offset()73 %off = add nsw i32 %i, %j74 call void @llvm.wasm.table.set.externref(ptr addrspace(1) @externref_table, i32 %off, %externref %g)75 ret void76}77 78declare i32 @get_table_slot() local_unnamed_addr79 80define void @set_externref_table_with_id_from_call(%externref %g) {81; CHECK-LABEL: set_externref_table_with_id_from_call:82; CHECK-NEXT: .functype set_externref_table_with_id_from_call (externref) -> ()83; CHECK-NEXT: call get_table_slot84; CHECK-NEXT: local.get 085; CHECK-NEXT: table.set externref_table86; CHECK-NEXT: end_function87 %id = call i32 @get_table_slot()88 call void @llvm.wasm.table.set.externref(ptr addrspace(1) @externref_table, i32 %id, %externref %g)89 ret void90}91 92; CHECK: .tabletype externref_table, externref93; CHECK-LABEL: externref_table:94