// RUN: mlir-opt -split-input-file -verify-diagnostics %s | FileCheck %s // expected-error @+1 {{found unsupported 'spirv.something' attribute on operation}} func.func @unknown_attr_on_op() attributes { spirv.something = 64 } { return } // ----- // expected-error @+1 {{found unsupported 'spirv.something' attribute on region argument}} func.func @unknown_attr_on_region(%arg: i32 {spirv.something}) { return } // ----- // expected-error @+1 {{cannot attach SPIR-V attributes to region result}} func.func @unknown_attr_on_region() -> (i32 {spirv.something}) { %0 = arith.constant 10.0 : f32 return %0: f32 } // ----- //===----------------------------------------------------------------------===// // spirv.entry_point_abi //===----------------------------------------------------------------------===// // expected-error @+1 {{'spirv.entry_point_abi' attribute must be an entry point ABI attribute}} func.func @spv_entry_point() attributes { spirv.entry_point_abi = 64 } { return } // ----- func.func @spv_entry_point() attributes { // expected-error @+2 {{failed to parse SPIRV_EntryPointABIAttr parameter 'workgroup_size' which is to be a `DenseI32ArrayAttr`}} // expected-error @+1 {{expected '['}} spirv.entry_point_abi = #spirv.entry_point_abi } { return } // ----- func.func @spv_entry_point() attributes { // CHECK: {spirv.entry_point_abi = #spirv.entry_point_abi} spirv.entry_point_abi = #spirv.entry_point_abi } { return } // ----- //===----------------------------------------------------------------------===// // spirv.interface_var_abi //===----------------------------------------------------------------------===// // expected-error @+1 {{'spirv.interface_var_abi' must be a spirv::InterfaceVarABIAttr}} func.func @interface_var( %arg0 : f32 {spirv.interface_var_abi = 64} ) { return } // ----- func.func @interface_var( // expected-error @+1 {{missing descriptor set}} %arg0 : f32 {spirv.interface_var_abi = #spirv.interface_var_abi<()>} ) { return } // ----- func.func @interface_var( // expected-error @+1 {{missing binding}} %arg0 : f32 {spirv.interface_var_abi = #spirv.interface_var_abi<(1,)>} ) { return } // ----- func.func @interface_var( // expected-error @+1 {{unknown storage class: }} %arg0 : f32 {spirv.interface_var_abi = #spirv.interface_var_abi<(1,2), Foo>} ) { return } // ----- // CHECK: {spirv.interface_var_abi = #spirv.interface_var_abi<(0, 1), Uniform>} func.func @interface_var( %arg0 : f32 {spirv.interface_var_abi = #spirv.interface_var_abi<(0, 1), Uniform>} ) { return } // ----- // CHECK: {spirv.interface_var_abi = #spirv.interface_var_abi<(0, 1)>} func.func @interface_var( %arg0 : f32 {spirv.interface_var_abi = #spirv.interface_var_abi<(0, 1)>} ) { return } // ----- // expected-error @+1 {{'spirv.interface_var_abi' attribute cannot specify storage class when attaching to a non-scalar value}} func.func @interface_var( %arg0 : memref<4xf32> {spirv.interface_var_abi = #spirv.interface_var_abi<(0, 1), Uniform>} ) { return } // ----- //===----------------------------------------------------------------------===// // spirv.resource_limits //===----------------------------------------------------------------------===// // CHECK-LABEL: func @resource_limits_all_default() func.func @resource_limits_all_default() attributes { // CHECK-SAME: #spirv.resource_limits<> limits = #spirv.resource_limits<> } { return } // ----- // CHECK-LABEL: func @resource_limits_min_max_subgroup_size() func.func @resource_limits_min_max_subgroup_size() attributes { // CHECK-SAME: #spirv.resource_limits limits = #spirv.resource_limits } { return } // ----- //===----------------------------------------------------------------------===// // spirv.target_env //===----------------------------------------------------------------------===// func.func @target_env() attributes { // CHECK: spirv.target_env = #spirv.target_env< // CHECK-SAME: #spirv.vce, // CHECK-SAME: #spirv.resource_limits> spirv.target_env = #spirv.target_env< #spirv.vce, #spirv.resource_limits< max_compute_workgroup_size = [128, 64, 64] >> } { return } // ----- func.func @target_env_client_api() attributes { // CHECK: spirv.target_env = #spirv.target_env< // CHECK-SAME: #spirv.vce, // CHECK-SAME: api=Metal, // CHECK-SAME: #spirv.resource_limits<>> spirv.target_env = #spirv.target_env<#spirv.vce, api=Metal, #spirv.resource_limits<>> } { return } // ----- func.func @target_env_client_api() attributes { // CHECK: spirv.target_env = #spirv.target_env // CHECK-NOT: api= spirv.target_env = #spirv.target_env<#spirv.vce, api=Unknown, #spirv.resource_limits<>> } { return } // ----- func.func @target_env_vendor_id() attributes { // CHECK: spirv.target_env = #spirv.target_env< // CHECK-SAME: #spirv.vce, // CHECK-SAME: NVIDIA, // CHECK-SAME: #spirv.resource_limits<>> spirv.target_env = #spirv.target_env<#spirv.vce, NVIDIA, #spirv.resource_limits<>> } { return } // ----- func.func @target_env_vendor_id_device_type() attributes { // CHECK: spirv.target_env = #spirv.target_env< // CHECK-SAME: #spirv.vce, // CHECK-SAME: AMD:DiscreteGPU, // CHECK-SAME: #spirv.resource_limits<>> spirv.target_env = #spirv.target_env<#spirv.vce, AMD:DiscreteGPU, #spirv.resource_limits<>> } { return } // ----- func.func @target_env_vendor_id_device_type_device_id() attributes { // CHECK: spirv.target_env = #spirv.target_env< // CHECK-SAME: #spirv.vce, // CHECK-SAME: Qualcomm:IntegratedGPU:100925441, // CHECK-SAME: #spirv.resource_limits<>> spirv.target_env = #spirv.target_env<#spirv.vce, Qualcomm:IntegratedGPU:0x6040001, #spirv.resource_limits<>> } { return } // ----- func.func @target_env_client_api_vendor_id_device_type_device_id() attributes { // CHECK: spirv.target_env = #spirv.target_env< // CHECK-SAME: #spirv.vce, // CHECK-SAME: api=Vulkan, // CHECK-SAME: Qualcomm:IntegratedGPU:100925441, // CHECK-SAME: #spirv.resource_limits<>> spirv.target_env = #spirv.target_env<#spirv.vce, api=Vulkan, Qualcomm:IntegratedGPU:0x6040001, #spirv.resource_limits<>> } { return } // ----- func.func @target_env_extra_fields() attributes { // expected-error @+3 {{expected '>'}} spirv.target_env = #spirv.target_env< #spirv.vce, #spirv.resource_limits<>, more_stuff > } { return } // ----- func.func @target_env_cooperative_matrix_khr() attributes{ // CHECK: spirv.target_env = #spirv.target_env< // CHECK-SAME: SPV_KHR_cooperative_matrix // CHECK-SAME: #spirv.coop_matrix_props_khr< // CHECK-SAME: m_size = 8, n_size = 8, k_size = 32, // CHECK-SAME: a_type = i8, b_type = i8, c_type = i32, // CHECK-SAME: result_type = i32, acc_sat = true, scope = > // CHECK-SAME: #spirv.coop_matrix_props_khr< // CHECK-SAME: m_size = 8, n_size = 8, k_size = 16, // CHECK-SAME: a_type = f16, b_type = f16, c_type = f16, // CHECK-SAME: result_type = f16, acc_sat = false, scope = > spirv.target_env = #spirv.target_env< #spirv.vce, #spirv.resource_limits< cooperative_matrix_properties_khr = [#spirv.coop_matrix_props_khr< m_size = 8, n_size = 8, k_size = 32, a_type = i8, b_type = i8, c_type = i32, result_type = i32, acc_sat = true, scope = #spirv.scope >, #spirv.coop_matrix_props_khr< m_size = 8, n_size = 8, k_size = 16, a_type = f16, b_type = f16, c_type = f16, result_type = f16, acc_sat = false, scope = #spirv.scope >] >> } { return } // ----- func.func @target_env_cooperative_matrix_nv() attributes{ // CHECK: spirv.target_env = #spirv.target_env< // CHECK-SAME: SPV_NV_cooperative_matrix // CHECK-SAME: #spirv.coop_matrix_props_nv< // CHECK-SAME: m_size = 8, n_size = 8, k_size = 32, // CHECK-SAME: a_type = i8, b_type = i8, c_type = i32, // CHECK-SAME: result_type = i32, scope = > // CHECK-SAME: #spirv.coop_matrix_props_nv< // CHECK-SAME: m_size = 8, n_size = 8, k_size = 16, // CHECK-SAME: a_type = f16, b_type = f16, c_type = f16, // CHECK-SAME: result_type = f16, scope = > spirv.target_env = #spirv.target_env< #spirv.vce, #spirv.resource_limits< cooperative_matrix_properties_nv = [#spirv.coop_matrix_props_nv< m_size = 8, n_size = 8, k_size = 32, a_type = i8, b_type = i8, c_type = i32, result_type = i32, scope = #spirv.scope >, #spirv.coop_matrix_props_nv< m_size = 8, n_size = 8, k_size = 16, a_type = f16, b_type = f16, c_type = f16, result_type = f16, scope = #spirv.scope >] >> } { return } // ----- //===----------------------------------------------------------------------===// // spirv.vce //===----------------------------------------------------------------------===// func.func @vce_wrong_type() attributes { // expected-error @+1 {{expected valid keyword}} vce = #spirv.vce<64> } { return } // ----- func.func @vce_missing_fields() attributes { // expected-error @+1 {{expected ','}} vce = #spirv.vce } { return } // ----- func.func @vce_wrong_version() attributes { // expected-error @+1 {{unknown version: V_x_y}} vce = #spirv.vce } { return } // ----- func.func @vce_wrong_extension_type() attributes { // expected-error @+1 {{expected valid keyword}} vce = #spirv.vce } { return } // ----- func.func @vce_wrong_extension() attributes { // expected-error @+1 {{unknown extension: SPIRV_Something}} vce = #spirv.vce } { return } // ----- func.func @vce_wrong_capability() attributes { // expected-error @+1 {{unknown capability: Something}} vce = #spirv.vce } { return } // ----- func.func @vce() attributes { // CHECK: #spirv.vce vce = #spirv.vce } { return }