256 lines · plain
1// RUN: mlir-opt -spirv-update-vce %s | FileCheck %s2 3//===----------------------------------------------------------------------===//4// Version5//===----------------------------------------------------------------------===//6 7// Test deducing minimal version.8// spirv.IAdd is available from v1.0.9 10// CHECK: requires #spirv.vce<v1.0, [Shader, Matrix], []>11spirv.module Logical GLSL450 attributes {12 spirv.target_env = #spirv.target_env<13 #spirv.vce<v1.5, [Shader], []>, #spirv.resource_limits<>>14} {15 spirv.func @iadd(%val : i32) -> i32 "None" {16 %0 = spirv.IAdd %val, %val: i3217 spirv.ReturnValue %0: i3218 }19}20 21// Test deducing minimal version.22// spirv.GroupNonUniformBallot is available since v1.3.23 24// CHECK: requires #spirv.vce<v1.3, [GroupNonUniformBallot, Shader, GroupNonUniform, Matrix], []>25spirv.module Logical GLSL450 attributes {26 spirv.target_env = #spirv.target_env<27 #spirv.vce<v1.5, [Shader, GroupNonUniformBallot], []>, #spirv.resource_limits<>>28} {29 spirv.func @group_non_uniform_ballot(%predicate : i1) -> vector<4xi32> "None" {30 %0 = spirv.GroupNonUniformBallot <Workgroup> %predicate : vector<4xi32>31 spirv.ReturnValue %0: vector<4xi32>32 }33}34 35// CHECK: requires #spirv.vce<v1.4, [Shader, Matrix], []>36spirv.module Logical GLSL450 attributes {37 spirv.target_env = #spirv.target_env<#spirv.vce<v1.6, [Shader], []>, #spirv.resource_limits<>>38} {39 spirv.func @select_with_scalar_condition(%predicate : i1, %a: vector<2xf32>, %b: vector<2xf32>) -> vector<2xf32> "None" {40 %0 = spirv.Select %predicate, %a, %b : i1, vector<2xf32>41 spirv.ReturnValue %0: vector<2xf32>42 }43}44 45//===----------------------------------------------------------------------===//46// Capability47//===----------------------------------------------------------------------===//48 49// Test minimal capabilities.50 51// CHECK: requires #spirv.vce<v1.0, [Shader, Matrix], []>52spirv.module Logical GLSL450 attributes {53 spirv.target_env = #spirv.target_env<54 #spirv.vce<v1.0, [Shader, Float16, Float64, Int16, Int64, VariablePointers], []>, #spirv.resource_limits<>>55} {56 spirv.func @iadd(%val : i32) -> i32 "None" {57 %0 = spirv.IAdd %val, %val: i3258 spirv.ReturnValue %0: i3259 }60}61 62// Test Physical Storage Buffers are deduced correctly.63 64// CHECK: spirv.module PhysicalStorageBuffer64 GLSL450 requires #spirv.vce<v1.0, [PhysicalStorageBufferAddresses, Shader, Matrix], [SPV_EXT_physical_storage_buffer]>65spirv.module PhysicalStorageBuffer64 GLSL450 attributes {66 spirv.target_env = #spirv.target_env<67 #spirv.vce<v1.0, [PhysicalStorageBufferAddresses], [SPV_EXT_physical_storage_buffer]>, #spirv.resource_limits<>>68} {69 spirv.func @physical_ptr(%val : !spirv.ptr<f32, PhysicalStorageBuffer> { spirv.decoration = #spirv.decoration<Aliased> }) "None" {70 spirv.Return71 }72}73 74// Test deducing implied capability.75// AtomicStorage implies Shader.76 77// CHECK: requires #spirv.vce<v1.0, [Shader, Matrix], []>78spirv.module Logical GLSL450 attributes {79 spirv.target_env = #spirv.target_env<80 #spirv.vce<v1.0, [AtomicStorage], []>, #spirv.resource_limits<>>81} {82 spirv.func @iadd(%val : i32) -> i32 "None" {83 %0 = spirv.IAdd %val, %val: i3284 spirv.ReturnValue %0: i3285 }86}87 88// Test selecting the capability available in the target environment.89// spirv.GroupNonUniform op itself can be enabled via any of90// * GroupNonUniformArithmetic91// * GroupNonUniformClustered92// * GroupNonUniformPartitionedNV93// Its 'Reduce' group operation can be enabled via any of94// * Kernel95// * GroupNonUniformArithmetic96// * GroupNonUniformBallot97 98// CHECK: requires #spirv.vce<v1.3, [GroupNonUniformArithmetic, Shader, GroupNonUniform, Matrix], []>99spirv.module Logical GLSL450 attributes {100 spirv.target_env = #spirv.target_env<101 #spirv.vce<v1.3, [Shader, GroupNonUniformArithmetic], []>, #spirv.resource_limits<>>102} {103 spirv.func @group_non_uniform_iadd(%val : i32) -> i32 "None" {104 %0 = spirv.GroupNonUniformIAdd <Subgroup> <Reduce> %val : i32 -> i32105 spirv.ReturnValue %0: i32106 }107}108 109// CHECK: requires #spirv.vce<v1.3, [GroupNonUniformClustered, GroupNonUniformBallot, Shader, GroupNonUniform, Matrix], []>110spirv.module Logical GLSL450 attributes {111 spirv.target_env = #spirv.target_env<112 #spirv.vce<v1.3, [Shader, GroupNonUniformClustered, GroupNonUniformBallot], []>, #spirv.resource_limits<>>113} {114 spirv.func @group_non_uniform_iadd(%val : i32) -> i32 "None" {115 %0 = spirv.GroupNonUniformIAdd <Subgroup> <Reduce> %val : i32 -> i32116 spirv.ReturnValue %0: i32117 }118}119 120// Test type required capabilities121 122// Using 8-bit integers in non-interface storage class requires Int8.123// CHECK: requires #spirv.vce<v1.0, [Int8, Shader, Matrix], []>124spirv.module Logical GLSL450 attributes {125 spirv.target_env = #spirv.target_env<126 #spirv.vce<v1.3, [Shader, Int8], []>, #spirv.resource_limits<>>127} {128 spirv.func @iadd_function(%val : i8) -> i8 "None" {129 %0 = spirv.IAdd %val, %val : i8130 spirv.ReturnValue %0: i8131 }132}133 134// Using 16-bit floats in non-interface storage class requires Float16.135// CHECK: requires #spirv.vce<v1.0, [Float16, Shader, Matrix], []>136spirv.module Logical GLSL450 attributes {137 spirv.target_env = #spirv.target_env<138 #spirv.vce<v1.3, [Shader, Float16], []>, #spirv.resource_limits<>>139} {140 spirv.func @fadd_function(%val : f16) -> f16 "None" {141 %0 = spirv.FAdd %val, %val : f16142 spirv.ReturnValue %0: f16143 }144}145 146// Using 16-element vectors requires Vector16.147// CHECK: requires #spirv.vce<v1.0, [Vector16, Shader, Kernel, Matrix], []>148spirv.module Logical GLSL450 attributes {149 spirv.target_env = #spirv.target_env<150 #spirv.vce<v1.3, [Shader, Vector16], []>, #spirv.resource_limits<>>151} {152 spirv.func @iadd_v16_function(%val : vector<16xi32>) -> vector<16xi32> "None" {153 %0 = spirv.IAdd %val, %val : vector<16xi32>154 spirv.ReturnValue %0: vector<16xi32>155 }156}157 158//===----------------------------------------------------------------------===//159// Extension160//===----------------------------------------------------------------------===//161 162// Test deducing minimal extensions.163// spirv.KHR.SubgroupBallot requires the SPV_KHR_shader_ballot extension.164 165// CHECK: requires #spirv.vce<v1.0, [SubgroupBallotKHR, Shader, Matrix], [SPV_KHR_shader_ballot]>166spirv.module Logical GLSL450 attributes {167 spirv.target_env = #spirv.target_env<168 #spirv.vce<v1.0, [Shader, SubgroupBallotKHR],169 [SPV_KHR_shader_ballot, SPV_KHR_shader_clock, SPV_KHR_variable_pointers]>, #spirv.resource_limits<>>170} {171 spirv.func @subgroup_ballot(%predicate : i1) -> vector<4xi32> "None" {172 %0 = spirv.KHR.SubgroupBallot %predicate: vector<4xi32>173 spirv.ReturnValue %0: vector<4xi32>174 }175}176 177// Test deducing implied extension.178// Vulkan memory model requires SPV_KHR_vulkan_memory_model, which is enabled179// implicitly by v1.5.180 181// CHECK: requires #spirv.vce<v1.5, [VulkanMemoryModel], [SPV_KHR_vulkan_memory_model]>182spirv.module Logical Vulkan attributes {183 spirv.target_env = #spirv.target_env<184 #spirv.vce<v1.5, [Shader, VulkanMemoryModel], []>, #spirv.resource_limits<>>185} {186 spirv.func @iadd(%val : i32) -> i32 "None" {187 %0 = spirv.IAdd %val, %val: i32188 spirv.ReturnValue %0: i32189 }190}191 192// Test type required extensions193 194// Using 8-bit integers in interface storage class requires additional195// extensions and capabilities.196// CHECK: requires #spirv.vce<v1.0, [StorageBuffer16BitAccess, Shader, Int16, Matrix], [SPV_KHR_16bit_storage, SPV_KHR_storage_buffer_storage_class]>197spirv.module Logical GLSL450 attributes {198 spirv.target_env = #spirv.target_env<199 #spirv.vce<v1.3, [Shader, StorageBuffer16BitAccess, Int16], []>, #spirv.resource_limits<>>200} {201 spirv.func @iadd_storage_buffer(%ptr : !spirv.ptr<i16, StorageBuffer>) -> i16 "None" {202 %0 = spirv.Load "StorageBuffer" %ptr : i16203 %1 = spirv.IAdd %0, %0 : i16204 spirv.ReturnValue %1: i16205 }206}207 208// Complicated nested types209// * Buffer requires ImageBuffer or SampledBuffer.210// * Rg32f requires StorageImageExtendedFormats.211// CHECK: requires #spirv.vce<v1.0, [UniformAndStorageBuffer8BitAccess, StorageUniform16, Int64, Shader, ImageBuffer, StorageImageExtendedFormats, StorageBuffer8BitAccess, StorageBuffer16BitAccess, Matrix, SampledBuffer], [SPV_KHR_8bit_storage, SPV_KHR_16bit_storage]>212spirv.module Logical GLSL450 attributes {213 spirv.target_env = #spirv.target_env<214 #spirv.vce<v1.5, [Shader, UniformAndStorageBuffer8BitAccess, StorageBuffer16BitAccess, StorageUniform16, Int16, Int64, ImageBuffer, StorageImageExtendedFormats], []>,215 #spirv.resource_limits<>>216} {217 spirv.GlobalVariable @data : !spirv.ptr<!spirv.struct<(i8 [0], f16 [2], i64 [4])>, Uniform>218 spirv.GlobalVariable @img : !spirv.ptr<!spirv.image<f32, Buffer, NoDepth, NonArrayed, SingleSampled, SamplerUnknown, Rg32f>, UniformConstant>219}220 221// Using bfloat16 requires BFloat16TypeKHR capability and SPV_KHR_bfloat16 extension.222// CHECK: requires #spirv.vce<v1.0, [StorageBuffer16BitAccess, Shader, BFloat16TypeKHR, Matrix], [SPV_KHR_bfloat16, SPV_KHR_16bit_storage, SPV_KHR_storage_buffer_storage_class]>223spirv.module Logical GLSL450 attributes {224 spirv.target_env = #spirv.target_env<225 #spirv.vce<v1.0, [Shader, StorageBuffer16BitAccess, BFloat16TypeKHR], [SPV_KHR_bfloat16, SPV_KHR_16bit_storage, SPV_KHR_storage_buffer_storage_class]>,226 #spirv.resource_limits<>227 >228} {229 spirv.func @load_bf16(%ptr : !spirv.ptr<bf16, StorageBuffer>) -> bf16 "None" {230 %val = spirv.Load "StorageBuffer" %ptr : bf16231 spirv.ReturnValue %val : bf16232 }233}234 235// CHECK: requires #spirv.vce<v1.5, [GraphARM, Int8, TensorsARM, Float16, VulkanMemoryModel], [SPV_ARM_graph, SPV_ARM_tensors, SPV_KHR_vulkan_memory_model]>236spirv.module Logical Vulkan attributes {237 spirv.target_env = #spirv.target_env<238 #spirv.vce<v1.5, [VulkanMemoryModel, GraphARM, TensorsARM, Float16], [SPV_ARM_tensors, SPV_ARM_graph]>,239 #spirv.resource_limits<>>240} {241 spirv.ARM.Graph @argmax(%arg0: !spirv.arm.tensor<14x19xi8>, %arg1 : !spirv.arm.tensor<1xf16>) -> !spirv.arm.tensor<14x19xi8> {242 spirv.ARM.GraphOutputs %arg0 : !spirv.arm.tensor<14x19xi8>243 }244}245 246// Check that extension and capability queries handle recursive types.247// CHECK: requires #spirv.vce<v1.0, [Shader, Addresses, Matrix], [SPV_KHR_storage_buffer_storage_class]>248spirv.module Physical64 GLSL450 attributes {249 spirv.target_env = #spirv.target_env<250 #spirv.vce<v1.6, [Shader, Addresses], [SPV_KHR_storage_buffer_storage_class]>,251 #spirv.resource_limits<>>252} {253 spirv.GlobalVariable @recursive:254 !spirv.ptr<!spirv.struct<rec, (!spirv.ptr<!spirv.struct<rec>, StorageBuffer>)>, StorageBuffer>255}256