16d0c7bc1SPaulo Matos; RUN: llc --mtriple=wasm32-unknown-unknown -asm-verbose=false -mattr=+reference-types < %s | FileCheck %s 26d0c7bc1SPaulo Matos 380fb7823SAlex Bradbury%funcref = type ptr addrspace(20) ;; addrspace 20 is nonintegral 46d0c7bc1SPaulo Matos 56d0c7bc1SPaulo Matos@funcref_table = local_unnamed_addr addrspace(1) global [0 x %funcref] undef 66d0c7bc1SPaulo Matos 7*1bd1a440SPaulo Matosdeclare void @llvm.wasm.table.set.funcref(ptr addrspace(1), i32, %funcref) nounwind 8*1bd1a440SPaulo Matos 96d0c7bc1SPaulo Matosdefine void @set_funcref_table(%funcref %g, i32 %i) { 106d0c7bc1SPaulo Matos; CHECK-LABEL: set_funcref_table: 116d0c7bc1SPaulo Matos; CHECK-NEXT: .functype set_funcref_table (funcref, i32) -> () 126d0c7bc1SPaulo Matos; CHECK-NEXT: local.get 1 136d0c7bc1SPaulo Matos; CHECK-NEXT: local.get 0 146d0c7bc1SPaulo Matos; CHECK-NEXT: table.set funcref_table 156d0c7bc1SPaulo Matos; CHECK-NEXT: end_function 166d0c7bc1SPaulo Matos 176d0c7bc1SPaulo Matos;; this generates a table.set of @funcref_table 18*1bd1a440SPaulo Matos call void @llvm.wasm.table.set.funcref(ptr addrspace(1) @funcref_table, i32 %i, %funcref %g) 196d0c7bc1SPaulo Matos ret void 206d0c7bc1SPaulo Matos} 216d0c7bc1SPaulo Matos 226d0c7bc1SPaulo Matosdefine void @set_funcref_table_const(%funcref %g) { 236d0c7bc1SPaulo Matos; CHECK-LABEL: set_funcref_table_const: 246d0c7bc1SPaulo Matos; CHECK-NEXT: .functype set_funcref_table_const (funcref) -> () 256d0c7bc1SPaulo Matos; CHECK-NEXT: i32.const 0 266d0c7bc1SPaulo Matos; CHECK-NEXT: local.get 0 276d0c7bc1SPaulo Matos; CHECK-NEXT: table.set funcref_table 286d0c7bc1SPaulo Matos; CHECK-NEXT: end_function 29*1bd1a440SPaulo Matos call void @llvm.wasm.table.set.funcref(ptr addrspace(1) @funcref_table, i32 0, %funcref %g) 306d0c7bc1SPaulo Matos ret void 316d0c7bc1SPaulo Matos} 326d0c7bc1SPaulo Matos 336d0c7bc1SPaulo Matosdefine void @set_funcref_table_with_offset(%funcref %g, i32 %i) { 346d0c7bc1SPaulo Matos; CHECK-LABEL: set_funcref_table_with_offset: 356d0c7bc1SPaulo Matos; CHECK-NEXT: .functype set_funcref_table_with_offset (funcref, i32) -> () 366d0c7bc1SPaulo Matos; CHECK-NEXT: local.get 1 376d0c7bc1SPaulo Matos; CHECK-NEXT: i32.const 2 386d0c7bc1SPaulo Matos; CHECK-NEXT: i32.add 396d0c7bc1SPaulo Matos; CHECK-NEXT: local.get 0 406d0c7bc1SPaulo Matos; CHECK-NEXT: table.set funcref_table 416d0c7bc1SPaulo Matos; CHECK-NEXT: end_function 426d0c7bc1SPaulo Matos %off = add nsw i32 %i, 2 43*1bd1a440SPaulo Matos call void @llvm.wasm.table.set.funcref(ptr addrspace(1) @funcref_table, i32 %off, %funcref %g) 446d0c7bc1SPaulo Matos ret void 456d0c7bc1SPaulo Matos} 466d0c7bc1SPaulo Matos 476d0c7bc1SPaulo Matosdefine void @set_funcref_table_with_var_offset(%funcref %g, i32 %i, i32 %j) { 486d0c7bc1SPaulo Matos; CHECK-LABEL: set_funcref_table_with_var_offset: 496d0c7bc1SPaulo Matos; CHECK-NEXT: .functype set_funcref_table_with_var_offset (funcref, i32, i32) -> () 506d0c7bc1SPaulo Matos; CHECK-NEXT: local.get 1 516d0c7bc1SPaulo Matos; CHECK-NEXT: local.get 2 526d0c7bc1SPaulo Matos; CHECK-NEXT: i32.add 536d0c7bc1SPaulo Matos; CHECK-NEXT: local.get 0 546d0c7bc1SPaulo Matos; CHECK-NEXT: table.set funcref_table 556d0c7bc1SPaulo Matos; CHECK-NEXT: end_function 566d0c7bc1SPaulo Matos %off = add nsw i32 %i, %j 57*1bd1a440SPaulo Matos call void @llvm.wasm.table.set.funcref(ptr addrspace(1) @funcref_table, i32 %off, %funcref %g) 586d0c7bc1SPaulo Matos ret void 596d0c7bc1SPaulo Matos} 606d0c7bc1SPaulo Matos 616d0c7bc1SPaulo Matosdeclare i32 @set_offset() 626d0c7bc1SPaulo Matos 636d0c7bc1SPaulo Matosdefine void @set_funcref_table_with_var_offset2(%funcref %g, i32 %i) { 646d0c7bc1SPaulo Matos; CHECK-LABEL: set_funcref_table_with_var_offset2: 656d0c7bc1SPaulo Matos; CHECK-NEXT: .functype set_funcref_table_with_var_offset2 (funcref, i32) -> () 666d0c7bc1SPaulo Matos; CHECK-NEXT: local.get 1 676d0c7bc1SPaulo Matos; CHECK-NEXT: call set_offset 686d0c7bc1SPaulo Matos; CHECK-NEXT: i32.add 696d0c7bc1SPaulo Matos; CHECK-NEXT: local.get 0 706d0c7bc1SPaulo Matos; CHECK-NEXT: table.set funcref_table 716d0c7bc1SPaulo Matos; CHECK-NEXT: end_function 726d0c7bc1SPaulo Matos %j = call i32 @set_offset() 736d0c7bc1SPaulo Matos %off = add nsw i32 %i, %j 74*1bd1a440SPaulo Matos call void @llvm.wasm.table.set.funcref(ptr addrspace(1) @funcref_table, i32 %off, %funcref %g) 756d0c7bc1SPaulo Matos ret void 766d0c7bc1SPaulo Matos} 776d0c7bc1SPaulo Matos 78b5b5f0acSPaulo Matos; CHECK: .tabletype funcref_table, funcref 79c67c9cfeSPaulo Matos; CHECK-LABEL: funcref_table: 80