313 lines · plain
1// RUN: mlir-opt %s -split-input-file -verify-diagnostics2 3//===----------------------------------------------------------------------===//4// arm_sme.get_tile5//===----------------------------------------------------------------------===//6 7// -----8 9func.func @arm_sme_get_tile__bad_vector_type_rank_1() -> vector<[16]xi8> {10 // expected-error@+1 {{op result #0 must be a vector type that fits into a SME tile, but got 'vector<[16]xi8>'}}11 %0 = arm_sme.get_tile : vector<[16]xi8>12 return %0 : vector<[16]xi8>13}14 15// -----16 17func.func @arm_sme_get_tile__bad_vector_type_i4() -> vector<[16]x[16]xi4> {18 // expected-error@+1 {{op result #0 must be a vector type that fits into a SME tile, but got 'vector<[16]x[16]xi4>'}}19 %0 = arm_sme.get_tile : vector<[16]x[16]xi4>20 return %0 : vector<[16]x[16]xi4>21}22 23// -----24 25func.func @arm_sme_get_tile__bad_vector_type_non_scalable_dim_0() -> vector<16x[16]xi8> {26 // expected-error@+1 {{op result #0 must be a vector type that fits into a SME tile, but got 'vector<16x[16]xi8>'}}27 %0 = arm_sme.get_tile : vector<16x[16]xi8>28 return %0 : vector<16x[16]xi8>29}30 31// -----32 33func.func @arm_sme_get_tile__bad_vector_type_non_scalable_dim_1() -> vector<[16]x16xi8> {34 // expected-error@+1 {{op result #0 must be a vector type that fits into a SME tile, but got 'vector<[16]x16xi8>'}}35 %0 = arm_sme.get_tile : vector<[16]x16xi8>36 return %0 : vector<[16]x16xi8>37}38 39// -----40 41func.func @arm_sme_get_tile__bad_shape(%tile_id : i8) -> vector<[4]x[16]xi8> {42 // expected-error@+1 {{op result #0 must be a vector type that fits into a SME tile, but got 'vector<[4]x[16]xi8>'}}43 %0 = arm_sme.get_tile : vector<[4]x[16]xi8>44 return %0 : vector<[4]x[16]xi8>45}46 47//===----------------------------------------------------------------------===//48// arm_sme.insert_tile_slice49//===----------------------------------------------------------------------===//50 51// -----52 53func.func @arm_sme_insert_tile_slice_i8__bad_vector_length(%vector : vector<[8]xi8>, %tile : vector<[16]x[16]xi8>, %tile_slice_index : index) -> vector<[16]x[16]xi8> {54 %c0 = arith.constant 0 : index55 // expected-error@+1 {{op failed to verify that type of 'vector' matches type of 'tile' slice}}56 %0 = arm_sme.insert_tile_slice %vector, %tile[%tile_slice_index] : vector<[8]xi8> into vector<[16]x[16]xi8>57 return %0 : vector<[16]x[16]xi8>58}59 60// -----61 62func.func @arm_sme_insert_tile_slice_f32__bad_vector_length(%vector : vector<[8]xf32>, %tile : vector<[4]x[4]xf32>, %tile_slice_index : index) -> vector<[4]x[4]xf32> {63 %c0 = arith.constant 0 : index64 // expected-error@+1 {{op failed to verify that type of 'vector' matches type of 'tile' slice}}65 %0 = arm_sme.insert_tile_slice %vector, %tile[%tile_slice_index] : vector<[8]xf32> into vector<[4]x[4]xf32>66 return %0 : vector<[4]x[4]xf32>67}68 69// -----70 71func.func @arm_sme_insert_tile_slice__bad_element_type(%vector : vector<[4]xf64>, %tile : vector<[4]x[4]xf32>, %tile_slice_index : index) -> vector<[4]x[4]xf32> {72 %c0 = arith.constant 0 : index73 // expected-error@+1 {{op failed to verify that type of 'vector' matches type of 'tile' slice}}74 %0 = arm_sme.insert_tile_slice %vector, %tile[%tile_slice_index] : vector<[4]xf64> into vector<[4]x[4]xf32>75 return %0 : vector<[4]x[4]xf32>76}77 78//===----------------------------------------------------------------------===//79// arm_sme.extract_tile_slice80//===----------------------------------------------------------------------===//81 82// -----83 84func.func @arm_sme_extract_tile_slice__bad_result_length(%tile : vector<[4]x[4]xf32>, %tile_slice_index : index) -> vector<[2]xf32> {85 // expected-error@+1 {{op failed to verify that type of 'result' matches type of 'tile' slice}}86 %0 = arm_sme.extract_tile_slice %tile[%tile_slice_index] : vector<[2]xf32> from vector<[4]x[4]xf32>87 return %0 : vector<[2]xf32>88}89 90// -----91 92func.func @arm_sme_extract_tile_slice__bad_result_element_type(%tile : vector<[4]x[4]xf32>, %tile_slice_index : index) -> vector<[4]xf64> {93 // expected-error@+1 {{op failed to verify that type of 'result' matches type of 'tile' slice}}94 %0 = arm_sme.extract_tile_slice %tile[%tile_slice_index] : vector<[4]xf64> from vector<[4]x[4]xf32>95 return %0 : vector<[4]xf64>96}97 98//===----------------------------------------------------------------------===//99// arm_sme.tile_load100//===----------------------------------------------------------------------===//101 102// -----103 104func.func @arm_sme_tile_load__bad_padding_type(%src : memref<?x?xf64>, %pad : f32, %mask : vector<[2]x[2]xi1>) {105 %c0 = arith.constant 0 : index106 // expected-note@-2 {{prior use here}}107 // expected-error@+1 {{use of value '%pad' expects different type than prior uses: 'f64' vs 'f32'}}108 %tile = arm_sme.tile_load %src[%c0, %c0], %pad, %mask : memref<?x?xf64>, vector<[2]x[2]xf64>109 return110}111 112// -----113 114func.func @arm_sme_tile_load__bad_mask_type(%src : memref<?x?xf64>, %pad : f64, %mask : vector<[4]x[4]xi1>) {115 %c0 = arith.constant 0 : index116 // expected-note@-2 {{prior use here}}117 // expected-error@+1 {{use of value '%mask' expects different type than prior uses: 'vector<[2]x[2]xi1>' vs 'vector<[4]x[4]xi1>}}118 %tile = arm_sme.tile_load %src[%c0, %c0], %pad, %mask : memref<?x?xf64>, vector<[2]x[2]xf64>119 return120}121 122// -----123 124func.func @arm_sme_tile_load__pad_but_no_mask(%src : memref<?x?xf64>, %pad : f64) {125 %c0 = arith.constant 0 : index126 // expected-error@+1 {{op failed to verify that both `padding` and `mask` should be provided or neither}}127 %tile = arm_sme.tile_load %src[%c0, %c0], %pad, : memref<?x?xf64>, vector<[2]x[2]xf64>128 return129}130 131// -----132 133func.func @arm_sme_tile_load__bad_memref_rank(%src : memref<?xf64>, %pad : f64) {134 %c0 = arith.constant 0 : index135 // expected-error@+1 {{op operand #0 must be 2D memref of any type values, but got 'memref<?xf64>'}}136 %tile = arm_sme.tile_load %src[%c0], %pad, : memref<?xf64>, vector<[2]x[2]xf64>137 return138}139 140// -----141 142func.func @arm_sme_tile_load__bad_element_type(%src : memref<?x?xi32>) {143 %c0 = arith.constant 0 : index144 // expected-error@+1 {{failed to verify that all of {result, base} have same element type}}145 %tile = arm_sme.tile_load %src[%c0, %c0] : memref<?x?xi32>, vector<[16]x[16]xi8>146 return147}148 149//===----------------------------------------------------------------------===//150// arm_sme.load_tile_slice151//===----------------------------------------------------------------------===//152 153// -----154 155func.func @arm_sme_load_tile_slice__bad_mask_type(%src : memref<?x?xi8>, %mask : vector<[2]xi1>, %tile : vector<[16]x[16]xi8>, %tile_slice_index : index) {156 %c0 = arith.constant 0 : index157 // expected-error@+1 {{op failed to verify that `mask` has i1 element type and the shape is a slice of `result`}}158 %tile_update = arm_sme.load_tile_slice %src[%c0], %mask, %tile, %tile_slice_index : memref<?x?xi8>, vector<[2]xi1>, vector<[16]x[16]xi8>159 return160}161 162// -----163 164func.func @arm_sme_load_tile_slice__bad_element_type(%src : memref<?x?xi32>, %mask : vector<[16]xi1>, %tile : vector<[16]x[16]xi8>, %tile_slice_index : index) {165 %c0 = arith.constant 0 : index166 // expected-error@+1 {{op failed to verify that all of {tile, base} have same element type}}167 %tile_update = arm_sme.load_tile_slice %src[%c0], %mask, %tile, %tile_slice_index : memref<?x?xi32>, vector<[16]xi1>, vector<[16]x[16]xi8>168 return169}170 171//===----------------------------------------------------------------------===//172// arm_sme.tile_store173//===----------------------------------------------------------------------===//174 175// -----176 177func.func @arm_sme_tile_store__bad_mask_type(%tile : vector<[16]x[16]xi8>, %mask : vector<[1]x[1]xi1>, %dest : memref<?x?xi8>) {178 %c0 = arith.constant 0 : index179 // expected-note@-2 {{prior use here}}180 // expected-error@+1 {{use of value '%mask' expects different type than prior uses: 'vector<[16]x[16]xi1>' vs 'vector<[1]x[1]xi1>}}181 arm_sme.tile_store %tile, %dest[%c0, %c0], %mask : memref<?x?xi8>, vector<[16]x[16]xi8>182 return183}184 185// -----186 187func.func @arm_sme_tile_store__bad_memref_rank(%tile : vector<[16]x[16]xi8>, %dest : memref<?xi8>) {188 %c0 = arith.constant 0 : index189 // expected-error@+1 {{op operand #1 must be 2D memref of any type values, but got 'memref<?xi8>'}}190 arm_sme.tile_store %tile, %dest[%c0] : memref<?xi8>, vector<[16]x[16]xi8>191 return192}193 194// -----195 196func.func @arm_sme_tile_store__bad_element_type(%tile : vector<[16]x[16]xi8>, %dest : memref<?x?xi32>) {197 %c0 = arith.constant 0 : index198 // expected-error@+1 {{op failed to verify that all of {valueToStore, base} have same element type}}199 arm_sme.tile_store %tile, %dest[%c0, %c0] : memref<?x?xi32>, vector<[16]x[16]xi8>200 return201}202 203//===----------------------------------------------------------------------===//204// arm_sme.store_tile_slice205//===----------------------------------------------------------------------===//206 207 208// -----209 210func.func @arm_sme_store_tile_slice__bad_mask_type(%tile : vector<[16]x[16]xi8>, %tile_slice_index : index, %mask : vector<[8]xi1>, %dest : memref<?x?xi8>) -> () {211 %c0 = arith.constant 0 : index212 // expected-error@+1 {{op failed to verify that `mask` has i1 element type and the shape is a slice of `tile`}}213 arm_sme.store_tile_slice %tile, %tile_slice_index, %mask, %dest[%c0] : memref<?x?xi8>, vector<[8]xi1>, vector<[16]x[16]xi8>214 return215}216 217// -----218 219func.func @arm_sme_store_tile_slice__bad_element_type(%tile : vector<[16]x[16]xi8>, %tile_slice_index : index, %mask : vector<[16]xi1>, %dest : memref<?x?xi32>) -> () {220 %c0 = arith.constant 0 : index221 // expected-error@+1 {{op failed to verify that all of {tile, base} have same element type}}222 arm_sme.store_tile_slice %tile, %tile_slice_index, %mask, %dest[%c0, %c0] : memref<?x?xi32>, vector<[16]xi1>, vector<[16]x[16]xi8>223 return224}225 226//===----------------------------------------------------------------------===//227// arm_sme.outerproduct228//===----------------------------------------------------------------------===//229 230// -----231 232func.func @arm_sme_outerproduct__bad_result_type(%vecA: vector<[2]xi16>, %vecB: vector<[2]xi16>) -> vector<[2]x[2]xi16>233{234 // expected-error@+1 {{op result #0 must be a vector type that fits into a SME tile, but got 'vector<[2]x[2]xi16>'}}235 %0 = arm_sme.outerproduct %vecA, %vecB : vector<[2]xi16>, vector<[2]xi16>236 return %0 : vector<[2]x[2]xi16>237}238 239// -----240 241func.func @arm_sme_outerproduct__bad_vector_type(%vecA: vector<[4]xf32>, %vecB: vector<[8]xf32>) -> vector<[4]x[4]xf32>242{243 // expected-error@+1 {{op failed to verify that all of {lhs, rhs} have same type}}244 %0 = arm_sme.outerproduct %vecA, %vecB : vector<[4]xf32>, vector<[8]xf32>245 return %0 : vector<[4]x[4]xf32>246}247 248//===----------------------------------------------------------------------===//249// arm_sme.fmopa_2way250//===----------------------------------------------------------------------===//251 252// -----253 254func.func @arm_sme_fmopa_2way__bad_rhs_vector_type(%vecA: vector<[8]xf16>, %vecB: vector<[4]xf32>) -> vector<[4]x[4]xf32>255{256 // expected-error@+1 {{op failed to verify that all of {lhs, rhs} have same type}}257 %0 = arm_sme.fmopa_2way %vecA, %vecB : vector<[8]xf16>, vector<[4]xf32> into vector<[4]x[4]xf32>258 return %0 : vector<[4]x[4]xf32>259}260 261// -----262 263func.func @arm_sme_fmopa_2way__bad_lhs_mask_type(%vecA: vector<[8]xf16>, %vecB: vector<[8]xf16>, %maskA : vector<[4]xi1>, %maskB : vector<[8]xi1>) -> vector<[4]x[4]xf32>264{265 // expected-note@-2 {{prior use here}}266 // expected-error@+1 {{use of value '%maskA' expects different type than prior uses: 'vector<[8]xi1>' vs 'vector<[4]xi1>}}267 %0 = arm_sme.fmopa_2way %vecA, %vecB masks(%maskA, %maskB) : vector<[8]xf16>, vector<[8]xf16> into vector<[4]x[4]xf32>268 return %0 : vector<[4]x[4]xf32>269}270 271// -----272 273func.func @arm_sme_fmopa_2way__bad_rhs_mask_type(%vecA: vector<[8]xf16>, %vecB: vector<[8]xf16>, %maskA : vector<[8]xi1>, %maskB : vector<[4]xi1>) -> vector<[4]x[4]xf32>274{275 // expected-note@-2 {{prior use here}}276 // expected-error@+1 {{use of value '%maskB' expects different type than prior uses: 'vector<[8]xi1>' vs 'vector<[4]xi1>}}277 %0 = arm_sme.fmopa_2way %vecA, %vecB masks(%maskA, %maskB) : vector<[8]xf16>, vector<[8]xf16> into vector<[4]x[4]xf32>278 return %0 : vector<[4]x[4]xf32>279}280 281// -----282 283func.func @arm_sme_fmopa_2way__no_rhs_mask(%vecA: vector<[8]xf16>, %vecB: vector<[8]xf16>, %maskA : vector<[8]xi1>) -> vector<[4]x[4]xf32>284{285 // expected-error@+1 {{op failed to verify that both `lhsMask` and `rhsMask` should be provided or neither}}286 %0 = arm_sme.fmopa_2way %vecA, %vecB masks(%maskA,) : vector<[8]xf16>, vector<[8]xf16> into vector<[4]x[4]xf32>287 return %0 : vector<[4]x[4]xf32>288}289 290// -----291 292func.func @arm_sme_fmopa_2way__bad_acc_type(%vecA: vector<[8]xf16>, %vecB: vector<[8]xf16>) -> vector<[4]x[4]xf32>293{294 %acc = arm_sme.zero : vector<[2]x[2]xi64>295 // expected-note@-1 {{prior use here}}296 // expected-error@+1 {{use of value '%acc' expects different type than prior uses: 'vector<[4]x[4]xf32>' vs 'vector<[2]x[2]xi64>'}}297 %0 = arm_sme.fmopa_2way %vecA, %vecB masks(%maskA, %maskB) acc(%acc) : vector<[8]xf16>, vector<[8]xf16> into vector<[4]x[4]xf32>298 return %0 : vector<[4]x[4]xf32>299}300 301//===----------------------------------------------------------------------===//302// arm_sme.smopa_4way303//===----------------------------------------------------------------------===//304 305// -----306 307func.func @arm_sme_smopa_4way__bad_tile_type(%vecA: vector<[8]xi16>, %vecB: vector<[8]xi16>) -> vector<[4]x[4]xi32>308{309 // expected-error@+1 {{op failed to verify that tile element size equals input element size * 4}}310 %0 = arm_sme.smopa_4way %vecA, %vecB : vector<[8]xi16>, vector<[8]xi16> into vector<[4]x[4]xi32>311 return %0 : vector<[4]x[4]xi32>312}313