xref: /llvm-project/mlir/test/Dialect/LLVMIR/func.mlir (revision c9f72b2873d2b3ea777c3ee512696f2259252bce)
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