// RUN: mlir-opt %s -split-input-file -verify-diagnostics func.func @mixing_packed_trunc_types(%arg0: f32, %arg1: vector<4xf8E5M2FNUZ>) -> vector<4xf8E4M3FNUZ> { // expected-error@+1 {{'amdgpu.packed_trunc_2xfp8' op existing values must have same type as result}} %ret = amdgpu.packed_trunc_2xfp8 %arg0, undef into %arg1[word 0] : f32 to vector<4xf8E4M3FNUZ> into vector<4xf8E5M2FNUZ> func.return %ret : vector<4xf8E4M3FNUZ> } // ----- func.func @mixing_packed_stoch_round_types(%arg0: f32, %arg1: i32, %arg2: vector<4xf8E5M2FNUZ>) -> vector<4xf8E4M3FNUZ> { // expected-error@+1 {{'amdgpu.packed_stoch_round_fp8' op existing values must have same type as result}} %ret = amdgpu.packed_stoch_round_fp8 %arg0 + %arg1 into %arg2[0] : f32 to vector<4xf8E4M3FNUZ> into vector<4xf8E5M2FNUZ> func.return %ret : vector<4xf8E4M3FNUZ> } // ----- func.func @bad_source_types(%a: vector<2xf32>, %b: vector<4xf16>, %c: vector<32xf32>) -> vector<32xf32> { // expected-error@+1 {{'amdgpu.mfma' op expected both non-small-float source operand types to match exactly}} %d = amdgpu.mfma 32x32x1 %a * %b + %c { blocks = 2 : i32, abid = 0 : i32, cbsz = 0 : i32} blgp = none : vector<2xf32>, vector<4xf16>, vector<32xf32> func.return %d : vector<32xf32> } // ----- func.func @bad_source_types_f8(%a: vector<8xf8E5M2FNUZ>, %b: vector<8xi8>, %c: vector<32xf32>) -> vector<32xf32> { // expected-error@+1 {{'amdgpu.mfma' op expected both source operands to have small-float elements if one does}} %d = amdgpu.mfma 32x32x1 %a * %b + %c { blocks = 2 : i32, abid = 0 : i32, cbsz = 0 : i32} blgp = none : vector<8xf8E5M2FNUZ>, vector<8xi8>, vector<32xf32> func.return %d : vector<32xf32> } // ----- func.func @bad_source_arguments(%a: vector<2xf32>, %b: vector<2xf32>, %c: vector<32xf32>) -> vector<32xf32> { // expected-error@+1 {{'amdgpu.mfma' op expected 1 source values for this operation but got 2}} %d = amdgpu.mfma 32x32x1 %a * %b + %c { blocks = 2 : i32, abid = 0 : i32, cbsz = 0 : i32} blgp = none : vector<2xf32>, vector<2xf32>, vector<32xf32> func.return %d : vector<32xf32> } // ----- func.func @bad_source_arguments_i8(%a: vector<8xi8>, %b: vector<8xi8>, %c: vector<4xi32>) -> vector<4xi32> { // expected-error@+1 {{'amdgpu.mfma' op expected 4 source values for this operation but got 8}} %d = amdgpu.mfma 32x32x4 %a * %b + %c { blocks = 2 : i32, abid = 0 : i32, cbsz = 0 : i32} blgp = none : vector<8xi8>, vector<8xi8>, vector<4xi32> func.return %d : vector<4xi32> } // ----- func.func @bad_dest_type(%a: f32, %b: f32, %c: vector<16xf32>) -> vector<16xf32> { // expected-error@+1 {{'amdgpu.mfma' op expected 32 result values for this operation but got 16}} %d = amdgpu.mfma 32x32x1 %a * %b + %c { blocks = 2 : i32, abid = 0 : i32, cbsz = 0 : i32} blgp = none : f32, f32, vector<16xf32> return %d : vector<16xf32> } // ----- func.func @f64_permuting_b(%a: f64, %b: f64, %c: vector<4xf64>) -> vector<4xf64> { // expected-error@+1 {{'amdgpu.mfma' op double-precision ops do not support permuting lanes of B}} %d = amdgpu.mfma 16x16x4 %a * %b + %c { abid = 0 : i32, cbsz = 0 : i32} blgp = bcast_first_32 : f64, f64, vector<4xf64> return %d : vector<4xf64> } // ----- func.func @f64_permuting_a(%a: f64, %b: f64, %c: vector<4xf64>) -> vector<4xf64> { // expected-error@+1 {{'amdgpu.mfma' op double-precision ops do not support permuting lanes of A}} %d = amdgpu.mfma 16x16x4 %a * %b + %c { abid = 0 : i32, cbsz = 1 : i32} blgp = none : f64, f64, vector<4xf64> return %d : vector<4xf64> } // ----- func.func @abid_without_bradcast(%a: f32, %b: f32, %c: vector<32xf32>) -> vector<32xf32> { // expected-error@+1 {{'amdgpu.mfma' op block ID for permuting A (abid) must be below 2 ** cbsz}} %d = amdgpu.mfma 32x32x1 %a * %b + %c { blocks = 2 : i32, abid = 1 : i32, cbsz = 0 : i32} blgp = none : f32, f32, vector<32xf32> func.return %d : vector<32xf32> } // ----- func.func @abid_too_large(%a: f32, %b: f32, %c: vector<32xf32>) -> vector<32xf32> { // expected-error@+1 {{'amdgpu.mfma' op block ID for permuting A (abid) must be below 2 ** cbsz}} %d = amdgpu.mfma 32x32x1 %a * %b + %c { blocks = 2 : i32, abid = 2 : i32, cbsz = 1 : i32} blgp = none : f32, f32, vector<32xf32> func.return %d : vector<32xf32> } // ----- func.func @no_negation(%a: f32, %b: f32, %c: vector<32xf32>) -> vector<32xf32> { // expected-error@+1 {{'amdgpu.mfma' op negation flags only available for double-precision operations}} %d = amdgpu.mfma 32x32x1 %a * %b + %c { blocks = 2 : i32, abid = 0 : i32, cbsz = 0 : i32, negateA} blgp = none : f32, f32, vector<32xf32> func.return %d : vector<32xf32> } // ----- func.func @mfma_invalid_m(%a: f32, %b: f32, %c: vector<32xf32>) -> vector<32xf32> { // expected-error@+1 {{'amdgpu.mfma' op attribute 'm' failed to satisfy constraint: 32-bit signless integer attribute whose value is one of {4, 16, 32}}} %d = amdgpu.mfma 7x32x1 %a * %b + %c { abid = 0 : i32, cbsz = 0 : i32 } blgp = none : f32, f32, vector<32xf32> func.return %d : vector<32xf32> } // ----- func.func @mfma_invalid_n(%a: f32, %b: f32, %c: vector<32xf32>) -> vector<32xf32> { // expected-error@+1 {{'amdgpu.mfma' op attribute 'n' failed to satisfy constraint: 32-bit signless integer attribute whose value is one of {4, 16, 32}}} %d = amdgpu.mfma 32x7x1 %a * %b + %c { abid = 0 : i32, cbsz = 0 : i32 } blgp = none : f32, f32, vector<32xf32> func.return %d : vector<32xf32> } // ----- func.func @mfma_invalid_k(%a: f32, %b: f32, %c: vector<32xf32>) -> vector<32xf32> { // expected-error@+1 {{'amdgpu.mfma' op attribute 'k' failed to satisfy constraint: 32-bit signless integer attribute whose value is one of {1, 2, 4, 8, 16, 32, 64, 128}}} %d = amdgpu.mfma 32x32x3 %a * %b + %c { abid = 0 : i32, cbsz = 0 : i32 } blgp = none : f32, f32, vector<32xf32> func.return %d : vector<32xf32> } // ----- func.func @mfma_invalid_blocks(%a: f32, %b: f32, %c: vector<32xf32>) -> vector<32xf32> { // expected-error@+1 {{'amdgpu.mfma' op attribute 'blocks' failed to satisfy constraint: 32-bit signless integer attribute whose value is one of {1, 2, 4, 16}}} %d = amdgpu.mfma 32x32x1 %a * %b + %c { blocks = 7 : i32, abid = 0 : i32, cbsz = 0 : i32 } blgp = none : f32, f32, vector<32xf32> func.return %d : vector<32xf32> } // ----- func.func @wmma_f16_i32(%arg0 : vector<16xf16>, %arg1 : vector<8xi32>) -> vector<8xi32> { // expected-error@+1 {{'amdgpu.wmma' op expected int sources with int destination}} %0 = amdgpu.wmma 16x16x16 %arg0 * %arg0 + %arg1 : vector<16xf16>, vector<16xf16>, vector<8xi32> func.return %0 : vector<8xi32> } // ----- func.func @wmma_i16_f32(%arg0 : vector<16xi8>, %arg1 : vector<8xf32>) -> vector<8xf32> { // expected-error@+1 {{'amdgpu.wmma' op expected float sources with float destination}} %0 = amdgpu.wmma 16x16x16 %arg0 * %arg0 + %arg1 : vector<16xi8>, vector<16xi8>, vector<8xf32> func.return %0 : vector<8xf32> } // ----- func.func @wmma_no_k_dim(%arg0 : vector<16xi8>, %arg1 : vector<8xi32>) -> vector<8xi32> { // expected-error@+1 {{'amdgpu.wmma' expected 3 dimensions in MNK dimension list}} %0 = amdgpu.wmma 16x16 %arg0 * %arg0 + %arg1 : vector<16xi8>, vector<16xi8>, vector<8xi32> func.return %0 : vector<8xi32> } // ----- func.func @wmma_wrong_n_dim(%arg0 : vector<16xi8>, %arg1 : vector<8xi32>) -> vector<8xi32> { // expected-error@+1 {{'amdgpu.wmma' op attribute 'n' failed to satisfy constraint: 32-bit signless integer attribute whose value is one of {16}}} %0 = amdgpu.wmma 16x32x16 %arg0 * %arg0 + %arg1 : vector<16xi8>, vector<16xi8>, vector<8xi32> func.return %0 : vector<8xi32> } // ----- func.func @wmma_wrong_k_dim(%arg0 : vector<16xi8>, %arg1 : vector<8xi32>) -> vector<8xi32> { // expected-error@+1 {{'amdgpu.wmma' op attribute 'k' failed to satisfy constraint: 32-bit signless integer attribute whose value is one of {4, 16, 32, 64, 128}}} %0 = amdgpu.wmma 16x16x24 %arg0 * %arg0 + %arg1 : vector<16xi8>, vector<16xi8>, vector<8xi32> func.return %0 : vector<8xi32> } // ----- func.func @wmma_source_length_mismatch(%arg0 : vector<8xf16>, %arg1 : vector<16xf16>, %arg2 : vector<8xf32>) -> vector<8xf32> { // expected-error@+1 {{'amdgpu.wmma' op source vectors have different lengths}} %0 = amdgpu.wmma 16x16x16 %arg0 * %arg1 + %arg2 : vector<8xf16>, vector<16xf16>, vector<8xf32> func.return %0 : vector<8xf32> } // ----- func.func @wmma_mismatched_float_types(%arg0 : vector<8xf16>, %arg1 : vector<8xbf16>, %arg2 : vector<8xf32>) -> vector<8xf32> { // expected-error@+1 {{'amdgpu.wmma' op source element types must match (except for fp8/bf8)}} %0 = amdgpu.wmma 16x16x16 %arg0 * %arg1 + %arg2 : vector<8xf16>, vector<8xbf16>, vector<8xf32> func.return %0 : vector<8xf32> } // ----- func.func @wmma_mismatched_int_types(%arg0 : vector<8xi8>, %arg1 : vector<8xi4>, %arg2 : vector<8xi32>) -> vector<8xi32> { // expected-error@+1 {{'amdgpu.wmma' op source element types must match (except for fp8/bf8)}} %0 = amdgpu.wmma 16x16x16 %arg0 * %arg1 + %arg2 : vector<8xi8>, vector<8xi4>, vector<8xi32> func.return %0 : vector<8xi32> } // ----- func.func @wmma_clamp_float(%arg0 : vector<8xf16>, %arg1 : vector<8xf32>) -> vector<8xf32> { // expected-error@+1 {{'amdgpu.wmma' op clamp flag is not supported for float types}} %0 = amdgpu.wmma 16x16x16 %arg0 * %arg0 + %arg1 {clamp} : vector<8xf16>, vector<8xf16>, vector<8xf32> func.return %0 : vector<8xf32> } // ----- func.func @wmma_unsignedA_float(%arg0 : vector<8xf16>, %arg1 : vector<8xf32>) -> vector<8xf32> { // expected-error@+1 {{'amdgpu.wmma' op unsigned flags are not supported for float types}} %0 = amdgpu.wmma 16x16x16 %arg0 * %arg0 + %arg1 {unsignedA} : vector<8xf16>, vector<8xf16>, vector<8xf32> func.return %0 : vector<8xf32> } // ----- func.func @wmma_unsignedB_float(%arg0 : vector<8xf16>, %arg1 : vector<8xf32>) -> vector<8xf32> { // expected-error@+1 {{'amdgpu.wmma' op unsigned flags are not supported for float types}} %0 = amdgpu.wmma 16x16x16 %arg0 * %arg0 + %arg1 {unsignedB} : vector<8xf16>, vector<8xf16>, vector<8xf32> func.return %0 : vector<8xf32> } // ----- // Missing `resetOffset` func.func @fat_raw_buffer_cast_stripped_offset(%m: memref<8xi32, strided<[1], offset: ?>, #gpu.address_space>) -> memref<8xi32, #amdgpu.address_space> { // expected-error@+1 {{'amdgpu.fat_raw_buffer_cast' op expected result type to be 'memref<8xi32, strided<[1], offset: ?>, #amdgpu.address_space>' but got 'memref<8xi32, #amdgpu.address_space>'}} %ret = amdgpu.fat_raw_buffer_cast %m : memref<8xi32, strided<[1], offset: ?>, #gpu.address_space> to memref<8xi32, #amdgpu.address_space> func.return %ret : memref<8xi32, #amdgpu.address_space> } // ----- func.func @fat_raw_buffer_cast_wrong_as(%m: memref<8xi32>) -> memref<8xi32, #amdgpu.address_space> { // expected-error@+1 {{'amdgpu.fat_raw_buffer_cast' op expected result type to be 'memref<8xi32, #amdgpu.address_space>' but got 'memref<8xi32, #amdgpu.address_space>'}} %ret = amdgpu.fat_raw_buffer_cast %m : memref<8xi32> to memref<8xi32, #amdgpu.address_space> return %ret : memref<8xi32, #amdgpu.address_space> } // ----- func.func @fat_raw_buffer_cast_stripping_offset_affine_map(%m: memref<8xi32, affine_map<(d0)[s0] -> (d0 + s0)>>) -> memref<8xi32, #amdgpu.address_space> { // expected-error@+1 {{'amdgpu.fat_raw_buffer_cast' op source type 'memref<8xi32, affine_map<(d0)[s0] -> (d0 + s0)>>' can't have its offset reset}} %ret = amdgpu.fat_raw_buffer_cast %m resetOffset : memref<8xi32, affine_map<(d0)[s0] -> (d0 + s0)>> to memref<8xi32, #amdgpu.address_space> func.return %ret : memref<8xi32, #amdgpu.address_space> } // ----- func.func @raw_buffer_load_wrong_num_indices(%src: memref<4x4xf32>, %idx: i32) -> f32 { // expected-error@+1 {{'amdgpu.raw_buffer_load' op expected 2 buffer indices, got 1}} %0 = amdgpu.raw_buffer_load %src[%idx] : memref<4x4xf32>, i32 -> f32 func.return %0 : f32 } // ----- func.func @swizzle_invalid_type(%arg0 : si32) -> si32 { // expected-error@+1 {{'amdgpu.swizzle_bitmode' op operand #0 must be Integer or Float or fixed-length vector of Integer or Float values of ranks 1}} %0 = amdgpu.swizzle_bitmode %arg0 1 2 4 : si32 func.return %0 : si32 } // ----- func.func @swizzle_scalable_vec(%arg0 : vector<[4]xf32>) -> vector<[4]xf32> { // expected-error@+1 {{'amdgpu.swizzle_bitmode' op operand #0 must be Integer or Float or fixed-length vector of Integer or Float values of ranks 1}} %0 = amdgpu.swizzle_bitmode %arg0 1 2 4 : vector<[4]xf32> func.return %0 : vector<[4]xf32> } // ----- func.func @transpose_load_addrspace(%idx1 : index, %idx2 : index, %mem : memref<128x32xf16, 1>) -> vector<4xf16> { // expected-error@+1 {{'amdgpu.transpose_load' op source memory address space must be Workgroup}} %0 = amdgpu.transpose_load %mem[%idx1, %idx2] : memref<128x32xf16, 1> -> vector<4xf16> func.return %0 : vector<4xf16> } // ----- func.func @transpose_load_addrspace(%idx1 : index, %idx2 : index, %mem : memref<128x32xf16, 1>) -> vector<4xf16> { // expected-error@+1 {{'amdgpu.transpose_load' op source memory address space must be Workgroup}} %0 = amdgpu.transpose_load %mem[%idx1, %idx2] : memref<128x32xf16, 1> -> vector<4xf16> func.return %0 : vector<4xf16> } // ----- func.func @transpose_load_elem_f32(%idx1 : index, %idx2 : index, %mem : memref<128x32xf32, 3>) -> vector<4xf32> { // expected-error@+1 {{'amdgpu.transpose_load' op Unsupported element type size for transpose load: 32 bits}} %0 = amdgpu.transpose_load %mem[%idx1, %idx2] : memref<128x32xf32, 3> -> vector<4xf32> func.return %0 : vector<4xf32> } // ----- func.func @transpose_load_vector_size_f16(%idx1 : index, %idx2 : index, %mem : memref<128x32xf16, 3>) -> vector<2xf16> { // expected-error@+1 {{'amdgpu.transpose_load' op Transferring type size mismatch: expected num of elements: 4 or 8}} %0 = amdgpu.transpose_load %mem[%idx1, %idx2] : memref<128x32xf16, 3> -> vector<2xf16> func.return %0 : vector<2xf16> } // ----- func.func @transpose_load_vector_size_i4(%idx1 : index, %idx2 : index, %mem : memref<128x32xi4, 3>) -> vector<20xi4> { // expected-error@+1 {{'amdgpu.transpose_load' op Transferring type size mismatch: expected num of elements: 16}} %0 = amdgpu.transpose_load %mem[%idx1, %idx2] : memref<128x32xi4, 3> -> vector<20xi4> func.return %0 : vector<20xi4> } // ----- func.func @transpose_load_vector_size_i8(%idx1 : index, %idx2 : index, %mem : memref<128x32xi8, 3>) -> vector<20xi8> { // expected-error@+1 {{'amdgpu.transpose_load' op Transferring type size mismatch: expected num of elements: 8}} %0 = amdgpu.transpose_load %mem[%idx1, %idx2] : memref<128x32xi8, 3> -> vector<20xi8> func.return %0 : vector<20xi8> } // ----- func.func @transpose_load_vector_size_i8(%idx1 : index, %idx2 : index, %mem : memref<128x32xi6, 3>) -> vector<8xi6> { // expected-error@+1 {{'amdgpu.transpose_load' op Transferring type size mismatch: expected num of elements: 16}} %0 = amdgpu.transpose_load %mem[%idx1, %idx2] : memref<128x32xi6, 3> -> vector<8xi6> func.return %0 : vector<8xi6> } // ----- func.func @transpose_load_wrong_num_indices(%idx : index, %mem : memref<128x32xf16, #gpu.address_space>) -> vector<4xf16> { // expected-error@+1 {{'amdgpu.transpose_load' op expected 2 source indices, got 1}} %0 = amdgpu.transpose_load %mem[%idx] : memref<128x32xf16, #gpu.address_space> -> vector<4xf16> func.return %0 : vector<4xf16> } // ----- func.func @global_transpose_load_wrong_addrspace(%i : index, %j : index, %src : memref<128x256xf16, 3>) -> vector<8xf16> { // expected-error@+1 {{'amdgpu.global_transpose_load' op source memory address space must be Global}} %0 = amdgpu.global_transpose_load %src[%i, %j] : memref<128x256xf16, 3> -> vector<8xf16> func.return %0 : vector<8xf16> } // ----- func.func @global_transpose_load_flat_addrspace(%i : index, %j : index, %src : memref<128x256xf16>) -> vector<8xf16> { // expected-error@+1 {{'amdgpu.global_transpose_load' op source memory address space must be Global}} %0 = amdgpu.global_transpose_load %src[%i, %j] : memref<128x256xf16> -> vector<8xf16> func.return %0 : vector<8xf16> } // ----- func.func @global_transpose_load_integer_flat_addrspace(%i : index, %j : index, %src : memref<128x256xf16, 0>) -> vector<8xf16> { // expected-error@+1 {{'amdgpu.global_transpose_load' op source memory address space must be Global}} %0 = amdgpu.global_transpose_load %src[%i, %j] : memref<128x256xf16, 0> -> vector<8xf16> func.return %0 : vector<8xf16> } // ----- func.func @global_transpose_load_wrong_num_indices(%idx : index, %mem : memref<128x32xf16, #gpu.address_space>) -> vector<8xf16> { // expected-error@+1 {{'amdgpu.global_transpose_load' op expected 2 source indices, got 1}} %0 = amdgpu.global_transpose_load %mem[%idx] : memref<128x32xf16, #gpu.address_space> -> vector<8xf16> func.return %0 : vector<8xf16> } // ----- func.func @gather_to_lds_non_lds(%idx1 : index, %mem1 : memref<32xf16>, %mem2 : memref<32xf16>) { // expected-error@+1 {{'amdgpu.gather_to_lds' op destination memory address space must be Workgroup}} amdgpu.gather_to_lds %mem1[%idx1], %mem2[%idx1] : vector<2xf16>, memref<32xf16>, memref<32xf16> func.return } // ----- func.func @gather_to_lds_non_lds(%idx1 : index, %mem1 : memref<32xf16>, %mem2 : memref<32xf16, strided<[?]>, #gpu.address_space>) { // expected-error@+1 {{'amdgpu.gather_to_lds' op destination type inner most dim must be contiguous}} amdgpu.gather_to_lds %mem1[%idx1], %mem2[%idx1] : vector<2xf16>, memref<32xf16>, memref<32xf16, strided<[?]>, #gpu.address_space> func.return } // ----- func.func @gather_to_lds_wrong_num_indices(%idx : index, %src : memref<32x32xf16, #gpu.address_space>, %dst : memref<32x32xf16, #gpu.address_space>) { // expected-error@+1 {{'amdgpu.gather_to_lds' op expected 2 source indices, got 1}} amdgpu.gather_to_lds %src[%idx], %dst[%idx, %idx] : vector<2xf16>, memref<32x32xf16, #gpu.address_space>, memref<32x32xf16, #gpu.address_space> func.return } // ----- func.func @gather_to_lds_bad_integer_address_space(%idx : index, %src : memref<32xf16, 8>, %dst : memref<32xf16, #gpu.address_space>) { // expected-error@+1 {{'amdgpu.gather_to_lds' op source memory address space must be global or fat raw buffer}} amdgpu.gather_to_lds %src[%idx], %dst[%idx] : vector<2xf16>, memref<32xf16, 8>, memref<32xf16, #gpu.address_space> func.return } // ----- func.func @global_load_async_to_lds_non_lds(%idx1 : index, %mem1 : memref<32xf32, #gpu.address_space>, %mem2 : memref<32xf32>) { // expected-error@+1 {{'amdgpu.global_load_async_to_lds' op destination memory address space must be Workgroup}} amdgpu.global_load_async_to_lds %mem1[%idx1], %mem2[%idx1] : f32, memref<32xf32, #gpu.address_space>, memref<32xf32> func.return } // ----- func.func @global_load_async_to_lds_bad_size_16bit(%idx1 : index, %mem1 : memref<32xf16, #gpu.address_space>, %mem2 : memref<32xf16, #gpu.address_space>) { // expected-error@+1 {{'amdgpu.global_load_async_to_lds' op transfer type size must be 8, 32, 64, or 128 bits}} amdgpu.global_load_async_to_lds %mem1[%idx1], %mem2[%idx1] : f16, memref<32xf16, #gpu.address_space>, memref<32xf16, #gpu.address_space> func.return } // ----- func.func @global_load_async_to_lds_src_not_global(%idx1 : index, %mem1 : memref<32xf32, #gpu.address_space>, %mem2 : memref<32xf32, #gpu.address_space>) { // expected-error@+1 {{'amdgpu.global_load_async_to_lds' op source memory address space must be global}} amdgpu.global_load_async_to_lds %mem1[%idx1], %mem2[%idx1] : f32, memref<32xf32, #gpu.address_space>, memref<32xf32, #gpu.address_space> func.return } // ----- func.func @global_load_async_to_lds_src_flat(%idx1 : index, %mem1 : memref<32xf32>, %mem2 : memref<32xf32, #gpu.address_space>) { // expected-error@+1 {{'amdgpu.global_load_async_to_lds' op source memory address space must be global}} amdgpu.global_load_async_to_lds %mem1[%idx1], %mem2[%idx1] : f32, memref<32xf32>, memref<32xf32, #gpu.address_space> func.return } // ----- func.func @global_load_async_to_lds_src_integer_flat(%idx1 : index, %mem1 : memref<32xf32, 0>, %mem2 : memref<32xf32, #gpu.address_space>) { // expected-error@+1 {{'amdgpu.global_load_async_to_lds' op source memory address space must be global}} amdgpu.global_load_async_to_lds %mem1[%idx1], %mem2[%idx1] : f32, memref<32xf32, 0>, memref<32xf32, #gpu.address_space> func.return } // ----- func.func @global_load_async_to_lds_wrong_num_indices(%idx : index, %src : memref<32x32xf32, #gpu.address_space>, %dst : memref<32x32xf32, #gpu.address_space>) { // expected-error@+1 {{'amdgpu.global_load_async_to_lds' op expected 2 destination indices, got 1}} amdgpu.global_load_async_to_lds %src[%idx, %idx], %dst[%idx] : f32, memref<32x32xf32, #gpu.address_space>, memref<32x32xf32, #gpu.address_space> func.return } // ----- func.func @scaled_mfma_invalid_m(%arg0 : vector<4xf8E8M0FNU>, %arg1 : vector<32xf4E2M1FN>, %arg2 : vector<16xf32>) -> vector<16xf32> { // expected-error@+1 {{'amdgpu.scaled_mfma' op attribute 'm' failed to satisfy constraint: 32-bit signless integer attribute whose value is one of {16, 32}}} %0 = amdgpu.scaled_mfma 8x32x64 (%arg0[0] * %arg1) * (%arg0[1] * %arg1) + %arg2 : vector<4xf8E8M0FNU>, vector<32xf4E2M1FN>, vector<4xf8E8M0FNU>, vector<32xf4E2M1FN>, vector<16xf32> func.return %0 : vector<16xf32> } // ----- func.func @scaled_mfma_invalid_n(%arg0 : vector<4xf8E8M0FNU>, %arg1 : vector<32xf4E2M1FN>, %arg2 : vector<16xf32>) -> vector<16xf32> { // expected-error@+1 {{'amdgpu.scaled_mfma' op attribute 'n' failed to satisfy constraint: 32-bit signless integer attribute whose value is one of {16, 32}}} %0 = amdgpu.scaled_mfma 32x8x64 (%arg0[0] * %arg1) * (%arg0[1] * %arg1) + %arg2 : vector<4xf8E8M0FNU>, vector<32xf4E2M1FN>, vector<4xf8E8M0FNU>, vector<32xf4E2M1FN>, vector<16xf32> func.return %0 : vector<16xf32> } // ----- func.func @scaled_mfma_invalid_k(%arg0 : vector<4xf8E8M0FNU>, %arg1 : vector<32xf4E2M1FN>, %arg2 : vector<16xf32>) -> vector<16xf32> { // expected-error@+1 {{'amdgpu.scaled_mfma' op attribute 'k' failed to satisfy constraint: 32-bit signless integer attribute whose value is one of {64, 128}}} %0 = amdgpu.scaled_mfma 32x32x32 (%arg0[0] * %arg1) * (%arg0[1] * %arg1) + %arg2 : vector<4xf8E8M0FNU>, vector<32xf4E2M1FN>, vector<4xf8E8M0FNU>, vector<32xf4E2M1FN>, vector<16xf32> func.return %0 : vector<16xf32> } // ----- func.func @make_dma_base_invalid_addressspace(%idx: index, %mem: memref<8xi32>) { // expected-error@+1 {{'amdgpu.make_dma_base' op lds memref must have workgroup address space attribute.}} amdgpu.make_dma_base %mem[%idx], %mem[%idx] : memref<8xi32>, memref<8xi32> -> !amdgpu.tdm_base } // ----- func.func @make_dma_base_invalid_addressspace(%idx: index, %smem : memref<8xi32, #gpu.address_space>) { // expected-error@+1 {{'amdgpu.make_dma_base' op global memref must have global address space attribute.}} amdgpu.make_dma_base %smem[%idx], %smem[%idx] : memref<8xi32, #gpu.address_space>, memref<8xi32, #gpu.address_space> -> !amdgpu.tdm_base return } // ----- func.func @make_dma_base_flat_global_addressspace(%idx: index, %mem: memref<8xi32>, %smem: memref<8xi32, #gpu.address_space>) { // expected-error@+1 {{'amdgpu.make_dma_base' op global memref must have global address space attribute.}} amdgpu.make_dma_base %mem[%idx], %smem[%idx] : memref<8xi32>, memref<8xi32, #gpu.address_space> -> !amdgpu.tdm_base return } // ----- func.func @make_dma_base_integer_flat_global_addressspace(%idx: index, %mem: memref<8xi32, 0>, %smem: memref<8xi32, #gpu.address_space>) { // expected-error@+1 {{'amdgpu.make_dma_base' op global memref must have global address space attribute.}} amdgpu.make_dma_base %mem[%idx], %smem[%idx] : memref<8xi32, 0>, memref<8xi32, #gpu.address_space> -> !amdgpu.tdm_base return } // ----- func.func @make_gather_dma_base_invalid_addressspace(%idx: index, %mem: memref<8xi32>) { // expected-error@+1 {{'amdgpu.make_gather_dma_base' op lds memref must have workgroup address space attribute.}} amdgpu.make_gather_dma_base %mem[%idx], %mem[%idx] : memref<8xi32>, memref<8xi32> -> !amdgpu.tdm_gather_base return } // ----- func.func @make_gather_dma_base_invalid_index_type(%idx: index, %smem: memref<8xi32, #gpu.address_space>, %mem: memref<8xi32>) { // expected-error@+1 {{index type must be i16 or i32 but index type is 'i64'.}} amdgpu.make_gather_dma_base %smem[%idx], %mem[%idx] : memref<8xi32, #gpu.address_space>, memref<8xi32> -> !amdgpu.tdm_gather_base return } // ----- func.func @make_gather_dma_base_invalid_addressspace(%idx: index, %smem : memref<8xi32, #gpu.address_space>) { // expected-error@+1 {{'amdgpu.make_gather_dma_base' op global memref must have global address space attribute.}} amdgpu.make_gather_dma_base %smem[%idx], %smem[%idx] : memref<8xi32, #gpu.address_space>, memref<8xi32, #gpu.address_space> -> !amdgpu.tdm_gather_base return } // ----- func.func @make_gather_dma_base_flat_global_addressspace(%idx: index, %mem: memref<8xi32>, %smem: memref<8xi32, #gpu.address_space>) { // expected-error@+1 {{'amdgpu.make_gather_dma_base' op global memref must have global address space attribute.}} amdgpu.make_gather_dma_base %mem[%idx], %smem[%idx] : memref<8xi32>, memref<8xi32, #gpu.address_space> -> !amdgpu.tdm_gather_base return } // ----- func.func @make_gather_dma_base_integer_flat_global_addressspace(%idx: index, %mem: memref<8xi32, 0>, %smem: memref<8xi32, #gpu.address_space>) { // expected-error@+1 {{'amdgpu.make_gather_dma_base' op global memref must have global address space attribute.}} amdgpu.make_gather_dma_base %mem[%idx], %smem[%idx] : memref<8xi32, 0>, memref<8xi32, #gpu.address_space> -> !amdgpu.tdm_gather_base return } // ----- func.func @make_dma_base_wrong_num_indices(%idx: index, %global: memref<8x8xi32, #gpu.address_space>, %lds: memref<8x8xi32, #gpu.address_space>) { // expected-error@+1 {{'amdgpu.make_dma_base' op expected 2 global indices, got 1}} amdgpu.make_dma_base %global[%idx], %lds[%idx, %idx] : memref<8x8xi32, #gpu.address_space>, memref<8x8xi32, #gpu.address_space> -> !amdgpu.tdm_base return } // ----- func.func @make_gather_dma_base_wrong_num_indices(%idx: index, %global: memref<8x8xi32, #gpu.address_space>, %lds: memref<8x8xi32, #gpu.address_space>) { // expected-error@+1 {{'amdgpu.make_gather_dma_base' op expected 2 lds indices, got 1}} amdgpu.make_gather_dma_base %global[%idx, %idx], %lds[%idx] : memref<8x8xi32, #gpu.address_space>, memref<8x8xi32, #gpu.address_space> -> !amdgpu.tdm_gather_base return } // ----- func.func @make_dma_base_invalid_barrier(%base: !amdgpu.tdm_base, %barrier: memref<8x!amdgpu.ds_barrier_state>, %idx: index) { // expected-error@+1 {{'amdgpu.make_dma_descriptor' op atomic barrier address must be in LDS.}} amdgpu.make_dma_descriptor %base globalSize [64, 64] globalStride [64, 1] sharedSize [64, 64] atomicBarrier(%barrier[%idx] : memref<8x!amdgpu.ds_barrier_state>) : !amdgpu.tdm_base -> !amdgpu.tdm_descriptor return } // ----- func.func @make_dma_descriptor_barrier_wrong_num_indices(%base: !amdgpu.tdm_base, %barrier: memref<8x8x!amdgpu.ds_barrier_state, #gpu.address_space>, %idx: index) { // expected-error@+1 {{'amdgpu.make_dma_descriptor' op expected 2 atomic barrier indices, got 1}} amdgpu.make_dma_descriptor %base globalSize [64, 64] globalStride [64, 1] sharedSize [64, 64] atomicBarrier(%barrier[%idx] : memref<8x8x!amdgpu.ds_barrier_state, #gpu.address_space>) : !amdgpu.tdm_base -> !amdgpu.tdm_descriptor return } // ----- func.func @make_dma_descriptor_barrier_indices_without_address( %base: !amdgpu.tdm_base, %idx: index) { // expected-error@+1 {{'amdgpu.make_dma_descriptor' op atomic barrier indices require an atomic barrier address}} %0 = "amdgpu.make_dma_descriptor"(%base, %idx) <{ global_static_sizes = array, global_static_strides = array, operandSegmentSizes = array, shared_static_sizes = array }> : (!amdgpu.tdm_base, index) -> !amdgpu.tdm_descriptor return } // ----- // CHECK-LABEL: func @make_dma_descriptor_invalid_empty_strides // CHECK-SAME: (%[[BASE:.+]]: !amdgpu.tdm_base) func.func @make_dma_descriptor_invalid_empty_strides(%base: !amdgpu.tdm_base) { // expected-error@+1 {{'amdgpu.make_dma_descriptor' op strides must not be empty.}} amdgpu.make_dma_descriptor %base globalSize [0, 1] globalStride [] sharedSize [1, 0] : !amdgpu.tdm_base -> !amdgpu.tdm_descriptor func.return } // ----- // CHECK-LABEL: func @make_dma_descriptor_invalid_innermost_stride // CHECK-SAME: (%[[BASE:.+]]: !amdgpu.tdm_base) func.func @make_dma_descriptor_invalid_innermost_stride(%base: !amdgpu.tdm_base) { // expected-error@+1 {{'amdgpu.make_dma_descriptor' op strides for the innermost dimension must be 1.}} amdgpu.make_dma_descriptor %base globalSize [2, 2] globalStride [1, 2] sharedSize [1, 0] : !amdgpu.tdm_base -> !amdgpu.tdm_descriptor func.return } // ----- // CHECK-LABEL: func @make_dma_descriptor_invalid_size_and_stride_sizes // CHECK-SAME: (%[[BASE:.+]]: !amdgpu.tdm_base) func.func @make_dma_descriptor_invalid_size_and_stride_sizes(%base: !amdgpu.tdm_base) { // expected-error@+1 {{'amdgpu.make_dma_descriptor' op strides and sizes must have same rank.}} amdgpu.make_dma_descriptor %base globalSize [1, 1, 1] globalStride [1, 1] sharedSize [1, 0] : !amdgpu.tdm_base -> !amdgpu.tdm_descriptor func.return } // ----- // CHECK-LABEL: func @make_dma_descriptor_invalid_shared_and_global_rank // CHECK-SAME: (%[[BASE:.+]]: !amdgpu.tdm_base) func.func @make_dma_descriptor_invalid_shared_and_global_rank(%base: !amdgpu.tdm_base) { // expected-error@+1 {{'amdgpu.make_dma_descriptor' op tensor must have same rank as tile.}} amdgpu.make_dma_descriptor %base globalSize [4, 4] globalStride [1, 1] sharedSize [1, 2, 3] : !amdgpu.tdm_base -> !amdgpu.tdm_descriptor func.return } // ----- // CHECK-LABEL: func @make_gather_dma_descriptor_invalid_index_types // CHECK-SAME: (%[[BASE:.+]]: !amdgpu.tdm_gather_base, %[[VEC:.+]]: vector<8xi32>) func.func @make_gather_dma_descriptor_invalid_index_types(%base: !amdgpu.tdm_gather_base, %indices: vector<8xi32>) { // expected-error@+1 {{'amdgpu.make_gather_dma_descriptor' op indices' element type must match base's element type.}} amdgpu.make_gather_dma_descriptor %base[%indices] globalSize [4, 4] globalStride [1, 1] sharedSize [1, 2] : !amdgpu.tdm_gather_base, vector<8xi32> -> !amdgpu.tdm_descriptor func.return } // ----- func.func @make_gather_dma_descriptor_barrier_wrong_num_indices(%base: !amdgpu.tdm_gather_base, %indices: vector<8xi16>, %barrier: memref<8x8x!amdgpu.ds_barrier_state, #gpu.address_space>, %idx: index) { // expected-error@+1 {{'amdgpu.make_gather_dma_descriptor' op expected 2 atomic barrier indices, got 1}} amdgpu.make_gather_dma_descriptor %base[%indices] globalSize [4, 4] globalStride [4, 1] sharedSize [1, 2] atomicBarrier(%barrier[%idx] : memref<8x8x!amdgpu.ds_barrier_state, #gpu.address_space>) : !amdgpu.tdm_gather_base, vector<8xi16> -> !amdgpu.tdm_descriptor func.return } // ----- func.func @make_gather_dma_descriptor_barrier_indices_without_address( %base: !amdgpu.tdm_gather_base, %indices: vector<8xi16>, %idx: index) { // expected-error@+1 {{'amdgpu.make_gather_dma_descriptor' op atomic barrier indices require an atomic barrier address}} %0 = "amdgpu.make_gather_dma_descriptor"(%base, %indices, %idx) <{ global_static_sizes = array, global_static_strides = array, operandSegmentSizes = array, shared_static_sizes = array }> : (!amdgpu.tdm_gather_base, vector<8xi16>, index) -> !amdgpu.tdm_descriptor func.return } // ----- func.func @sparse_mfma_dense_not_double_sparse(%a: vector<4xf16>, %b: vector<4xf16>, %c: vector<4xf32>, %idx: vector<4xi8>) -> vector<4xf32> { // expected-error@+1 {{'amdgpu.sparse_mfma' op operand #1 must be vector of 16-bit float values of length 8/16 or vector of bfloat16 type values of length 8/16 or vector of 8-bit signless integer values of length 16/32 or vector of f8E4M3FN type or f8E5M2 type values of length 16/32 or vector of f8E4M3FNUZ type or f8E5M2FNUZ type values of length 16/32, but got 'vector<4xf16>'}} %d = amdgpu.sparse_mfma 16x16x32 %a * %b + %c sparse(%idx : vector<4xi8>) : vector<4xf16>, vector<4xf16>, vector<4xf32> func.return %d : vector<4xf32> } // ----- func.func @sparse_mfma_mismatched_source_types(%a: vector<4xf16>, %b: vector<8xbf16>, %c: vector<4xf32>, %idx: vector<4xi8>) -> vector<4xf32> { // expected-error@+1 {{'amdgpu.sparse_mfma' op expected source operands to have the same element type}} %d = amdgpu.sparse_mfma 16x16x32 %a * %b + %c sparse(%idx : vector<4xi8>) : vector<4xf16>, vector<8xbf16>, vector<4xf32> func.return %d : vector<4xf32> } // ----- func.func @sparse_mfma_abid_invalid_for_8bit(%a: vector<8xi8>, %b: vector<16xi8>, %c: vector<4xi32>, %idx: vector<2xi16>) -> vector<4xi32> { // expected-error@+1 {{'amdgpu.sparse_mfma' op ABID must be in [0, 1] for this variant}} %d = amdgpu.sparse_mfma 16x16x64 %a * %b + %c sparse(%idx : vector<2xi16>) { abid = 2 : i32, cbsz = 0 : i32 } : vector<8xi8>, vector<16xi8>, vector<4xi32> func.return %d : vector<4xi32> } // ----- func.func @sparse_mfma_abid_invalid_for_16bit(%a: vector<4xf16>, %b: vector<8xf16>, %c: vector<4xf32>, %idx: vector<4xi8>) -> vector<4xf32> { // expected-error@+1 {{'amdgpu.sparse_mfma' op ABID must be in [0, 3] for this variant}} %d = amdgpu.sparse_mfma 16x16x32 %a * %b + %c sparse(%idx : vector<4xi8>) { abid = 4 : i32, cbsz = 0 : i32 } : vector<4xf16>, vector<8xf16>, vector<4xf32> func.return %d : vector<4xf32> } // ----- func.func @sparse_mfma_abid_invalid_for_gfx950_16bit(%a: vector<8xf16>, %b: vector<16xf16>, %c: vector<4xf32>, %idx: vector<2xi16>) -> vector<4xf32> { // expected-error@+1 {{'amdgpu.sparse_mfma' op ABID must be in [0, 1] for this variant}} %d = amdgpu.sparse_mfma 16x16x64 %a * %b + %c sparse(%idx : vector<2xi16>) { abid = 2 : i32, cbsz = 0 : i32 } : vector<8xf16>, vector<16xf16>, vector<4xf32> func.return %d : vector<4xf32> } // ----- func.func @sparse_mfma_gfx950_8bit_nonzero_cbsz(%a: vector<16xi8>, %b: vector<32xi8>, %c: vector<4xi32>, %idx: i32) -> vector<4xi32> { // expected-error@+1 {{'amdgpu.sparse_mfma' op CBSZ must be 0 for this variant (field is ignored by hardware)}} %d = amdgpu.sparse_mfma 16x16x128 %a * %b + %c sparse(%idx : i32) { abid = 0 : i32, cbsz = 1 : i32 } : vector<16xi8>, vector<32xi8>, vector<4xi32> func.return %d : vector<4xi32> } // ----- func.func @sparse_mfma_gfx950_8bit_nonzero_abid(%a: vector<16xi8>, %b: vector<32xi8>, %c: vector<4xi32>, %idx: i32) -> vector<4xi32> { // expected-error@+1 {{'amdgpu.sparse_mfma' op ABID must be 0 for this variant (field is ignored by hardware)}} %d = amdgpu.sparse_mfma 16x16x128 %a * %b + %c sparse(%idx : i32) { abid = 1 : i32, cbsz = 0 : i32 } : vector<16xi8>, vector<32xi8>, vector<4xi32> func.return %d : vector<4xi32> } // ----- func.func @sparse_mfma_wrong_idx_type_for_gfx950_8bit(%a: vector<16xi8>, %b: vector<32xi8>, %c: vector<4xi32>, %idx: vector<2xi16>) -> vector<4xi32> { // expected-error@+1 {{'amdgpu.sparse_mfma' op expected i32 sparse indices for this variant (no internal set structure), but got 'vector<2xi16>'}} %d = amdgpu.sparse_mfma 16x16x128 %a * %b + %c sparse(%idx : vector<2xi16>) : vector<16xi8>, vector<32xi8>, vector<4xi32> func.return %d : vector<4xi32> } // ----- func.func @sparse_mfma_wrong_idx_type_for_8bit(%a: vector<8xi8>, %b: vector<16xi8>, %c: vector<4xi32>, %idx: vector<4xi8>) -> vector<4xi32> { // expected-error@+1 {{'amdgpu.sparse_mfma' op expected vector<2xi16> sparse indices for this variant, but got 'vector<4xi8>'}} %d = amdgpu.sparse_mfma 16x16x64 %a * %b + %c sparse(%idx : vector<4xi8>) : vector<8xi8>, vector<16xi8>, vector<4xi32> func.return %d : vector<4xi32> } // ----- func.func @sparse_mfma_wrong_idx_type_for_16bit(%a: vector<4xf16>, %b: vector<8xf16>, %c: vector<4xf32>, %idx: vector<2xi16>) -> vector<4xf32> { // expected-error@+1 {{'amdgpu.sparse_mfma' op expected vector<4xi8> sparse indices for this variant, but got 'vector<2xi16>'}} %d = amdgpu.sparse_mfma 16x16x32 %a * %b + %c sparse(%idx : vector<2xi16>) : vector<4xf16>, vector<8xf16>, vector<4xf32> func.return %d : vector<4xf32> } // ----- func.func @sparse_mfma_wrong_idx_type_for_gfx950_16bit(%a: vector<8xf16>, %b: vector<16xf16>, %c: vector<4xf32>, %idx: vector<4xi8>) -> vector<4xf32> { // expected-error@+1 {{'amdgpu.sparse_mfma' op expected vector<2xi16> sparse indices for this variant, but got 'vector<4xi8>'}} %d = amdgpu.sparse_mfma 16x16x64 %a * %b + %c sparse(%idx : vector<4xi8>) : vector<8xf16>, vector<16xf16>, vector<4xf32> func.return %d : vector<4xf32> } // ----- func.func @sparse_mfma_wrong_source_count(%a: vector<4xf16>, %b: vector<8xf16>, %c: vector<16xf32>, %idx: vector<2xi16>) -> vector<16xf32> { // expected-error@+1 {{'amdgpu.sparse_mfma' op expected 16 source values for this operation but got 8}} %d = amdgpu.sparse_mfma 32x32x32 %a * %b + %c sparse(%idx : vector<2xi16>) : vector<4xf16>, vector<8xf16>, vector<16xf32> func.return %d : vector<16xf32> } // ----- func.func @sparse_mfma_wrong_dest_count(%a: vector<4xf16>, %b: vector<8xf16>, %c: vector<16xf32>, %idx: vector<4xi8>) -> vector<16xf32> { // expected-error@+1 {{'amdgpu.sparse_mfma' op expected 4 result values for this operation but got 16}} %d = amdgpu.sparse_mfma 16x16x32 %a * %b + %c sparse(%idx : vector<4xi8>) : vector<4xf16>, vector<8xf16>, vector<16xf32> func.return %d : vector<16xf32> } // ----- func.func @dpp_rejects_scalable(%a: vector<[16]x[16]xi8>, %b: vector<[16]x[16]xi8>) { // expected-error @+1 {{fixed-length vector of integer or float with element bitwidth <= 64 values of ranks 1}} %0 = amdgpu.dpp %a %b row_shl(1 : i32) : vector<[16]x[16]xi8> func.return } // ----- func.func @ds_barrier_init_non_workgroup(%barrier: memref, %participants: i32) { // expected-error@+1 {{'amdgpu.ds_barrier_init' op barrier must be in workgroup (LDS) memory}} amdgpu.ds_barrier_init %barrier[], %participants : memref, i32 func.return } // ----- func.func @ds_barrier_init_wrong_num_indices(%barrier: memref<8x8x!amdgpu.ds_barrier_state, #gpu.address_space>, %idx: index, %participants: i32) { // expected-error@+1 {{'amdgpu.ds_barrier_init' op expected 2 barrier indices, got 1}} amdgpu.ds_barrier_init %barrier[%idx], %participants : memref<8x8x!amdgpu.ds_barrier_state, #gpu.address_space>, i32 func.return } // ----- func.func @ds_barrier_poll_state_non_workgroup(%barrier: memref>) -> !amdgpu.ds_barrier_state { // expected-error@+1 {{'amdgpu.ds_barrier_poll_state' op barrier must be in workgroup (LDS) memory}} %state = amdgpu.ds_barrier_poll_state %barrier[] : memref> -> !amdgpu.ds_barrier_state func.return %state : !amdgpu.ds_barrier_state } // ----- func.func @ds_barrier_poll_state_wrong_num_indices(%barrier: memref<8x8x!amdgpu.ds_barrier_state, #gpu.address_space>, %idx: index) -> !amdgpu.ds_barrier_state { // expected-error@+1 {{'amdgpu.ds_barrier_poll_state' op expected 2 barrier indices, got 1}} %state = amdgpu.ds_barrier_poll_state %barrier[%idx] : memref<8x8x!amdgpu.ds_barrier_state, #gpu.address_space> -> !amdgpu.ds_barrier_state func.return %state : !amdgpu.ds_barrier_state } // ----- func.func @ds_async_barrier_arrive_wrong_num_indices(%barrier: memref<8x8x!amdgpu.ds_barrier_state, #gpu.address_space>, %idx: index) { // expected-error@+1 {{'amdgpu.ds_async_barrier_arrive' op expected 2 barrier indices, got 1}} amdgpu.ds_async_barrier_arrive %barrier[%idx] : memref<8x8x!amdgpu.ds_barrier_state, #gpu.address_space> func.return } // ----- func.func @ds_barrier_arrive_non_workgroup(%barrier: memref>, %count: i64) -> !amdgpu.ds_barrier_state { // expected-error@+1 {{'amdgpu.ds_barrier_arrive' op barrier must be in workgroup (LDS) memory}} %old_state = amdgpu.ds_barrier_arrive %barrier[], %count : memref>, i64 -> !amdgpu.ds_barrier_state func.return %old_state : !amdgpu.ds_barrier_state } // ----- func.func @ds_barrier_arrive_wrong_num_indices(%barrier: memref<8x8x!amdgpu.ds_barrier_state, #gpu.address_space>, %idx: index, %count: i64) -> !amdgpu.ds_barrier_state { // expected-error@+1 {{'amdgpu.ds_barrier_arrive' op expected 2 barrier indices, got 1}} %old_state = amdgpu.ds_barrier_arrive %barrier[%idx], %count : memref<8x8x!amdgpu.ds_barrier_state, #gpu.address_space>, i64 -> !amdgpu.ds_barrier_state func.return %old_state : !amdgpu.ds_barrier_state } // ----- func.func @sparse_wmma_invalid_m(%a: vector<8xf16>, %b: vector<16xf16>, %c: vector<8xf32>, %idx: vector<4xi8>) -> vector<8xf32> { // expected-error@+1 {{'amdgpu.sparse_wmma' op attribute 'm' failed to satisfy constraint: 32-bit signless integer attribute whose value is one of {16}}} %d = amdgpu.sparse_wmma 32x16x32 %a * %b + %c sparse(%idx : vector<4xi8>) : vector<8xf16>, vector<16xf16>, vector<8xf32> func.return %d : vector<8xf32> } // ----- func.func @sparse_wmma_invalid_n(%a: vector<8xf16>, %b: vector<16xf16>, %c: vector<8xf32>, %idx: vector<4xi8>) -> vector<8xf32> { // expected-error@+1 {{'amdgpu.sparse_wmma' op attribute 'n' failed to satisfy constraint: 32-bit signless integer attribute whose value is one of {16}}} %d = amdgpu.sparse_wmma 16x32x32 %a * %b + %c sparse(%idx : vector<4xi8>) : vector<8xf16>, vector<16xf16>, vector<8xf32> func.return %d : vector<8xf32> } // ----- func.func @sparse_wmma_invalid_k(%a: vector<8xf16>, %b: vector<16xf16>, %c: vector<8xf32>, %idx: vector<4xi8>) -> vector<8xf32> { // expected-error@+1 {{'amdgpu.sparse_wmma' op attribute 'k' failed to satisfy constraint: 32-bit signless integer attribute whose value is one of {32, 64, 128}}} %d = amdgpu.sparse_wmma 16x16x16 %a * %b + %c sparse(%idx : vector<4xi8>) : vector<8xf16>, vector<16xf16>, vector<8xf32> func.return %d : vector<8xf32> } // ----- func.func @sparse_wmma_dense_not_double_sparse(%a: vector<8xf16>, %b: vector<8xf16>, %c: vector<8xf32>, %idx: vector<4xi8>) -> vector<8xf32> { // expected-error@+1 {{'amdgpu.sparse_wmma' op expected dense source operand to have exactly double the number of elements of the sparse source operand}} %d = amdgpu.sparse_wmma 16x16x32 %a * %b + %c sparse(%idx : vector<4xi8>) : vector<8xf16>, vector<8xf16>, vector<8xf32> func.return %d : vector<8xf32> } // ----- func.func @sparse_wmma_dense_too_many_elements(%a: vector<8xf16>, %b: vector<32xf16>, %c: vector<8xf32>, %idx: vector<4xi8>) -> vector<8xf32> { // expected-error@+1 {{'amdgpu.sparse_wmma' op expected dense source operand to have exactly double the number of elements of the sparse source operand}} %d = amdgpu.sparse_wmma 16x16x32 %a * %b + %c sparse(%idx : vector<4xi8>) : vector<8xf16>, vector<32xf16>, vector<8xf32> func.return %d : vector<8xf32> } // ----- func.func @sparse_wmma_mismatched_element_types(%a: vector<8xf16>, %b: vector<16xbf16>, %c: vector<8xf32>, %idx: vector<4xi8>) -> vector<8xf32> { // expected-error@+1 {{'amdgpu.sparse_wmma' op expected source operands to have the same element type}} %d = amdgpu.sparse_wmma 16x16x32 %a * %b + %c sparse(%idx : vector<4xi8>) : vector<8xf16>, vector<16xbf16>, vector<8xf32> func.return %d : vector<8xf32> } // ----- func.func @sparse_wmma_mismatched_integer_types(%a: vector<8xi8>, %b: vector<16xi4>, %c: vector<8xi32>, %idx: vector<4xi8>) -> vector<8xi32> { // expected-error@+1 {{'amdgpu.sparse_wmma' op expected source operands to have the same element type}} %d = amdgpu.sparse_wmma 16x16x32 %a * %b + %c sparse(%idx : vector<4xi8>) : vector<8xi8>, vector<16xi4>, vector<8xi32> func.return %d : vector<8xi32> } // ----- func.func @sparse_wmma_invalid_sparse_idx_type(%a: vector<8xf16>, %b: vector<16xf16>, %c: vector<8xf32>, %idx: vector<2xi16>) -> vector<8xf32> { // expected-error@+1 {{'amdgpu.sparse_wmma' op operand #3 must be fixed-length vector of 8-bit signless integer values of length 4, but got 'vector<2xi16>'}} %d = amdgpu.sparse_wmma 16x16x32 %a * %b + %c sparse(%idx : vector<2xi16>) : vector<8xf16>, vector<16xf16>, vector<8xf32> func.return %d : vector<8xf32> } // ----- func.func @sparse_wmma_invalid_sparse_idx_length(%a: vector<8xf16>, %b: vector<16xf16>, %c: vector<8xf32>, %idx: vector<8xi8>) -> vector<8xf32> { // expected-error@+1 {{'amdgpu.sparse_wmma' op operand #3 must be fixed-length vector of 8-bit signless integer values of length 4, but got 'vector<8xi8>'}} %d = amdgpu.sparse_wmma 16x16x32 %a * %b + %c sparse(%idx : vector<8xi8>) : vector<8xf16>, vector<16xf16>, vector<8xf32> func.return %d : vector<8xf32> } // ----- func.func @sparse_wmma_invalid_accumulator_type(%a: vector<8xf16>, %b: vector<16xf16>, %c: vector<4xi32>, %idx: vector<4xi8>) -> vector<4xi32> { // expected-error@+1 {{'amdgpu.sparse_wmma' op source operand and destination operands must all be either integer or float types}} %d = amdgpu.sparse_wmma 16x16x32 %a * %b + %c sparse(%idx : vector<4xi8>) : vector<8xf16>, vector<16xf16>, vector<4xi32> func.return %d : vector<4xi32> } // ----- func.func @sparse_wmma_wave64_i4_equal_length_wrong_k(%a: vector<8xi4>, %b: vector<8xi4>, %c: vector<4xi32>, %idx: vector<4xi8>) -> vector<4xi32> { // expected-error@+1 {{'amdgpu.sparse_wmma' op expected dense source operand to have exactly double the number of elements of the sparse source operand}} %d = amdgpu.sparse_wmma 16x16x64 %a * %b + %c sparse(%idx : vector<4xi8>) {wave64} : vector<8xi4>, vector<8xi4>, vector<4xi32> func.return %d : vector<4xi32> } // ----- func.func @sparse_wmma_wave32_i4_should_not_have_equal_length(%a: vector<8xi4>, %b: vector<8xi4>, %c: vector<8xi32>, %idx: vector<4xi8>) -> vector<8xi32> { // expected-error@+1 {{'amdgpu.sparse_wmma' op expected dense source operand to have exactly double the number of elements of the sparse source operand}} %d = amdgpu.sparse_wmma 16x16x32 %a * %b + %c sparse(%idx : vector<4xi8>) : vector<8xi4>, vector<8xi4>, vector<8xi32> func.return %d : vector<8xi32> } // ----- func.func @sparse_wmma_invalid_output_vector_length(%a: vector<16xf16>, %b: vector<32xf16>, %c: vector<16xf32>, %idx: vector<4xi8>) -> vector<16xf32> { // expected-error@+1 {{'amdgpu.sparse_wmma' op expected 8 result values for this operation but got 16}} %d = amdgpu.sparse_wmma 16x16x64 %a * %b + %c sparse(%idx : vector<4xi8>) : vector<16xf16>, vector<32xf16>, vector<16xf32> func.return %d : vector<16xf32> } // ----- func.func @sparse_wmma_i4_requires_equal_length_wave64(%a: vector<8xi4>, %b: vector<16xi4>, %c: vector<4xi32>, %idx: vector<4xi8>) -> vector<4xi32> { // expected-error@+1 {{'amdgpu.sparse_wmma' op expected dense source operand to have exactly the same the number of elements}} %d = amdgpu.sparse_wmma 16x16x32 %a * %b + %c sparse(%idx : vector<4xi8>) {wave64} : vector<8xi4>, vector<16xi4>, vector<4xi32> func.return %d : vector<4xi32> } // ----- // GlobalPrefetchOp: source must have address space attribute func.func @global_prefetch_no_address_space(%src: memref<64x64xf16>, %i: i64, %j: i64) { // expected-error@+1 {{'amdgpu.global_prefetch' op the source must have address space attribute}} amdgpu.global_prefetch %src[%i, %j] RT WGP : memref<64x64xf16> func.return } // ----- // GlobalPrefetchOp: source must reside in global address space func.func @global_prefetch_wrong_address_space(%src: memref<64x64xf16, #gpu.address_space>, %i: i64, %j: i64) { // expected-error@+1 {{'amdgpu.global_prefetch' op the source must reside in global address space}} amdgpu.global_prefetch %src[%i, %j] RT SE : memref<64x64xf16, #gpu.address_space> func.return } // ----- // GlobalPrefetchOp: WG scope operates only in the non-speculative mode func.func @global_prefetch_wrong_num_indices(%src: memref<64x64xf16, #gpu.address_space>, %i: i64, %j: i64) { // expected-error@+1 {{'amdgpu.global_prefetch' op does not support speculative prefetch in WGP scope}} amdgpu.global_prefetch %src[%i, %j] RT WGP speculative : memref<64x64xf16, #gpu.address_space> func.return } // ----- // GlobalPrefetchOp: number of indices must match source shape rank func.func @global_prefetch_wrong_num_indices(%src: memref<64x64xf16, #gpu.address_space>, %i: i64) { // expected-error@+1 {{'amdgpu.global_prefetch' op expected 2 source indices, got 1}} amdgpu.global_prefetch %src[%i] RT DEV : memref<64x64xf16, #gpu.address_space> func.return } // ----- // GlobalPrefetchOp: NT temporal hint is not supported func.func @global_prefetch_nt_mode(%src: memref<64x64xf16, #gpu.address_space>, %i: i64, %j: i64) { // expected-error@+1 {{'amdgpu.global_prefetch' op does not support NT and LU modes}} amdgpu.global_prefetch %src[%i, %j] NT SYS : memref<64x64xf16, #gpu.address_space> func.return } // ----- // GlobalPrefetchOp: LU temporal hint is not supported func.func @global_prefetch_lu_mode(%src: memref<64x64xf16, #gpu.address_space>, %i: i64, %j: i64) { // expected-error@+1 {{'amdgpu.global_prefetch' op does not support NT and LU modes}} amdgpu.global_prefetch %src[%i, %j] LU DEV : memref<64x64xf16, #gpu.address_space> func.return } // ----- // GlobalPrefetchOp: NT_RT requires speculative mode func.func @global_prefetch_nt_rt_not_speculative(%src: memref<64x64xf16, #gpu.address_space>, %i: i64, %j: i64) { // expected-error@+1 {{'amdgpu.global_prefetch' op operates only in the speculative mode}} amdgpu.global_prefetch %src[%i, %j] NT_RT WGP : memref<64x64xf16, #gpu.address_space> func.return } // ----- // GlobalPrefetchOp: RT_NT requires speculative mode func.func @global_prefetch_rt_nt_not_speculative(%src: memref<64x64xf16, #gpu.address_space>, %i: i64, %j: i64) { // expected-error@+1 {{'amdgpu.global_prefetch' op operates only in the speculative mode}} amdgpu.global_prefetch %src[%i, %j] RT_NT SE : memref<64x64xf16, #gpu.address_space> func.return } // ----- // GlobalPrefetchOp: NT_HT requires speculative mode func.func @global_prefetch_nt_ht_not_speculative(%src: memref<64x64xf16, #gpu.address_space>, %i: i64, %j: i64) { // expected-error@+1 {{'amdgpu.global_prefetch' op operates only in the speculative mode}} amdgpu.global_prefetch %src[%i, %j] NT_HT DEV : memref<64x64xf16, #gpu.address_space> func.return } // ----- // DotOp: unsignedA is invalid on a float source. func.func @dot_float_source_unsigned_a(%a: vector<2xf16>, %b: vector<2xf16>, %c: f32) -> f32 { // expected-error@+1 {{'amdgpu.dot' op unsignedA/unsignedB are only valid for integer source types}} %r = amdgpu.dot %a * %b + %c {unsignedA} : vector<2xf16>, vector<2xf16>, f32 func.return %r : f32 } // ----- // DotOp: unsignedB is invalid on a float source. func.func @dot_float_source_unsigned_b(%a: vector<2xbf16>, %b: vector<2xbf16>, %c: f32) -> f32 { // expected-error@+1 {{'amdgpu.dot' op unsignedA/unsignedB are only valid for integer source types}} %r = amdgpu.dot %a * %b + %c {unsignedB} : vector<2xbf16>, vector<2xbf16>, f32 func.return %r : f32 } // ----- // DotOp: integer source requires i32 accumulator. func.func @dot_integer_bad_accumulator(%a: vector<4xi8>, %b: vector<4xi8>, %c: f32) -> f32 { // expected-error@+1 {{'amdgpu.dot' op expected i32 accumulator for integer sources}} %r = amdgpu.dot %a * %b + %c : vector<4xi8>, vector<4xi8>, f32 func.return %r : f32 } // ----- // DotOp: source element types must match for non-fp8 sources. func.func @dot_cross_float_elems(%a: vector<2xf16>, %b: vector<2xbf16>, %c: f32) -> f32 { // expected-error@+1 {{'amdgpu.dot' op expected source operands to have the same element type}} %r = amdgpu.dot %a * %b + %c : vector<2xf16>, vector<2xbf16>, f32 func.return %r : f32 } // ----- // DotOp: fp8 and non-fp8 sources cannot be mixed. func.func @dot_fp8_mixed_with_int(%a: vector<4xf8E4M3FN>, %b: vector<4xi8>, %c: f32) -> f32 { // expected-error@+1 {{'amdgpu.dot' op expected source operands to have the same element type}} %r = amdgpu.dot %a * %b + %c : vector<4xf8E4M3FN>, vector<4xi8>, f32 func.return %r : f32 } // ----- // DotOp: fp8 source requires f32 accumulator. func.func @dot_fp8_bad_accumulator(%a: vector<4xf8E4M3FN>, %b: vector<4xf8E4M3FN>, %c: f16) -> f16 { // expected-error@+1 {{'amdgpu.dot' op expected f32 accumulator for fp8 sources}} %r = amdgpu.dot %a * %b + %c : vector<4xf8E4M3FN>, vector<4xf8E4M3FN>, f16 func.return %r : f16 } // ----- // DotOp: clamp is illegal for (f16, f16) — no clamp bit in fdot2.f16.f16. func.func @dot_clamp_f16_f16(%a: vector<2xf16>, %b: vector<2xf16>, %c: f16) -> f16 { // expected-error@+1 {{'amdgpu.dot' op clamp is not supported for this (source, accumulator) combination}} %r = amdgpu.dot %a * %b + %c {clamp} : vector<2xf16>, vector<2xf16>, f16 func.return %r : f16 } // ----- // DotOp: clamp is illegal for (bf16, bf16) — no clamp bit in fdot2.bf16.bf16. func.func @dot_clamp_bf16_bf16(%a: vector<2xbf16>, %b: vector<2xbf16>, %c: bf16) -> bf16 { // expected-error@+1 {{'amdgpu.dot' op clamp is not supported for this (source, accumulator) combination}} %r = amdgpu.dot %a * %b + %c {clamp} : vector<2xbf16>, vector<2xbf16>, bf16 func.return %r : bf16 } // ----- // DotOp: clamp is illegal for any fp8 variant — no clamp bit in dot4.f32.*. func.func @dot_clamp_fp8(%a: vector<4xf8E4M3FN>, %b: vector<4xf8E4M3FN>, %c: f32) -> f32 { // expected-error@+1 {{'amdgpu.dot' op clamp is not supported for this (source, accumulator) combination}} %r = amdgpu.dot %a * %b + %c {clamp} : vector<4xf8E4M3FN>, vector<4xf8E4M3FN>, f32 func.return %r : f32 } // ----- // DotOp: clamp is illegal for bf8 (F8E5M2) sources as well. func.func @dot_clamp_bf8(%a: vector<4xf8E5M2>, %b: vector<4xf8E5M2>, %c: f32) -> f32 { // expected-error@+1 {{'amdgpu.dot' op clamp is not supported for this (source, accumulator) combination}} %r = amdgpu.dot %a * %b + %c {clamp} : vector<4xf8E5M2>, vector<4xf8E5M2>, f32 func.return %r : f32 } // ----- // DotOp: mixed-sign i16 dot has no hardware support (no sudot2 intrinsic). func.func @dot_mixed_sign_i16(%a: vector<2xi16>, %b: vector<2xi16>, %c: i32) -> i32 { // expected-error@+1 {{'amdgpu.dot' op mixed-sign dot is not supported for 16-bit integer sources}} %r = amdgpu.dot %a * %b + %c {unsignedA} : vector<2xi16>, vector<2xi16>, i32 func.return %r : i32 }