1// RUN: mlir-opt %s -test-arm-sme-tile-allocation -split-input-file | FileCheck %s 2 3// ----- 4 5// Note: Tile IDs >= 16 are in-memory tile IDs (i.e. spills). 6 7// CHECK-LABEL: mixed_tiles 8func.func @mixed_tiles() { 9 // ZA0.Q, ZA2.Q, ZA4.Q, ZA6.Q, ZA8.Q, ZA10.Q, ZA12.Q, ZA14.Q 10 // CHECK-NEXT: tile_id = 0 11 %za0_h = arm_sme.get_tile : vector<[8]x[8]xi16> 12 // ZA1.Q, ZA5.Q, ZA9.Q, ZA13.Q 13 // CHECK-NEXT: tile_id = 1 14 %za1_s = arm_sme.get_tile : vector<[4]x[4]xi32> 15 // ZA3.D ZA3.Q, ZA11.Q 16 // CHECK-NEXT: tile_id = 3 17 %za3_d = arm_sme.get_tile : vector<[2]x[2]xi64> 18 // ZA7.Q 19 // CHECK-NEXT: tile_id = 7 20 %za7_q = arm_sme.get_tile : vector<[1]x[1]xi128> 21 // ZA15.Q is still free. 22 "test.some_use"(%za0_h) : (vector<[8]x[8]xi16>) -> () 23 "test.some_use"(%za1_s) : (vector<[4]x[4]xi32>) -> () 24 "test.some_use"(%za3_d) : (vector<[2]x[2]xi64>) -> () 25 "test.some_use"(%za7_q) : (vector<[1]x[1]xi128>) -> () 26 return 27} 28 29// ----- 30 31// CHECK-LABEL: za_b 32func.func @za_b() { 33 // CHECK-NEXT: tile_id = 0 34 %za0_b = arm_sme.get_tile : vector<[16]x[16]xi8> 35 // Next tile is in-memory: 36 // CHECK-NEXT: tile_id = 16 37 %next_tile = arm_sme.get_tile : vector<[16]x[16]xi8> 38 "test.some_use"(%za0_b) : (vector<[16]x[16]xi8>) -> () 39 "test.some_use"(%next_tile) : (vector<[16]x[16]xi8>) -> () 40 return 41} 42 43// ----- 44 45// CHECK-LABEL: za_b_overlapping_za_q 46func.func @za_b_overlapping_za_q() { 47 // CHECK-NEXT: tile_id = 0 48 %za0_b = arm_sme.get_tile : vector<[16]x[16]xi8> 49 // Next tile is in-memory: 50 // CHECK-NEXT: tile_id = 16 51 %next_tile = arm_sme.get_tile : vector<[1]x[1]xi128> 52 "test.some_use"(%za0_b) : (vector<[16]x[16]xi8>) -> () 53 "test.some_use"(%next_tile) : (vector<[1]x[1]xi128>) -> () 54 return 55} 56 57// ----- 58 59// CHECK-LABEL: za_h 60func.func @za_h() { 61 // CHECK-NEXT: tile_id = 0 62 %za0_h = arm_sme.get_tile : vector<[8]x[8]xi16> 63 // CHECK-NEXT: tile_id = 1 64 %za1_h = arm_sme.get_tile : vector<[8]x[8]xi16> 65 // Next tile is in-memory: 66 // CHECK-NEXT: tile_id = 16 67 %next_tile = arm_sme.get_tile : vector<[8]x[8]xi16> 68 "test.some_use"(%za0_h) : (vector<[8]x[8]xi16>) -> () 69 "test.some_use"(%za1_h) : (vector<[8]x[8]xi16>) -> () 70 "test.some_use"(%next_tile) : (vector<[8]x[8]xi16>) -> () 71 return 72} 73 74// ----- 75 76// CHECK-LABEL: za_h_overlapping_za_s 77func.func @za_h_overlapping_za_s() { 78 // ZA0.Q, ZA2.Q, ZA4.Q, ZA6.Q, ZA8.Q, ZA10.Q, ZA12.Q, ZA14.Q 79 // CHECK-NEXT: tile_id = 0 80 %za0_h = arm_sme.get_tile : vector<[8]x[8]xi16> 81 // ZA1.Q, ZA5.Q, ZA9.Q, ZA13.Q 82 // CHECK-NEXT: tile_id = 1 83 %za1_s = arm_sme.get_tile : vector<[4]x[4]xi32> 84 // ZA3.Q, ZA7.Q, ZA11.Q, ZA15.Q 85 // CHECK-NEXT: tile_id = 3 86 %za3_s = arm_sme.get_tile : vector<[4]x[4]xi32> 87 "test.some_use"(%za0_h) : (vector<[8]x[8]xi16>) -> () 88 "test.some_use"(%za1_s) : (vector<[4]x[4]xi32>) -> () 89 "test.some_use"(%za3_s) : (vector<[4]x[4]xi32>) -> () 90 return 91} 92 93// ----- 94 95// CHECK-LABEL: za_h_overlapping_za_d 96func.func @za_h_overlapping_za_d() { 97 // ZA0.Q, ZA2.Q, ZA4.Q, ZA6.Q, ZA8.Q, ZA10.Q, ZA12.Q, ZA14.Q 98 // CHECK-NEXT: tile_id = 0 99 %za0_h = arm_sme.get_tile : vector<[8]x[8]xi16> 100 // ZA1.Q, ZA9.Q 101 // CHECK-NEXT: tile_id = 1 102 %za1_d = arm_sme.get_tile : vector<[2]x[2]xi64> 103 // ZA3.Q, ZA11.Q 104 // CHECK-NEXT: tile_id = 3 105 %za3_d = arm_sme.get_tile : vector<[2]x[2]xi64> 106 // ZA5.Q, ZA13.Q 107 // CHECK-NEXT: tile_id = 5 108 %za5_d = arm_sme.get_tile : vector<[2]x[2]xi64> 109 // ZA7.Q, ZA15.Q 110 // CHECK-NEXT: tile_id = 7 111 %za7_d = arm_sme.get_tile : vector<[2]x[2]xi64> 112 "test.some_use"(%za0_h) : (vector<[8]x[8]xi16>) -> () 113 "test.some_use"(%za1_d) : (vector<[2]x[2]xi64>) -> () 114 "test.some_use"(%za3_d) : (vector<[2]x[2]xi64>) -> () 115 "test.some_use"(%za5_d) : (vector<[2]x[2]xi64>) -> () 116 "test.some_use"(%za7_d) : (vector<[2]x[2]xi64>) -> () 117 return 118} 119 120// ----- 121 122// CHECK-LABEL: za_h_overlapping_za_q 123func.func @za_h_overlapping_za_q() { 124 // CHECK-NEXT: tile_id = 0 125 %za0_h = arm_sme.get_tile : vector<[8]x[8]xi16> 126 // CHECK-NEXT: tile_id = 1 127 %za1_q = arm_sme.get_tile : vector<[1]x[1]xi128> 128 // CHECK-NEXT: tile_id = 3 129 %za3_q = arm_sme.get_tile : vector<[1]x[1]xi128> 130 // CHECK-NEXT: tile_id = 5 131 %za5_q = arm_sme.get_tile : vector<[1]x[1]xi128> 132 // CHECK-NEXT: tile_id = 7 133 %za7_q = arm_sme.get_tile : vector<[1]x[1]xi128> 134 // CHECK-NEXT: tile_id = 9 135 %za9_q = arm_sme.get_tile : vector<[1]x[1]xi128> 136 // CHECK-NEXT: tile_id = 11 137 %za11_q = arm_sme.get_tile : vector<[1]x[1]xi128> 138 // CHECK-NEXT: tile_id = 13 139 %za13_q = arm_sme.get_tile : vector<[1]x[1]xi128> 140 // CHECK-NEXT: tile_id = 15 141 %za15_q = arm_sme.get_tile : vector<[1]x[1]xi128> 142 // Next tile is in-memory: 143 // CHECK-NEXT: tile_id = 16 144 %next_tile = arm_sme.get_tile : vector<[1]x[1]xi128> 145 "test.some_use"(%za0_h) : (vector<[8]x[8]xi16>) -> () 146 "test.some_use"(%za1_q) : (vector<[1]x[1]xi128>) -> () 147 "test.some_use"(%za3_q) : (vector<[1]x[1]xi128>) -> () 148 "test.some_use"(%za5_q) : (vector<[1]x[1]xi128>) -> () 149 "test.some_use"(%za7_q) : (vector<[1]x[1]xi128>) -> () 150 "test.some_use"(%za9_q) : (vector<[1]x[1]xi128>) -> () 151 "test.some_use"(%za11_q) : (vector<[1]x[1]xi128>) -> () 152 "test.some_use"(%za13_q) : (vector<[1]x[1]xi128>) -> () 153 "test.some_use"(%za15_q) : (vector<[1]x[1]xi128>) -> () 154 "test.some_use"(%next_tile) : (vector<[1]x[1]xi128>) -> () 155 return 156} 157 158// ----- 159 160// CHECK-LABEL: za_s 161func.func @za_s() { 162 // CHECK-NEXT: tile_id = 0 163 %za0_s = arm_sme.get_tile : vector<[4]x[4]xi32> 164 // CHECK-NEXT: tile_id = 1 165 %za1_s = arm_sme.get_tile : vector<[4]x[4]xi32> 166 // CHECK-NEXT: tile_id = 2 167 %za2_s = arm_sme.get_tile : vector<[4]x[4]xi32> 168 // CHECK-NEXT: tile_id = 3 169 %za3_s = arm_sme.get_tile : vector<[4]x[4]xi32> 170 // Next tile is in-memory: 171 // CHECK-NEXT: tile_id = 16 172 %next_tile = arm_sme.get_tile : vector<[4]x[4]xi32> 173 "test.some_use"(%za0_s) : (vector<[4]x[4]xi32>) -> () 174 "test.some_use"(%za1_s) : (vector<[4]x[4]xi32>) -> () 175 "test.some_use"(%za2_s) : (vector<[4]x[4]xi32>) -> () 176 "test.some_use"(%za3_s) : (vector<[4]x[4]xi32>) -> () 177 "test.some_use"(%next_tile) : (vector<[4]x[4]xi32>) -> () 178 return 179} 180 181// ----- 182 183// CHECK-LABEL: za_s_overlapping_za_d 184func.func @za_s_overlapping_za_d() { 185 // ZA0.Q, ZA4.Q, ZA8.Q, ZA12.Q 186 // CHECK-NEXT: tile_id = 0 187 %za0_s = arm_sme.get_tile : vector<[4]x[4]xi32> 188 // ZA1.Q, ZA5.Q, ZA9.Q, ZA13.Q 189 // CHECK-NEXT: tile_id = 1 190 %za1_s = arm_sme.get_tile : vector<[4]x[4]xi32> 191 // ZA2.Q, ZA6.Q, ZA10.Q, ZA14.Q 192 // CHECK-NEXT: tile_id = 2 193 %za2_s = arm_sme.get_tile : vector<[4]x[4]xi32> 194 // ZA3.Q, ZA11.Q 195 // CHECK-NEXT: tile_id = 3 196 %za3_d = arm_sme.get_tile : vector<[2]x[2]xi64> 197 // ZA7.Q, ZA15.Q 198 // CHECK-NEXT: tile_id = 7 199 %za7_d = arm_sme.get_tile : vector<[2]x[2]xi64> 200 "test.some_use"(%za0_s) : (vector<[4]x[4]xi32>) -> () 201 "test.some_use"(%za1_s) : (vector<[4]x[4]xi32>) -> () 202 "test.some_use"(%za2_s) : (vector<[4]x[4]xi32>) -> () 203 "test.some_use"(%za3_d) : (vector<[2]x[2]xi64>) -> () 204 "test.some_use"(%za7_d) : (vector<[2]x[2]xi64>) -> () 205 return 206} 207 208// ----- 209 210// CHECK-LABEL: za_s_overlapping_za_q 211func.func @za_s_overlapping_za_q() { 212 // CHECK-NEXT: tile_id = 0 213 %za0_s = arm_sme.get_tile : vector<[4]x[4]xi32> 214 // CHECK-NEXT: tile_id = 1 215 %za1_q = arm_sme.get_tile : vector<[1]x[1]xi128> 216 // CHECK-NEXT: tile_id = 2 217 %za2_q = arm_sme.get_tile : vector<[1]x[1]xi128> 218 // CHECK-NEXT: tile_id = 3 219 %za3_q = arm_sme.get_tile : vector<[1]x[1]xi128> 220 // CHECK-NEXT: tile_id = 5 221 %za5_q = arm_sme.get_tile : vector<[1]x[1]xi128> 222 // CHECK-NEXT: tile_id = 6 223 %za6_q = arm_sme.get_tile : vector<[1]x[1]xi128> 224 // CHECK-NEXT: tile_id = 7 225 %za7_q = arm_sme.get_tile : vector<[1]x[1]xi128> 226 // CHECK-NEXT: tile_id = 9 227 %za9_q = arm_sme.get_tile : vector<[1]x[1]xi128> 228 // CHECK-NEXT: tile_id = 10 229 %za10_q = arm_sme.get_tile : vector<[1]x[1]xi128> 230 // CHECK-NEXT: tile_id = 11 231 %za11_q = arm_sme.get_tile : vector<[1]x[1]xi128> 232 // CHECK-NEXT: tile_id = 13 233 %za13_q = arm_sme.get_tile : vector<[1]x[1]xi128> 234 // CHECK-NEXT: tile_id = 14 235 %za14_q = arm_sme.get_tile : vector<[1]x[1]xi128> 236 // CHECK-NEXT: tile_id = 15 237 %za15_q = arm_sme.get_tile : vector<[1]x[1]xi128> 238 // Next tile is in-memory: 239 // CHECK-NEXT: tile_id = 16 240 %next_tile = arm_sme.get_tile : vector<[1]x[1]xi128> 241 "test.some_use"(%za0_s) : (vector<[4]x[4]xi32>) -> () 242 "test.some_use"(%za1_q) : (vector<[1]x[1]xi128>) -> () 243 "test.some_use"(%za2_q) : (vector<[1]x[1]xi128>) -> () 244 "test.some_use"(%za3_q) : (vector<[1]x[1]xi128>) -> () 245 "test.some_use"(%za5_q) : (vector<[1]x[1]xi128>) -> () 246 "test.some_use"(%za6_q) : (vector<[1]x[1]xi128>) -> () 247 "test.some_use"(%za7_q) : (vector<[1]x[1]xi128>) -> () 248 "test.some_use"(%za9_q) : (vector<[1]x[1]xi128>) -> () 249 "test.some_use"(%za10_q) : (vector<[1]x[1]xi128>) -> () 250 "test.some_use"(%za11_q) : (vector<[1]x[1]xi128>) -> () 251 "test.some_use"(%za13_q) : (vector<[1]x[1]xi128>) -> () 252 "test.some_use"(%za14_q) : (vector<[1]x[1]xi128>) -> () 253 "test.some_use"(%za15_q) : (vector<[1]x[1]xi128>) -> () 254 "test.some_use"(%next_tile) : (vector<[1]x[1]xi128>) -> () 255 return 256} 257 258// ----- 259 260// CHECK-LABEL: za_d 261func.func @za_d() { 262 // CHECK-NEXT: tile_id = 0 263 %za0_d = arm_sme.get_tile : vector<[2]x[2]xi64> 264 // CHECK-NEXT: tile_id = 1 265 %za1_d = arm_sme.get_tile : vector<[2]x[2]xi64> 266 // CHECK-NEXT: tile_id = 2 267 %za2_d = arm_sme.get_tile : vector<[2]x[2]xi64> 268 // CHECK-NEXT: tile_id = 3 269 %za3_d = arm_sme.get_tile : vector<[2]x[2]xi64> 270 // CHECK-NEXT: tile_id = 4 271 %za4_d = arm_sme.get_tile : vector<[2]x[2]xi64> 272 // CHECK-NEXT: tile_id = 5 273 %za5_d = arm_sme.get_tile : vector<[2]x[2]xi64> 274 // CHECK-NEXT: tile_id = 6 275 %za6_d = arm_sme.get_tile : vector<[2]x[2]xi64> 276 // CHECK-NEXT: tile_id = 7 277 %za7_d = arm_sme.get_tile : vector<[2]x[2]xi64> 278 // Next tile is in-memory: 279 // CHECK-NEXT: tile_id = 16 280 %next_tile = arm_sme.get_tile : vector<[2]x[2]xi64> 281 "test.some_use"(%za0_d) : (vector<[2]x[2]xi64>) -> () 282 "test.some_use"(%za1_d) : (vector<[2]x[2]xi64>) -> () 283 "test.some_use"(%za2_d) : (vector<[2]x[2]xi64>) -> () 284 "test.some_use"(%za3_d) : (vector<[2]x[2]xi64>) -> () 285 "test.some_use"(%za4_d) : (vector<[2]x[2]xi64>) -> () 286 "test.some_use"(%za5_d) : (vector<[2]x[2]xi64>) -> () 287 "test.some_use"(%za6_d) : (vector<[2]x[2]xi64>) -> () 288 "test.some_use"(%za7_d) : (vector<[2]x[2]xi64>) -> () 289 "test.some_use"(%next_tile) : (vector<[2]x[2]xi64>) -> () 290 return 291} 292 293// ----- 294 295// CHECK-LABEL: za_d_overlapping_za_q 296func.func @za_d_overlapping_za_q() { 297 // CHECK-NEXT: tile_id = 0 298 %za0_d = arm_sme.get_tile : vector<[2]x[2]xi64> 299 // CHECK-NEXT: tile_id = 1 300 %za1_q = arm_sme.get_tile : vector<[1]x[1]xi128> 301 // CHECK-NEXT: tile_id = 2 302 %za2_q = arm_sme.get_tile : vector<[1]x[1]xi128> 303 // CHECK-NEXT: tile_id = 3 304 %za3_q = arm_sme.get_tile : vector<[1]x[1]xi128> 305 // CHECK-NEXT: tile_id = 4 306 %za4_q = arm_sme.get_tile : vector<[1]x[1]xi128> 307 // CHECK-NEXT: tile_id = 5 308 %za5_q = arm_sme.get_tile : vector<[1]x[1]xi128> 309 // CHECK-NEXT: tile_id = 6 310 %za6_q = arm_sme.get_tile : vector<[1]x[1]xi128> 311 // CHECK-NEXT: tile_id = 7 312 %za7_q = arm_sme.get_tile : vector<[1]x[1]xi128> 313 // CHECK-NEXT: tile_id = 9 314 %za9_q = arm_sme.get_tile : vector<[1]x[1]xi128> 315 // CHECK-NEXT: tile_id = 10 316 %za10_q = arm_sme.get_tile : vector<[1]x[1]xi128> 317 // CHECK-NEXT: tile_id = 11 318 %za11_q = arm_sme.get_tile : vector<[1]x[1]xi128> 319 // CHECK-NEXT: tile_id = 12 320 %za12_q = arm_sme.get_tile : vector<[1]x[1]xi128> 321 // CHECK-NEXT: tile_id = 13 322 %za13_q = arm_sme.get_tile : vector<[1]x[1]xi128> 323 // CHECK-NEXT: tile_id = 14 324 %za14_q = arm_sme.get_tile : vector<[1]x[1]xi128> 325 // CHECK-NEXT: tile_id = 15 326 %za15_q = arm_sme.get_tile : vector<[1]x[1]xi128> 327 // Next tile is in-memory: 328 // CHECK-NEXT: tile_id = 16 329 %next_tile = arm_sme.get_tile : vector<[1]x[1]xi128> 330 "test.some_use"(%za0_d) : (vector<[2]x[2]xi64>) -> () 331 "test.some_use"(%za1_q) : (vector<[1]x[1]xi128>) -> () 332 "test.some_use"(%za2_q) : (vector<[1]x[1]xi128>) -> () 333 "test.some_use"(%za3_q) : (vector<[1]x[1]xi128>) -> () 334 "test.some_use"(%za4_q) : (vector<[1]x[1]xi128>) -> () 335 "test.some_use"(%za5_q) : (vector<[1]x[1]xi128>) -> () 336 "test.some_use"(%za6_q) : (vector<[1]x[1]xi128>) -> () 337 "test.some_use"(%za7_q) : (vector<[1]x[1]xi128>) -> () 338 "test.some_use"(%za9_q) : (vector<[1]x[1]xi128>) -> () 339 "test.some_use"(%za10_q) : (vector<[1]x[1]xi128>) -> () 340 "test.some_use"(%za11_q) : (vector<[1]x[1]xi128>) -> () 341 "test.some_use"(%za12_q) : (vector<[1]x[1]xi128>) -> () 342 "test.some_use"(%za13_q) : (vector<[1]x[1]xi128>) -> () 343 "test.some_use"(%za14_q) : (vector<[1]x[1]xi128>) -> () 344 "test.some_use"(%za15_q) : (vector<[1]x[1]xi128>) -> () 345 "test.some_use"(%next_tile) : (vector<[1]x[1]xi128>) -> () 346 return 347} 348 349// ----- 350 351// CHECK-LABEL: za_q 352func.func @za_q() { 353 // CHECK-NEXT: tile_id = 0 354 %za0_q = arm_sme.get_tile : vector<[1]x[1]xi128> 355 // CHECK-NEXT: tile_id = 1 356 %za1_q = arm_sme.get_tile : vector<[1]x[1]xi128> 357 // CHECK-NEXT: tile_id = 2 358 %za2_q = arm_sme.get_tile : vector<[1]x[1]xi128> 359 // CHECK-NEXT: tile_id = 3 360 %za3_q = arm_sme.get_tile : vector<[1]x[1]xi128> 361 // CHECK-NEXT: tile_id = 4 362 %za4_q = arm_sme.get_tile : vector<[1]x[1]xi128> 363 // CHECK-NEXT: tile_id = 5 364 %za5_q = arm_sme.get_tile : vector<[1]x[1]xi128> 365 // CHECK-NEXT: tile_id = 6 366 %za6_q = arm_sme.get_tile : vector<[1]x[1]xi128> 367 // CHECK-NEXT: tile_id = 7 368 %za7_q = arm_sme.get_tile : vector<[1]x[1]xi128> 369 // CHECK-NEXT: tile_id = 8 370 %za8_q = arm_sme.get_tile : vector<[1]x[1]xi128> 371 // CHECK-NEXT: tile_id = 9 372 %za9_q = arm_sme.get_tile : vector<[1]x[1]xi128> 373 // CHECK-NEXT: tile_id = 10 374 %za10_q = arm_sme.get_tile : vector<[1]x[1]xi128> 375 // CHECK-NEXT: tile_id = 11 376 %za11_q = arm_sme.get_tile : vector<[1]x[1]xi128> 377 // CHECK-NEXT: tile_id = 12 378 %za12_q = arm_sme.get_tile : vector<[1]x[1]xi128> 379 // CHECK-NEXT: tile_id = 13 380 %za13_q = arm_sme.get_tile : vector<[1]x[1]xi128> 381 // CHECK-NEXT: tile_id = 14 382 %za14_q = arm_sme.get_tile : vector<[1]x[1]xi128> 383 // CHECK-NEXT: tile_id = 15 384 %za15_q = arm_sme.get_tile : vector<[1]x[1]xi128> 385 // Next tile is in-memory: 386 // CHECK-NEXT: tile_id = 16 387 %next_tile = arm_sme.get_tile : vector<[1]x[1]xi128> 388 "test.some_use"(%za0_q) : (vector<[1]x[1]xi128>) -> () 389 "test.some_use"(%za1_q) : (vector<[1]x[1]xi128>) -> () 390 "test.some_use"(%za2_q) : (vector<[1]x[1]xi128>) -> () 391 "test.some_use"(%za3_q) : (vector<[1]x[1]xi128>) -> () 392 "test.some_use"(%za4_q) : (vector<[1]x[1]xi128>) -> () 393 "test.some_use"(%za5_q) : (vector<[1]x[1]xi128>) -> () 394 "test.some_use"(%za6_q) : (vector<[1]x[1]xi128>) -> () 395 "test.some_use"(%za7_q) : (vector<[1]x[1]xi128>) -> () 396 "test.some_use"(%za8_q) : (vector<[1]x[1]xi128>) -> () 397 "test.some_use"(%za9_q) : (vector<[1]x[1]xi128>) -> () 398 "test.some_use"(%za10_q) : (vector<[1]x[1]xi128>) -> () 399 "test.some_use"(%za11_q) : (vector<[1]x[1]xi128>) -> () 400 "test.some_use"(%za12_q) : (vector<[1]x[1]xi128>) -> () 401 "test.some_use"(%za13_q) : (vector<[1]x[1]xi128>) -> () 402 "test.some_use"(%za14_q) : (vector<[1]x[1]xi128>) -> () 403 "test.some_use"(%za15_q) : (vector<[1]x[1]xi128>) -> () 404 "test.some_use"(%next_tile) : (vector<[1]x[1]xi128>) -> () 405 return 406} 407