xref: /llvm-project/mlir/test/Dialect/SPIRV/IR/function-decorations.mlir (revision e5332482c6009699d7b66393617a389d8ae62710)
1// RUN: mlir-opt -split-input-file -verify-diagnostics %s | FileCheck %s
2
3spirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Shader, Linkage], []> {
4    spirv.func @linkage_attr_test_kernel()  "DontInline"  attributes {}  {
5        %uchar_0 = spirv.Constant 0 : i8
6        %ushort_1 = spirv.Constant 1 : i16
7        %uint_0 = spirv.Constant 0 : i32
8        spirv.FunctionCall @outside.func.with.linkage(%uchar_0):(i8) -> ()
9        spirv.Return
10    }
11    // CHECK: linkage_attributes = #spirv.linkage_attributes<linkage_name = "outside.func", linkage_type = <Import>>
12    spirv.func @outside.func.with.linkage(%arg0 : i8) -> () "Pure" attributes {
13      linkage_attributes=#spirv.linkage_attributes<
14        linkage_name="outside.func",
15        linkage_type=<Import>
16      >
17    }
18    spirv.func @inside.func() -> () "Pure" attributes {} {spirv.Return}
19}
20
21// -----
22
23// CHECK: spirv.func @arg_decoration_pointer(%{{.+}}: !spirv.ptr<i32, PhysicalStorageBuffer> {spirv.decoration = #spirv.decoration<Aliased>}) "None"
24spirv.func @arg_decoration_pointer(%arg0: !spirv.ptr<i32, PhysicalStorageBuffer> { spirv.decoration = #spirv.decoration<Aliased> }) "None" {
25  spirv.Return
26}
27
28// -----
29
30// CHECK: spirv.func @arg_decoration_pointer(%{{.+}}: !spirv.ptr<i32, PhysicalStorageBuffer> {spirv.decoration = #spirv.decoration<Restrict>}) "None"
31spirv.func @arg_decoration_pointer(%arg0: !spirv.ptr<i32, PhysicalStorageBuffer> { spirv.decoration = #spirv.decoration<Restrict> }) "None" {
32  spirv.Return
33}
34
35// -----
36
37// CHECK: spirv.func @arg_decoration_pointer(%{{.+}}: !spirv.ptr<!spirv.ptr<i32, PhysicalStorageBuffer>, Generic> {spirv.decoration = #spirv.decoration<AliasedPointer>}) "None"
38spirv.func @arg_decoration_pointer(%arg0: !spirv.ptr<!spirv.ptr<i32, PhysicalStorageBuffer>, Generic> { spirv.decoration = #spirv.decoration<AliasedPointer> }) "None" {
39  spirv.Return
40}
41
42// -----
43
44// CHECK: spirv.func @arg_decoration_pointer(%{{.+}}: !spirv.ptr<!spirv.ptr<i32, PhysicalStorageBuffer>, Generic> {spirv.decoration = #spirv.decoration<RestrictPointer>}) "None"
45spirv.func @arg_decoration_pointer(%arg0: !spirv.ptr<!spirv.ptr<i32, PhysicalStorageBuffer>, Generic> { spirv.decoration = #spirv.decoration<RestrictPointer> }) "None" {
46  spirv.Return
47}
48
49// -----
50
51// expected-error @+1 {{'spirv.func' op with physical buffer pointer must be decorated either 'Aliased' or 'Restrict'}}
52spirv.func @no_arg_decoration_pointer(%arg0: !spirv.ptr<i32, PhysicalStorageBuffer>) "None" {
53  spirv.Return
54}
55
56// -----
57
58// expected-error @+1 {{'spirv.func' op with a pointer points to a physical buffer pointer must be decorated either 'AliasedPointer' or 'RestrictPointer'}}
59spirv.func @no_arg_decoration_pointer(%arg0: !spirv.ptr<!spirv.ptr<i32, PhysicalStorageBuffer>, Function>) "None" {
60  spirv.Return
61}
62
63// -----
64
65// expected-error @+1 {{'spirv.func' op with physical buffer pointer must be decorated either 'Aliased' or 'Restrict'}}
66spirv.func @no_decoration_name_attr(%arg0 : !spirv.ptr<i32, PhysicalStorageBuffer> { random_attr = #spirv.decoration<Aliased> }) "None" {
67  spirv.Return
68}
69
70// -----
71
72// expected-error @+1 {{'spirv.func' op arguments may only have dialect attributes}}
73spirv.func @no_decoration_name_attr(%arg0 : !spirv.ptr<i32, PhysicalStorageBuffer> { spirv.decoration = #spirv.decoration<Restrict>, random_attr = #spirv.decoration<Aliased> }) "None" {
74  spirv.Return
75}
76