1c6f8adadSAlex Zinenko// RUN: mlir-opt -split-input-file -verify-diagnostics %s | mlir-opt | FileCheck %s 2c6f8adadSAlex Zinenko// RUN: mlir-opt -split-input-file -verify-diagnostics -mlir-print-op-generic %s | FileCheck %s --check-prefix=GENERIC 36d2bbba1SVictor Perez// RUN: mlir-opt -split-input-file -verify-diagnostics -mlir-print-debuginfo %s | mlir-opt -split-input-file -mlir-print-debuginfo | FileCheck %s --check-prefix=LOCINFO 437c750a5SHendrik Greving// RUN: mlir-translate -mlir-to-llvmir -split-input-file -verify-diagnostics %s | FileCheck %s --check-prefix=CHECK-LLVM 5c6f8adadSAlex Zinenko 6c6f8adadSAlex Zinenkomodule { 7c6f8adadSAlex Zinenko // GENERIC: "llvm.func" 87151b94cSMehdi Amini // GENERIC-SAME: function_type = !llvm.func<void ()> 94a3460a7SRiver Riddle // GENERIC-SAME: sym_name = "foo" 107151b94cSMehdi Amini // GENERIC: () -> () 11c6f8adadSAlex Zinenko // CHECK: llvm.func @foo() 12c6f8adadSAlex Zinenko "llvm.func" () ({ 134a3460a7SRiver Riddle }) {sym_name = "foo", function_type = !llvm.func<void ()>} : () -> () 14c6f8adadSAlex Zinenko 15c6f8adadSAlex Zinenko // GENERIC: "llvm.func" 167151b94cSMehdi Amini // GENERIC-SAME: function_type = !llvm.func<i64 (i64, i64)> 174a3460a7SRiver Riddle // GENERIC-SAME: sym_name = "bar" 187151b94cSMehdi Amini // GENERIC: () -> () 192230bf99SAlex Zinenko // CHECK: llvm.func @bar(i64, i64) -> i64 20c6f8adadSAlex Zinenko "llvm.func"() ({ 214a3460a7SRiver Riddle }) {sym_name = "bar", function_type = !llvm.func<i64 (i64, i64)>} : () -> () 22c6f8adadSAlex Zinenko 23c6f8adadSAlex Zinenko // GENERIC: "llvm.func" 247151b94cSMehdi Amini // GENERIC-SAME: function_type = !llvm.func<i64 (i64)> 257151b94cSMehdi Amini // GENERIC-SAME: sym_name = "baz" 262230bf99SAlex Zinenko // CHECK: llvm.func @baz(%{{.*}}: i64) -> i64 277151b94cSMehdi Amini "llvm.func"() <{sym_name = "baz", function_type = !llvm.func<i64 (i64)>}> ({ 28c6f8adadSAlex Zinenko // GENERIC: ^bb0 292230bf99SAlex Zinenko ^bb0(%arg0: i64): 30c6f8adadSAlex Zinenko // GENERIC: llvm.return 312230bf99SAlex Zinenko llvm.return %arg0 : i64 32c6f8adadSAlex Zinenko 337151b94cSMehdi Amini // GENERIC: () -> () 347151b94cSMehdi Amini }) : () -> () 35c6f8adadSAlex Zinenko 36b0cd5b2aSTobias Gysi // CHECK: llvm.func @qux(!llvm.ptr {llvm.noalias}, i64) 37b5af3784SAlex Zinenko // CHECK: attributes {xxx = {yyy = 42 : i64}} 38c6f8adadSAlex Zinenko "llvm.func"() ({ 39b0cd5b2aSTobias Gysi }) {sym_name = "qux", function_type = !llvm.func<void (ptr, i64)>, 401c777ab4SUday Bondhugula arg_attrs = [{llvm.noalias}, {}], xxx = {yyy = 42}} : () -> () 41c6f8adadSAlex Zinenko 42c6f8adadSAlex Zinenko // CHECK: llvm.func @roundtrip1() 43c6f8adadSAlex Zinenko llvm.func @roundtrip1() 44c6f8adadSAlex Zinenko 45dd5165a9SAlex Zinenko // CHECK: llvm.func @roundtrip2(i64, f32) -> f64 46dd5165a9SAlex Zinenko llvm.func @roundtrip2(i64, f32) -> f64 47c6f8adadSAlex Zinenko 482230bf99SAlex Zinenko // CHECK: llvm.func @roundtrip3(i32, i1) 492230bf99SAlex Zinenko llvm.func @roundtrip3(%a: i32, %b: i1) 50c6f8adadSAlex Zinenko 512230bf99SAlex Zinenko // CHECK: llvm.func @roundtrip4(%{{.*}}: i32, %{{.*}}: i1) { 522230bf99SAlex Zinenko llvm.func @roundtrip4(%a: i32, %b: i1) { 53c6f8adadSAlex Zinenko llvm.return 54c6f8adadSAlex Zinenko } 55c6f8adadSAlex Zinenko 56c6f8adadSAlex Zinenko // CHECK: llvm.func @roundtrip5() 57b5af3784SAlex Zinenko // CHECK: attributes {baz = 42 : i64, foo = "bar"} 58c6f8adadSAlex Zinenko llvm.func @roundtrip5() attributes {foo = "bar", baz = 42} 59c6f8adadSAlex Zinenko 60c6f8adadSAlex Zinenko // CHECK: llvm.func @roundtrip6() 61b5af3784SAlex Zinenko // CHECK: attributes {baz = 42 : i64, foo = "bar"} 62c6f8adadSAlex Zinenko llvm.func @roundtrip6() attributes {foo = "bar", baz = 42} { 63c6f8adadSAlex Zinenko llvm.return 64c6f8adadSAlex Zinenko } 65c6f8adadSAlex Zinenko 66c6f8adadSAlex Zinenko // CHECK: llvm.func @roundtrip7() { 67c6f8adadSAlex Zinenko llvm.func @roundtrip7() attributes {} { 68c6f8adadSAlex Zinenko llvm.return 69c6f8adadSAlex Zinenko } 70c6f8adadSAlex Zinenko 712230bf99SAlex Zinenko // CHECK: llvm.func @roundtrip8() -> i32 722230bf99SAlex Zinenko llvm.func @roundtrip8() -> i32 attributes {} 73c6f8adadSAlex Zinenko 74b0cd5b2aSTobias Gysi // CHECK: llvm.func @roundtrip9(!llvm.ptr {llvm.noalias}) 75b0cd5b2aSTobias Gysi llvm.func @roundtrip9(!llvm.ptr {llvm.noalias}) 76c6f8adadSAlex Zinenko 77b0cd5b2aSTobias Gysi // CHECK: llvm.func @roundtrip10(!llvm.ptr {llvm.noalias}) 78b0cd5b2aSTobias Gysi llvm.func @roundtrip10(%arg0: !llvm.ptr {llvm.noalias}) 79c6f8adadSAlex Zinenko 80b0cd5b2aSTobias Gysi // CHECK: llvm.func @roundtrip11(%{{.*}}: !llvm.ptr {llvm.noalias}) { 81b0cd5b2aSTobias Gysi llvm.func @roundtrip11(%arg0: !llvm.ptr {llvm.noalias}) { 82c6f8adadSAlex Zinenko llvm.return 83c6f8adadSAlex Zinenko } 84c6f8adadSAlex Zinenko 85b0cd5b2aSTobias Gysi // CHECK: llvm.func @roundtrip12(%{{.*}}: !llvm.ptr {llvm.noalias}) 86b5af3784SAlex Zinenko // CHECK: attributes {foo = 42 : i32} 87b0cd5b2aSTobias Gysi llvm.func @roundtrip12(%arg0: !llvm.ptr {llvm.noalias}) 88c6f8adadSAlex Zinenko attributes {foo = 42 : i32} { 89c6f8adadSAlex Zinenko llvm.return 90c6f8adadSAlex Zinenko } 91c6f8adadSAlex Zinenko 92b0cd5b2aSTobias Gysi // CHECK: llvm.func @byvalattr(%{{.*}}: !llvm.ptr {llvm.byval = i32}) 93b0cd5b2aSTobias Gysi llvm.func @byvalattr(%arg0: !llvm.ptr {llvm.byval = i32}) { 9470b841acSEric Schweitz llvm.return 9570b841acSEric Schweitz } 9670b841acSEric Schweitz 97b0cd5b2aSTobias Gysi // CHECK: llvm.func @sretattr(%{{.*}}: !llvm.ptr {llvm.sret = i32}) 98b0cd5b2aSTobias Gysi // LOCINFO: llvm.func @sretattr(%{{.*}}: !llvm.ptr {llvm.sret = i32} loc("some_source_loc")) 99b0cd5b2aSTobias Gysi llvm.func @sretattr(%arg0: !llvm.ptr {llvm.sret = i32} loc("some_source_loc")) { 10070b841acSEric Schweitz llvm.return 10170b841acSEric Schweitz } 10270b841acSEric Schweitz 103b0cd5b2aSTobias Gysi // CHECK: llvm.func @nestattr(%{{.*}}: !llvm.ptr {llvm.nest}) 104b0cd5b2aSTobias Gysi llvm.func @nestattr(%arg0: !llvm.ptr {llvm.nest}) { 1051c083e69SEric Schweitz llvm.return 1061c083e69SEric Schweitz } 1071c083e69SEric Schweitz 108b0cd5b2aSTobias Gysi // CHECK: llvm.func @llvm_noalias_decl(!llvm.ptr {llvm.noalias}) 109b0cd5b2aSTobias Gysi llvm.func @llvm_noalias_decl(!llvm.ptr {llvm.noalias}) 110b0cd5b2aSTobias Gysi // CHECK: llvm.func @byrefattr_decl(!llvm.ptr {llvm.byref = i32}) 111b0cd5b2aSTobias Gysi llvm.func @byrefattr_decl(!llvm.ptr {llvm.byref = i32}) 112b0cd5b2aSTobias Gysi // CHECK: llvm.func @byvalattr_decl(!llvm.ptr {llvm.byval = i32}) 113b0cd5b2aSTobias Gysi llvm.func @byvalattr_decl(!llvm.ptr {llvm.byval = i32}) 114b0cd5b2aSTobias Gysi // CHECK: llvm.func @sretattr_decl(!llvm.ptr {llvm.sret = i32}) 115b0cd5b2aSTobias Gysi llvm.func @sretattr_decl(!llvm.ptr {llvm.sret = i32}) 116b0cd5b2aSTobias Gysi // CHECK: llvm.func @nestattr_decl(!llvm.ptr {llvm.nest}) 117b0cd5b2aSTobias Gysi llvm.func @nestattr_decl(!llvm.ptr {llvm.nest}) 118473d0011SSlava Zakharin // CHECK: llvm.func @noundefattr_decl(i32 {llvm.noundef}) 119473d0011SSlava Zakharin llvm.func @noundefattr_decl(i32 {llvm.noundef}) 120b0cd5b2aSTobias Gysi // CHECK: llvm.func @llvm_align_decl(!llvm.ptr {llvm.align = 4 : i64}) 121b0cd5b2aSTobias Gysi llvm.func @llvm_align_decl(!llvm.ptr {llvm.align = 4}) 122b0cd5b2aSTobias Gysi // CHECK: llvm.func @inallocaattr_decl(!llvm.ptr {llvm.inalloca = i32}) 123b0cd5b2aSTobias Gysi llvm.func @inallocaattr_decl(!llvm.ptr {llvm.inalloca = i32}) 124473d0011SSlava Zakharin 125473d0011SSlava Zakharin 126c6f8adadSAlex Zinenko // CHECK: llvm.func @variadic(...) 127c6f8adadSAlex Zinenko llvm.func @variadic(...) 128c6f8adadSAlex Zinenko 1292230bf99SAlex Zinenko // CHECK: llvm.func @variadic_args(i32, i32, ...) 1302230bf99SAlex Zinenko llvm.func @variadic_args(i32, i32, ...) 131fdbb99cdSAlex Zinenko 132fdbb99cdSAlex Zinenko // 133fdbb99cdSAlex Zinenko // Check that functions can have linkage attributes. 134fdbb99cdSAlex Zinenko // 135fdbb99cdSAlex Zinenko 136fdbb99cdSAlex Zinenko // CHECK: llvm.func internal 137fdbb99cdSAlex Zinenko llvm.func internal @internal_func() { 138fdbb99cdSAlex Zinenko llvm.return 139fdbb99cdSAlex Zinenko } 140fdbb99cdSAlex Zinenko 141fdbb99cdSAlex Zinenko // CHECK: llvm.func weak 142fdbb99cdSAlex Zinenko llvm.func weak @weak_linkage() { 143fdbb99cdSAlex Zinenko llvm.return 144fdbb99cdSAlex Zinenko } 145fdbb99cdSAlex Zinenko 14637c750a5SHendrik Greving // CHECK-LLVM: define ptx_kernel void @calling_conv 14737c750a5SHendrik Greving llvm.func ptx_kernelcc @calling_conv() { 14837c750a5SHendrik Greving llvm.return 14937c750a5SHendrik Greving } 15037c750a5SHendrik Greving 151fdbb99cdSAlex Zinenko // Omit the `external` linkage, which is the default, in the custom format. 152fdbb99cdSAlex Zinenko // Check that it is present in the generic format using its numeric value. 153fdbb99cdSAlex Zinenko // 154fdbb99cdSAlex Zinenko // CHECK: llvm.func @external_func 15578accf9fSMehdi Amini // GENERIC: linkage = #llvm.linkage<external> 156fdbb99cdSAlex Zinenko llvm.func external @external_func() 157541d89b0SSam Carroll 158541d89b0SSam Carroll // CHECK-LABEL: llvm.func @arg_struct_attr( 159541d89b0SSam Carroll // CHECK-SAME: %{{.*}}: !llvm.struct<(i32)> {llvm.struct_attrs = [{llvm.noalias}]}) { 160541d89b0SSam Carroll llvm.func @arg_struct_attr( 161541d89b0SSam Carroll %arg0 : !llvm.struct<(i32)> {llvm.struct_attrs = [{llvm.noalias}]}) { 162541d89b0SSam Carroll llvm.return 163541d89b0SSam Carroll } 164541d89b0SSam Carroll 165541d89b0SSam Carroll // CHECK-LABEL: llvm.func @res_struct_attr(%{{.*}}: !llvm.struct<(i32)>) 166541d89b0SSam Carroll // CHECK-SAME:-> (!llvm.struct<(i32)> {llvm.struct_attrs = [{llvm.noalias}]}) { 167541d89b0SSam Carroll llvm.func @res_struct_attr(%arg0 : !llvm.struct<(i32)>) 168541d89b0SSam Carroll -> (!llvm.struct<(i32)> {llvm.struct_attrs = [{llvm.noalias}]}) { 169541d89b0SSam Carroll llvm.return %arg0 : !llvm.struct<(i32)> 170541d89b0SSam Carroll } 1710252357bSAlexander Batashev 1720252357bSAlexander Batashev // CHECK: llvm.func @cconv1 1730252357bSAlexander Batashev llvm.func ccc @cconv1() { 1740252357bSAlexander Batashev llvm.return 1750252357bSAlexander Batashev } 1760252357bSAlexander Batashev 1770252357bSAlexander Batashev // CHECK: llvm.func weak @cconv2 1780252357bSAlexander Batashev llvm.func weak ccc @cconv2() { 1790252357bSAlexander Batashev llvm.return 1800252357bSAlexander Batashev } 1810252357bSAlexander Batashev 1820252357bSAlexander Batashev // CHECK: llvm.func weak fastcc @cconv3 1830252357bSAlexander Batashev llvm.func weak fastcc @cconv3() { 1840252357bSAlexander Batashev llvm.return 1850252357bSAlexander Batashev } 186856056d1SMin-Yih Hsu 18765fedb43SSirraide // CHECK: llvm.func cc_10 @cconv4 18865fedb43SSirraide llvm.func cc_10 @cconv4() { 18965fedb43SSirraide llvm.return 19065fedb43SSirraide } 19165fedb43SSirraide 19265fedb43SSirraide // CHECK: llvm.func @test_ccs 19365fedb43SSirraide llvm.func @test_ccs() { 19453403473STobias Gysi // CHECK-NEXT: %[[PTR:.*]] = llvm.mlir.addressof @cconv4 : !llvm.ptr 19553403473STobias Gysi %ptr = llvm.mlir.addressof @cconv4 : !llvm.ptr 19665fedb43SSirraide // CHECK-NEXT: llvm.call @cconv1() : () -> () 19765fedb43SSirraide // CHECK-NEXT: llvm.call @cconv2() : () -> () 19865fedb43SSirraide // CHECK-NEXT: llvm.call fastcc @cconv3() : () -> () 19953403473STobias Gysi // CHECK-NEXT: llvm.call cc_10 %[[PTR]]() : !llvm.ptr, () -> () 20065fedb43SSirraide llvm.call @cconv1() : () -> () 20165fedb43SSirraide llvm.call ccc @cconv2() : () -> () 20265fedb43SSirraide llvm.call fastcc @cconv3() : () -> () 20353403473STobias Gysi llvm.call cc_10 %ptr() : !llvm.ptr, () -> () 20465fedb43SSirraide llvm.return 20565fedb43SSirraide } 20665fedb43SSirraide 207856056d1SMin-Yih Hsu // CHECK-LABEL: llvm.func @variadic_def 208856056d1SMin-Yih Hsu llvm.func @variadic_def(...) { 209856056d1SMin-Yih Hsu llvm.return 210856056d1SMin-Yih Hsu } 2119b9cfe77SChristian Ulmann 2129b9cfe77SChristian Ulmann // CHECK-LABEL: llvm.func @memory_attr 2139b9cfe77SChristian Ulmann // CHECK-SAME: attributes {memory = #llvm.memory_effects<other = none, argMem = read, inaccessibleMem = readwrite>} { 2149b9cfe77SChristian Ulmann llvm.func @memory_attr() attributes {memory = #llvm.memory_effects<other = none, argMem = read, inaccessibleMem = readwrite>} { 2159b9cfe77SChristian Ulmann llvm.return 2169b9cfe77SChristian Ulmann } 2176628767eSChristian Ulmann 2186628767eSChristian Ulmann // CHECK-LABEL: llvm.func hidden @hidden 2196628767eSChristian Ulmann llvm.func hidden @hidden() { 2206628767eSChristian Ulmann llvm.return 2216628767eSChristian Ulmann } 2226628767eSChristian Ulmann 2236628767eSChristian Ulmann // CHECK-LABEL: llvm.func protected @protected 2246628767eSChristian Ulmann llvm.func protected @protected() { 2256628767eSChristian Ulmann llvm.return 2266628767eSChristian Ulmann } 227b126ee65STobias Gysi 22810417b13SChristian Ulmann // CHECK-LABEL: local_unnamed_addr @local_unnamed_addr_func 22910417b13SChristian Ulmann llvm.func local_unnamed_addr @local_unnamed_addr_func() { 23010417b13SChristian Ulmann llvm.return 231c55a8861SChristian Ulmann } 232c55a8861SChristian Ulmann 233c55a8861SChristian Ulmann // CHECK-LABEL: @align_func 234c55a8861SChristian Ulmann // CHECK-SAME: attributes {alignment = 2 : i64} 235c55a8861SChristian Ulmann llvm.func @align_func() attributes {alignment = 2 : i64} { 236c55a8861SChristian Ulmann llvm.return 23710417b13SChristian Ulmann } 23810417b13SChristian Ulmann 239b126ee65STobias Gysi // CHECK: llvm.comdat @__llvm_comdat 240b126ee65STobias Gysi llvm.comdat @__llvm_comdat { 241b126ee65STobias Gysi // CHECK: llvm.comdat_selector @any any 242b126ee65STobias Gysi llvm.comdat_selector @any any 243b126ee65STobias Gysi } 244b126ee65STobias Gysi // CHECK: @any() comdat(@__llvm_comdat::@any) attributes 245b126ee65STobias Gysi llvm.func @any() comdat(@__llvm_comdat::@any) attributes { dso_local } { 246b126ee65STobias Gysi llvm.return 247b126ee65STobias Gysi } 2485bfd5c60SMats Petersson 2495bfd5c60SMats Petersson llvm.func @vscale_roundtrip() vscale_range(1, 2) { 2505bfd5c60SMats Petersson // CHECK: @vscale_roundtrip 2515bfd5c60SMats Petersson // CHECK-SAME: vscale_range(1, 2) 2525bfd5c60SMats Petersson llvm.return 2535bfd5c60SMats Petersson } 2543257e4caSRadu Salavat 2553257e4caSRadu Salavat // CHECK-LABEL: @frame_pointer_roundtrip() 2563257e4caSRadu Salavat // CHECK-SAME: attributes {frame_pointer = #llvm.framePointerKind<"non-leaf">} 2573257e4caSRadu Salavat llvm.func @frame_pointer_roundtrip() attributes {frame_pointer = #llvm.framePointerKind<"non-leaf">} { 2583257e4caSRadu Salavat llvm.return 2593257e4caSRadu Salavat } 260748c2959SAlex Bradbury 261748c2959SAlex Bradbury llvm.func @unsafe_fp_math_roundtrip() attributes {unsafe_fp_math = true} { 262748c2959SAlex Bradbury // CHECK: @unsafe_fp_math_roundtrip 263748c2959SAlex Bradbury // CHECK-SAME: attributes {unsafe_fp_math = true} 264748c2959SAlex Bradbury llvm.return 265748c2959SAlex Bradbury } 266748c2959SAlex Bradbury 267748c2959SAlex Bradbury llvm.func @no_infs_fp_math_roundtrip() attributes {no_infs_fp_math = true} { 268748c2959SAlex Bradbury // CHECK: @no_infs_fp_math_roundtrip 269748c2959SAlex Bradbury // CHECK-SAME: attributes {no_infs_fp_math = true} 270748c2959SAlex Bradbury llvm.return 271748c2959SAlex Bradbury } 272748c2959SAlex Bradbury 273748c2959SAlex Bradbury llvm.func @no_nans_fp_math_roundtrip() attributes {no_nans_fp_math = true} { 274748c2959SAlex Bradbury // CHECK: @no_nans_fp_math_roundtrip 275748c2959SAlex Bradbury // CHECK-SAME: attributes {no_nans_fp_math = true} 276748c2959SAlex Bradbury llvm.return 277748c2959SAlex Bradbury } 278748c2959SAlex Bradbury 279748c2959SAlex Bradbury llvm.func @approx_func_fp_math_roundtrip() attributes {approx_func_fp_math = true} { 280748c2959SAlex Bradbury // CHECK: @approx_func_fp_math_roundtrip 281748c2959SAlex Bradbury // CHECK-SAME: attributes {approx_func_fp_math = true} 282748c2959SAlex Bradbury llvm.return 283748c2959SAlex Bradbury } 284748c2959SAlex Bradbury 285748c2959SAlex Bradbury llvm.func @no_signed_zeros_fp_math_roundtrip() attributes {no_signed_zeros_fp_math = true} { 286748c2959SAlex Bradbury // CHECK: @no_signed_zeros_fp_math_roundtrip 287748c2959SAlex Bradbury // CHECK-SAME: attributes {no_signed_zeros_fp_math = true} 288748c2959SAlex Bradbury llvm.return 289748c2959SAlex Bradbury } 290d6df0187SFinlay 291d6df0187SFinlay llvm.func @convergent_function() attributes {convergent} { 292d6df0187SFinlay // CHECK: @convergent_function 293d6df0187SFinlay // CHECK-SAME: attributes {convergent} 294d6df0187SFinlay llvm.return 295d6df0187SFinlay } 296e5865ec9Srunseny 297e5865ec9Srunseny llvm.func @denormal_fp_math_roundtrip() attributes {denormal_fp_math = "preserve-sign"} { 298e5865ec9Srunseny // CHECK: @denormal_fp_math_roundtrip 299e5865ec9Srunseny // CHECK-SAME: attributes {denormal_fp_math = "preserve-sign"} 300e5865ec9Srunseny llvm.return 301e5865ec9Srunseny } 302e5865ec9Srunseny 303e5865ec9Srunseny llvm.func @denormal_fp_math_f32_roundtrip() attributes {denormal_fp_math_f32 = "preserve-sign"} { 304e5865ec9Srunseny // CHECK: @denormal_fp_math_f32_roundtrip 305e5865ec9Srunseny // CHECK-SAME: attributes {denormal_fp_math_f32 = "preserve-sign"} 306e5865ec9Srunseny llvm.return 307e5865ec9Srunseny } 308e5865ec9Srunseny 309e5865ec9Srunseny llvm.func @fp_contract_roundtrip() attributes {fp_contract = "fast"} { 310e5865ec9Srunseny // CHECK: @fp_contract_roundtrip 311e5865ec9Srunseny // CHECK-SAME: attributes {fp_contract = "fast"} 312e5865ec9Srunseny llvm.return 313e5865ec9Srunseny } 314e5865ec9Srunseny 315aa21ee79SFinlay llvm.func @nounwind_function() attributes {no_unwind} { 316aa21ee79SFinlay // CHECK: @nounwind_function 317aa21ee79SFinlay // CHECK-SAME: attributes {no_unwind} 318aa21ee79SFinlay llvm.return 319aa21ee79SFinlay } 320aa21ee79SFinlay 321aa21ee79SFinlay llvm.func @willreturn_function() attributes {will_return} { 322aa21ee79SFinlay // CHECK: @willreturn_function 323aa21ee79SFinlay // CHECK-SAME: attributes {will_return} 324aa21ee79SFinlay llvm.return 325aa21ee79SFinlay } 326aa21ee79SFinlay 327aa21ee79SFinlay 328c6f8adadSAlex Zinenko} 329c6f8adadSAlex Zinenko 330c6f8adadSAlex Zinenko// ----- 331c6f8adadSAlex Zinenko 332c6f8adadSAlex Zinenkomodule { 3330359b86dSRiver Riddle // expected-error@+1 {{requires one region}} 3344a3460a7SRiver Riddle "llvm.func"() {function_type = !llvm.func<void ()>, sym_name = "no_region"} : () -> () 335c6f8adadSAlex Zinenko} 336c6f8adadSAlex Zinenko 337c6f8adadSAlex Zinenko// ----- 338c6f8adadSAlex Zinenko 339c6f8adadSAlex Zinenkomodule { 3404a3460a7SRiver Riddle // expected-error@+1 {{requires attribute 'function_type'}} 341c6f8adadSAlex Zinenko "llvm.func"() ({}) {sym_name = "missing_type"} : () -> () 342c6f8adadSAlex Zinenko} 343c6f8adadSAlex Zinenko 344c6f8adadSAlex Zinenko// ----- 345c6f8adadSAlex Zinenko 346c6f8adadSAlex Zinenkomodule { 3474a3460a7SRiver Riddle // expected-error@+1 {{attribute 'function_type' failed to satisfy constraint: type attribute of LLVM function type}} 3484a3460a7SRiver Riddle "llvm.func"() ({}) {sym_name = "non_llvm_type", function_type = i64} : () -> () 349c6f8adadSAlex Zinenko} 350c6f8adadSAlex Zinenko 351c6f8adadSAlex Zinenko// ----- 352c6f8adadSAlex Zinenko 353c6f8adadSAlex Zinenkomodule { 3544a3460a7SRiver Riddle // expected-error@+1 {{attribute 'function_type' failed to satisfy constraint: type attribute of LLVM function type}} 3554a3460a7SRiver Riddle "llvm.func"() ({}) {sym_name = "non_function_type", function_type = i64} : () -> () 356c6f8adadSAlex Zinenko} 357c6f8adadSAlex Zinenko 358c6f8adadSAlex Zinenko// ----- 359c6f8adadSAlex Zinenko 360c6f8adadSAlex Zinenkomodule { 361c6f8adadSAlex Zinenko // expected-error@+1 {{entry block must have 0 arguments}} 362c6f8adadSAlex Zinenko "llvm.func"() ({ 3632230bf99SAlex Zinenko ^bb0(%arg0: i64): 364c6f8adadSAlex Zinenko llvm.return 3654a3460a7SRiver Riddle }) {function_type = !llvm.func<void ()>, sym_name = "wrong_arg_number"} : () -> () 366c6f8adadSAlex Zinenko} 367c6f8adadSAlex Zinenko 368c6f8adadSAlex Zinenko// ----- 369c6f8adadSAlex Zinenko 370c6f8adadSAlex Zinenkomodule { 371f96a8675SRiver Riddle // expected-error@+1 {{entry block argument #0('tensor<*xf32>') must match the type of the corresponding argument in function signature('i64')}} 372c6f8adadSAlex Zinenko "llvm.func"() ({ 3732230bf99SAlex Zinenko ^bb0(%arg0: tensor<*xf32>): 374c6f8adadSAlex Zinenko llvm.return 3754a3460a7SRiver Riddle }) {function_type = !llvm.func<void (i64)>, sym_name = "wrong_arg_number"} : () -> () 376c6f8adadSAlex Zinenko} 377c6f8adadSAlex Zinenko 378c6f8adadSAlex Zinenko// ----- 379c6f8adadSAlex Zinenko 380c6f8adadSAlex Zinenkomodule { 381c6f8adadSAlex Zinenko // expected-error@+1 {{failed to construct function type: expected LLVM type for function arguments}} 3822230bf99SAlex Zinenko llvm.func @foo(tensor<*xf32>) 383c6f8adadSAlex Zinenko} 384c6f8adadSAlex Zinenko 385c6f8adadSAlex Zinenko// ----- 386c6f8adadSAlex Zinenko 387c6f8adadSAlex Zinenkomodule { 388c6f8adadSAlex Zinenko // expected-error@+1 {{failed to construct function type: expected LLVM type for function results}} 3892230bf99SAlex Zinenko llvm.func @foo() -> tensor<*xf32> 390c6f8adadSAlex Zinenko} 391c6f8adadSAlex Zinenko 392c6f8adadSAlex Zinenko// ----- 393c6f8adadSAlex Zinenko 394c6f8adadSAlex Zinenkomodule { 395c6f8adadSAlex Zinenko // expected-error@+1 {{failed to construct function type: expected zero or one function result}} 3962230bf99SAlex Zinenko llvm.func @foo() -> (i64, i64) 397c6f8adadSAlex Zinenko} 398c6f8adadSAlex Zinenko 399c6f8adadSAlex Zinenko// ----- 400c6f8adadSAlex Zinenko 401c6f8adadSAlex Zinenkomodule { 402c6f8adadSAlex Zinenko // expected-error@+1 {{variadic arguments must be in the end of the argument list}} 4032230bf99SAlex Zinenko llvm.func @variadic_inside(%arg0: i32, ..., %arg1: i32) 404c6f8adadSAlex Zinenko} 405fdbb99cdSAlex Zinenko 406fdbb99cdSAlex Zinenko// ----- 407fdbb99cdSAlex Zinenko 408fdbb99cdSAlex Zinenkomodule { 409fdbb99cdSAlex Zinenko // expected-error@+1 {{external functions must have 'external' or 'extern_weak' linkage}} 410fdbb99cdSAlex Zinenko llvm.func internal @internal_external_func() 411fdbb99cdSAlex Zinenko} 412fdbb99cdSAlex Zinenko 413fdbb99cdSAlex Zinenko// ----- 414fdbb99cdSAlex Zinenko 415fdbb99cdSAlex Zinenkomodule { 416fdbb99cdSAlex Zinenko // expected-error@+1 {{functions cannot have 'common' linkage}} 417fdbb99cdSAlex Zinenko llvm.func common @common_linkage_func() 418fdbb99cdSAlex Zinenko} 4190252357bSAlexander Batashev 4200252357bSAlexander Batashev// ----- 4210252357bSAlexander Batashev 4220252357bSAlexander Batashevmodule { 4230252357bSAlexander Batashev // expected-error@+1 {{custom op 'llvm.func' expected valid '@'-identifier for symbol name}} 4240252357bSAlexander Batashev llvm.func cc_12 @unknown_calling_convention() 4250252357bSAlexander Batashev} 4260252357bSAlexander Batashev 4270252357bSAlexander Batashev// ----- 4280252357bSAlexander Batashev 4290252357bSAlexander Batashevmodule { 4300252357bSAlexander Batashev "llvm.func"() ({ 43129bb0b5eSRiver Riddle // expected-error @below {{invalid Calling Conventions specification: cc_12}} 43229bb0b5eSRiver Riddle // expected-error @below {{failed to parse CConvAttr parameter 'CallingConv' which is to be a `CConv`}} 4330252357bSAlexander Batashev }) {sym_name = "generic_unknown_calling_convention", CConv = #llvm.cconv<cc_12>, function_type = !llvm.func<i64 (i64, i64)>} : () -> () 4340252357bSAlexander Batashev} 4356d2bbba1SVictor Perez 4366d2bbba1SVictor Perez// ----- 4376d2bbba1SVictor Perez 4386d2bbba1SVictor Perez// CHECK: @vec_type_hint() 4396d2bbba1SVictor Perez// CHECK-SAME: vec_type_hint = #llvm.vec_type_hint<hint = i32> 4406d2bbba1SVictor Perezllvm.func @vec_type_hint() attributes {vec_type_hint = #llvm.vec_type_hint<hint = i32>} 4416d2bbba1SVictor Perez 4426d2bbba1SVictor Perez// CHECK: @vec_type_hint_signed() 4436d2bbba1SVictor Perez// CHECK-SAME: vec_type_hint = #llvm.vec_type_hint<hint = i32, is_signed = true> 4446d2bbba1SVictor Perezllvm.func @vec_type_hint_signed() attributes {vec_type_hint = #llvm.vec_type_hint<hint = i32, is_signed = true>} 4456d2bbba1SVictor Perez 4466d2bbba1SVictor Perez// CHECK: @vec_type_hint_signed_vec() 4476d2bbba1SVictor Perez// CHECK-SAME: vec_type_hint = #llvm.vec_type_hint<hint = vector<2xi32>, is_signed = true> 4486d2bbba1SVictor Perezllvm.func @vec_type_hint_signed_vec() attributes {vec_type_hint = #llvm.vec_type_hint<hint = vector<2xi32>, is_signed = true>} 4496d2bbba1SVictor Perez 4506d2bbba1SVictor Perez// CHECK: @vec_type_hint_float_vec() 4516d2bbba1SVictor Perez// CHECK-SAME: vec_type_hint = #llvm.vec_type_hint<hint = vector<3xf32>> 4526d2bbba1SVictor Perezllvm.func @vec_type_hint_float_vec() attributes {vec_type_hint = #llvm.vec_type_hint<hint = vector<3xf32>>} 4536d2bbba1SVictor Perez 4546d2bbba1SVictor Perez// CHECK: @vec_type_hint_bfloat_vec() 4556d2bbba1SVictor Perez// CHECK-SAME: vec_type_hint = #llvm.vec_type_hint<hint = vector<8xbf16>> 4566d2bbba1SVictor Perezllvm.func @vec_type_hint_bfloat_vec() attributes {vec_type_hint = #llvm.vec_type_hint<hint = vector<8xbf16>>} 4576d2bbba1SVictor Perez 4586d2bbba1SVictor Perez// ----- 4596d2bbba1SVictor Perez 4606d2bbba1SVictor Perez// CHECK: @work_group_size_hint() 4616d2bbba1SVictor Perez// CHECK-SAME: work_group_size_hint = array<i32: 128, 128, 128> 4626d2bbba1SVictor Perezllvm.func @work_group_size_hint() attributes {work_group_size_hint = array<i32: 128, 128, 128>} 4636d2bbba1SVictor Perez 4646d2bbba1SVictor Perez// ----- 4656d2bbba1SVictor Perez 4666d2bbba1SVictor Perez// CHECK: @reqd_work_group_size_hint() 4676d2bbba1SVictor Perez// CHECK-SAME: reqd_work_group_size = array<i32: 128, 256, 128> 4686d2bbba1SVictor Perezllvm.func @reqd_work_group_size_hint() attributes {reqd_work_group_size = array<i32: 128, 256, 128>} 4696d2bbba1SVictor Perez 4706d2bbba1SVictor Perez// ----- 4716d2bbba1SVictor Perez 4726d2bbba1SVictor Perez// CHECK: @intel_reqd_sub_group_size_hint() 4736d2bbba1SVictor Perez// CHECK-SAME: intel_reqd_sub_group_size = 32 : i32 4746d2bbba1SVictor Perezllvm.func @intel_reqd_sub_group_size_hint() attributes {llvm.intel_reqd_sub_group_size = 32 : i32} 475d45de800SVictor Perez 476d45de800SVictor Perez// ----- 477d45de800SVictor Perez 478d45de800SVictor Perez// CHECK: @workgroup_attribution 479d45de800SVictor Perez// CHECK-SAME: llvm.workgroup_attribution = #llvm.mlir.workgroup_attribution<512 : i64, i32> 480d45de800SVictor Perez// CHECK-SAME: llvm.workgroup_attribution = #llvm.mlir.workgroup_attribution<128 : i64, !llvm.struct<(i32, i64, f32)> 481d45de800SVictor Perezllvm.func @workgroup_attribution(%arg0: !llvm.ptr {llvm.workgroup_attribution = #llvm.mlir.workgroup_attribution<512 : i64, i32>}, %arg1: !llvm.ptr {llvm.workgroup_attribution = #llvm.mlir.workgroup_attribution<128 : i64, !llvm.struct<(i32, i64, f32)>>}) 482*c9f72b28SKeyi Zhang 483*c9f72b28SKeyi Zhang// ----- 484*c9f72b28SKeyi Zhang 485*c9f72b28SKeyi Zhang// CHECK: @constant_range_negative 486*c9f72b28SKeyi Zhang// CHECK-SAME: llvm.range = #llvm.constant_range<i32, 0, -2147483648> 487*c9f72b28SKeyi Zhangllvm.func @constant_range_negative() -> (i32 {llvm.range = #llvm.constant_range<i32, 0, -2147483648>}) 488