xref: /llvm-project/mlir/test/Target/SPIRV/decorations.mlir (revision 4f78f8519056953d26102c7426fbb028caf13bc9)
1// RUN: mlir-translate -no-implicit-module -split-input-file -test-spirv-roundtrip -verify-diagnostics %s | FileCheck %s
2
3spirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Shader], []> {
4  // CHECK: location = 0 : i32
5  spirv.GlobalVariable @var {location = 0 : i32} : !spirv.ptr<vector<4xf32>, Input>
6}
7
8// -----
9
10spirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Shader], []> {
11  // CHECK: no_perspective
12  spirv.GlobalVariable @var {no_perspective} : !spirv.ptr<vector<4xf32>, Input>
13}
14
15// -----
16
17spirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Shader], []> {
18  // CHECK: flat
19  spirv.GlobalVariable @var {flat} : !spirv.ptr<si32, Input>
20}
21
22// -----
23
24spirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Shader], []> {
25  // CHECK: aliased
26  // CHECK: aliased
27  spirv.GlobalVariable @var1 bind(0, 0) {aliased} : !spirv.ptr<!spirv.struct<(!spirv.array<4xf32, stride=4>[0])>, StorageBuffer>
28  spirv.GlobalVariable @var2 bind(0, 0) {aliased} : !spirv.ptr<!spirv.struct<(vector<4xf32>[0])>, StorageBuffer>
29}
30
31// -----
32
33spirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Shader], []> {
34  // CHECK: non_readable
35  spirv.GlobalVariable @var bind(0, 0) {non_readable} : !spirv.ptr<!spirv.struct<(!spirv.array<4xf32, stride=4>[0])>, StorageBuffer>
36}
37
38// -----
39
40spirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Shader], []> {
41  // CHECK: non_writable
42  spirv.GlobalVariable @var bind(0, 0) {non_writable} : !spirv.ptr<!spirv.struct<(!spirv.array<4xf32, stride=4>[0])>, StorageBuffer>
43}
44
45// -----
46
47spirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Shader], []> {
48  // CHECK: restrict
49  spirv.GlobalVariable @var bind(0, 0) {restrict} : !spirv.ptr<!spirv.struct<(!spirv.array<4xf32, stride=4>[0])>, StorageBuffer>
50}
51
52// -----
53
54spirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Shader], []> {
55  // CHECK: relaxed_precision
56  spirv.GlobalVariable @var {location = 0 : i32, relaxed_precision} : !spirv.ptr<vector<4xf32>, Output>
57}
58
59// -----
60
61spirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Shader, Linkage], []> {
62  // CHECK: linkage_attributes = #spirv.linkage_attributes<linkage_name = "outSideGlobalVar1", linkage_type = <Import>>
63  spirv.GlobalVariable @var1 {
64    linkage_attributes=#spirv.linkage_attributes<
65      linkage_name="outSideGlobalVar1",
66      linkage_type=<Import>
67    >
68  } : !spirv.ptr<f32, Private>
69}
70
71// -----
72
73spirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Kernel], []> {
74spirv.func @iadd_decorations(%arg: i32) -> i32 "None" {
75  // CHECK: spirv.IAdd %{{.*}}, %{{.*}} {no_signed_wrap, no_unsigned_wrap}
76  %0 = spirv.IAdd %arg, %arg {no_signed_wrap, no_unsigned_wrap} : i32
77  spirv.ReturnValue %0 : i32
78}
79}
80
81// -----
82
83spirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Kernel], []> {
84spirv.func @fadd_decorations(%arg: f32) -> f32 "None" {
85  // CHECK: spirv.FAdd %{{.*}}, %{{.*}} {fp_fast_math_mode = #spirv.fastmath_mode<NotNaN|NotInf|NSZ>}
86  %0 = spirv.FAdd %arg, %arg {fp_fast_math_mode = #spirv.fastmath_mode<NotNaN|NotInf|NSZ>} : f32
87  spirv.ReturnValue %0 : f32
88}
89}
90
91// -----
92
93spirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Kernel], []> {
94spirv.func @fmul_decorations(%arg: f32) -> f32 "None" {
95  // CHECK: spirv.FMul %{{.*}}, %{{.*}} {no_contraction}
96  %0 = spirv.FMul %arg, %arg {no_contraction} : f32
97  spirv.ReturnValue %0 : f32
98}
99}
100
101// -----
102
103spirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Kernel, Float16], []> {
104spirv.func @fp_rounding_mode(%arg: f32) -> f16 "None" {
105  // CHECK: spirv.FConvert %arg0 {fp_rounding_mode = #spirv.fp_rounding_mode<RTN>} : f32 to f16
106  %0 = spirv.FConvert %arg {fp_rounding_mode = #spirv.fp_rounding_mode<RTN>} : f32 to f16
107  spirv.ReturnValue %0 : f16
108}
109}
110
111// -----
112
113// CHECK-LABEL: spirv.module Logical GLSL450 requires #spirv.vce<v1.0, [CacheControlsINTEL], [SPV_INTEL_cache_controls]> {
114
115spirv.module Logical GLSL450 requires #spirv.vce<v1.0, [CacheControlsINTEL], [SPV_INTEL_cache_controls]> {
116  spirv.func @cache_controls() "None" {
117    // CHECK: spirv.Variable {cache_control_load_intel = [#spirv.cache_control_load_intel<cache_level = 0, load_cache_control = Uncached>, #spirv.cache_control_load_intel<cache_level = 1, load_cache_control = Cached>, #spirv.cache_control_load_intel<cache_level = 2, load_cache_control = InvalidateAfterR>]} : !spirv.ptr<f32, Function>
118    %0 = spirv.Variable {cache_control_load_intel = [#spirv.cache_control_load_intel<cache_level = 0, load_cache_control = Uncached>, #spirv.cache_control_load_intel<cache_level = 1, load_cache_control = Cached>, #spirv.cache_control_load_intel<cache_level = 2, load_cache_control = InvalidateAfterR>]} : !spirv.ptr<f32, Function>
119    // CHECK: spirv.Variable {cache_control_store_intel = [#spirv.cache_control_store_intel<cache_level = 0, store_cache_control = Uncached>, #spirv.cache_control_store_intel<cache_level = 1, store_cache_control = WriteThrough>, #spirv.cache_control_store_intel<cache_level = 2, store_cache_control = WriteBack>]} : !spirv.ptr<f32, Function>
120    %1 = spirv.Variable {cache_control_store_intel = [#spirv.cache_control_store_intel<cache_level = 0, store_cache_control = Uncached>, #spirv.cache_control_store_intel<cache_level = 1, store_cache_control = WriteThrough>, #spirv.cache_control_store_intel<cache_level = 2, store_cache_control = WriteBack>]} : !spirv.ptr<f32, Function>
121    spirv.Return
122  }
123}
124
125// -----
126
127spirv.module Logical GLSL450 requires #spirv.vce<v1.0, [CacheControlsINTEL], [SPV_INTEL_cache_controls]> {
128  spirv.func @cache_controls_invalid_type() "None" {
129    // expected-error@below {{expecting array attribute of CacheControlLoadINTEL for CacheControlLoadINTEL}}
130    %0 = spirv.Variable {cache_control_load_intel = #spirv.cache_control_load_intel<cache_level = 0, load_cache_control = Uncached>} : !spirv.ptr<f32, Function>
131    spirv.Return
132  }
133}
134
135// -----
136
137spirv.module Logical GLSL450 requires #spirv.vce<v1.0, [CacheControlsINTEL], [SPV_INTEL_cache_controls]> {
138  spirv.func @cache_controls_invalid_type() "None" {
139    // expected-error@below {{expecting array attribute of CacheControlStoreINTEL for CacheControlStoreINTEL}}
140    %0 = spirv.Variable {cache_control_store_intel = [#spirv.cache_control_store_intel<cache_level = 0, store_cache_control = Uncached>, 0 : i32]} : !spirv.ptr<f32, Function>
141    spirv.Return
142  }
143}
144
145// -----
146
147spirv.module Logical GLSL450 requires #spirv.vce<v1.0, [CacheControlsINTEL], [SPV_INTEL_cache_controls]> {
148  spirv.func @cache_controls_invalid_type() "None" {
149    // expected-error@below {{expecting non-empty array attribute of CacheControlStoreINTEL for CacheControlStoreINTEL}}
150    %0 = spirv.Variable {cache_control_store_intel = []} : !spirv.ptr<f32, Function>
151    spirv.Return
152  }
153}
154