407 lines · plain
1// RUN: mlir-opt %s -test-arm-sme-tile-allocation -split-input-file | FileCheck %s2 3// -----4 5// Note: Tile IDs >= 16 are in-memory tile IDs (i.e. spills).6 7// CHECK-LABEL: mixed_tiles8func.func @mixed_tiles() {9 // ZA0.Q, ZA2.Q, ZA4.Q, ZA6.Q, ZA8.Q, ZA10.Q, ZA12.Q, ZA14.Q10 // CHECK-NEXT: tile_id = 011 %za0_h = arm_sme.get_tile : vector<[8]x[8]xi16>12 // ZA1.Q, ZA5.Q, ZA9.Q, ZA13.Q13 // CHECK-NEXT: tile_id = 114 %za1_s = arm_sme.get_tile : vector<[4]x[4]xi32>15 // ZA3.D ZA3.Q, ZA11.Q16 // CHECK-NEXT: tile_id = 317 %za3_d = arm_sme.get_tile : vector<[2]x[2]xi64>18 // ZA7.Q19 // CHECK-NEXT: tile_id = 720 %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 return27}28 29// -----30 31// CHECK-LABEL: za_b32func.func @za_b() {33 // CHECK-NEXT: tile_id = 034 %za0_b = arm_sme.get_tile : vector<[16]x[16]xi8>35 // Next tile is in-memory:36 // CHECK-NEXT: tile_id = 1637 %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 return41}42 43// -----44 45// CHECK-LABEL: za_b_overlapping_za_q46func.func @za_b_overlapping_za_q() {47 // CHECK-NEXT: tile_id = 048 %za0_b = arm_sme.get_tile : vector<[16]x[16]xi8>49 // Next tile is in-memory:50 // CHECK-NEXT: tile_id = 1651 %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 return55}56 57// -----58 59// CHECK-LABEL: za_h60func.func @za_h() {61 // CHECK-NEXT: tile_id = 062 %za0_h = arm_sme.get_tile : vector<[8]x[8]xi16>63 // CHECK-NEXT: tile_id = 164 %za1_h = arm_sme.get_tile : vector<[8]x[8]xi16>65 // Next tile is in-memory:66 // CHECK-NEXT: tile_id = 1667 %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 return72}73 74// -----75 76// CHECK-LABEL: za_h_overlapping_za_s77func.func @za_h_overlapping_za_s() {78 // ZA0.Q, ZA2.Q, ZA4.Q, ZA6.Q, ZA8.Q, ZA10.Q, ZA12.Q, ZA14.Q79 // CHECK-NEXT: tile_id = 080 %za0_h = arm_sme.get_tile : vector<[8]x[8]xi16>81 // ZA1.Q, ZA5.Q, ZA9.Q, ZA13.Q82 // CHECK-NEXT: tile_id = 183 %za1_s = arm_sme.get_tile : vector<[4]x[4]xi32>84 // ZA3.Q, ZA7.Q, ZA11.Q, ZA15.Q85 // CHECK-NEXT: tile_id = 386 %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 return91}92 93// -----94 95// CHECK-LABEL: za_h_overlapping_za_d96func.func @za_h_overlapping_za_d() {97 // ZA0.Q, ZA2.Q, ZA4.Q, ZA6.Q, ZA8.Q, ZA10.Q, ZA12.Q, ZA14.Q98 // CHECK-NEXT: tile_id = 099 %za0_h = arm_sme.get_tile : vector<[8]x[8]xi16>100 // ZA1.Q, ZA9.Q101 // CHECK-NEXT: tile_id = 1102 %za1_d = arm_sme.get_tile : vector<[2]x[2]xi64>103 // ZA3.Q, ZA11.Q104 // CHECK-NEXT: tile_id = 3105 %za3_d = arm_sme.get_tile : vector<[2]x[2]xi64>106 // ZA5.Q, ZA13.Q107 // CHECK-NEXT: tile_id = 5108 %za5_d = arm_sme.get_tile : vector<[2]x[2]xi64>109 // ZA7.Q, ZA15.Q110 // CHECK-NEXT: tile_id = 7111 %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 return118}119 120// -----121 122// CHECK-LABEL: za_h_overlapping_za_q123func.func @za_h_overlapping_za_q() {124 // CHECK-NEXT: tile_id = 0125 %za0_h = arm_sme.get_tile : vector<[8]x[8]xi16>126 // CHECK-NEXT: tile_id = 1127 %za1_q = arm_sme.get_tile : vector<[1]x[1]xi128>128 // CHECK-NEXT: tile_id = 3129 %za3_q = arm_sme.get_tile : vector<[1]x[1]xi128>130 // CHECK-NEXT: tile_id = 5131 %za5_q = arm_sme.get_tile : vector<[1]x[1]xi128>132 // CHECK-NEXT: tile_id = 7133 %za7_q = arm_sme.get_tile : vector<[1]x[1]xi128>134 // CHECK-NEXT: tile_id = 9135 %za9_q = arm_sme.get_tile : vector<[1]x[1]xi128>136 // CHECK-NEXT: tile_id = 11137 %za11_q = arm_sme.get_tile : vector<[1]x[1]xi128>138 // CHECK-NEXT: tile_id = 13139 %za13_q = arm_sme.get_tile : vector<[1]x[1]xi128>140 // CHECK-NEXT: tile_id = 15141 %za15_q = arm_sme.get_tile : vector<[1]x[1]xi128>142 // Next tile is in-memory:143 // CHECK-NEXT: tile_id = 16144 %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 return156}157 158// -----159 160// CHECK-LABEL: za_s161func.func @za_s() {162 // CHECK-NEXT: tile_id = 0163 %za0_s = arm_sme.get_tile : vector<[4]x[4]xi32>164 // CHECK-NEXT: tile_id = 1165 %za1_s = arm_sme.get_tile : vector<[4]x[4]xi32>166 // CHECK-NEXT: tile_id = 2167 %za2_s = arm_sme.get_tile : vector<[4]x[4]xi32>168 // CHECK-NEXT: tile_id = 3169 %za3_s = arm_sme.get_tile : vector<[4]x[4]xi32>170 // Next tile is in-memory:171 // CHECK-NEXT: tile_id = 16172 %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 return179}180 181// -----182 183// CHECK-LABEL: za_s_overlapping_za_d184func.func @za_s_overlapping_za_d() {185 // ZA0.Q, ZA4.Q, ZA8.Q, ZA12.Q186 // CHECK-NEXT: tile_id = 0187 %za0_s = arm_sme.get_tile : vector<[4]x[4]xi32>188 // ZA1.Q, ZA5.Q, ZA9.Q, ZA13.Q189 // CHECK-NEXT: tile_id = 1190 %za1_s = arm_sme.get_tile : vector<[4]x[4]xi32>191 // ZA2.Q, ZA6.Q, ZA10.Q, ZA14.Q192 // CHECK-NEXT: tile_id = 2193 %za2_s = arm_sme.get_tile : vector<[4]x[4]xi32>194 // ZA3.Q, ZA11.Q195 // CHECK-NEXT: tile_id = 3196 %za3_d = arm_sme.get_tile : vector<[2]x[2]xi64>197 // ZA7.Q, ZA15.Q198 // CHECK-NEXT: tile_id = 7199 %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 return206}207 208// -----209 210// CHECK-LABEL: za_s_overlapping_za_q211func.func @za_s_overlapping_za_q() {212 // CHECK-NEXT: tile_id = 0213 %za0_s = arm_sme.get_tile : vector<[4]x[4]xi32>214 // CHECK-NEXT: tile_id = 1215 %za1_q = arm_sme.get_tile : vector<[1]x[1]xi128>216 // CHECK-NEXT: tile_id = 2217 %za2_q = arm_sme.get_tile : vector<[1]x[1]xi128>218 // CHECK-NEXT: tile_id = 3219 %za3_q = arm_sme.get_tile : vector<[1]x[1]xi128>220 // CHECK-NEXT: tile_id = 5221 %za5_q = arm_sme.get_tile : vector<[1]x[1]xi128>222 // CHECK-NEXT: tile_id = 6223 %za6_q = arm_sme.get_tile : vector<[1]x[1]xi128>224 // CHECK-NEXT: tile_id = 7225 %za7_q = arm_sme.get_tile : vector<[1]x[1]xi128>226 // CHECK-NEXT: tile_id = 9227 %za9_q = arm_sme.get_tile : vector<[1]x[1]xi128>228 // CHECK-NEXT: tile_id = 10229 %za10_q = arm_sme.get_tile : vector<[1]x[1]xi128>230 // CHECK-NEXT: tile_id = 11231 %za11_q = arm_sme.get_tile : vector<[1]x[1]xi128>232 // CHECK-NEXT: tile_id = 13233 %za13_q = arm_sme.get_tile : vector<[1]x[1]xi128>234 // CHECK-NEXT: tile_id = 14235 %za14_q = arm_sme.get_tile : vector<[1]x[1]xi128>236 // CHECK-NEXT: tile_id = 15237 %za15_q = arm_sme.get_tile : vector<[1]x[1]xi128>238 // Next tile is in-memory:239 // CHECK-NEXT: tile_id = 16240 %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 return256}257 258// -----259 260// CHECK-LABEL: za_d261func.func @za_d() {262 // CHECK-NEXT: tile_id = 0263 %za0_d = arm_sme.get_tile : vector<[2]x[2]xi64>264 // CHECK-NEXT: tile_id = 1265 %za1_d = arm_sme.get_tile : vector<[2]x[2]xi64>266 // CHECK-NEXT: tile_id = 2267 %za2_d = arm_sme.get_tile : vector<[2]x[2]xi64>268 // CHECK-NEXT: tile_id = 3269 %za3_d = arm_sme.get_tile : vector<[2]x[2]xi64>270 // CHECK-NEXT: tile_id = 4271 %za4_d = arm_sme.get_tile : vector<[2]x[2]xi64>272 // CHECK-NEXT: tile_id = 5273 %za5_d = arm_sme.get_tile : vector<[2]x[2]xi64>274 // CHECK-NEXT: tile_id = 6275 %za6_d = arm_sme.get_tile : vector<[2]x[2]xi64>276 // CHECK-NEXT: tile_id = 7277 %za7_d = arm_sme.get_tile : vector<[2]x[2]xi64>278 // Next tile is in-memory:279 // CHECK-NEXT: tile_id = 16280 %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 return291}292 293// -----294 295// CHECK-LABEL: za_d_overlapping_za_q296func.func @za_d_overlapping_za_q() {297 // CHECK-NEXT: tile_id = 0298 %za0_d = arm_sme.get_tile : vector<[2]x[2]xi64>299 // CHECK-NEXT: tile_id = 1300 %za1_q = arm_sme.get_tile : vector<[1]x[1]xi128>301 // CHECK-NEXT: tile_id = 2302 %za2_q = arm_sme.get_tile : vector<[1]x[1]xi128>303 // CHECK-NEXT: tile_id = 3304 %za3_q = arm_sme.get_tile : vector<[1]x[1]xi128>305 // CHECK-NEXT: tile_id = 4306 %za4_q = arm_sme.get_tile : vector<[1]x[1]xi128>307 // CHECK-NEXT: tile_id = 5308 %za5_q = arm_sme.get_tile : vector<[1]x[1]xi128>309 // CHECK-NEXT: tile_id = 6310 %za6_q = arm_sme.get_tile : vector<[1]x[1]xi128>311 // CHECK-NEXT: tile_id = 7312 %za7_q = arm_sme.get_tile : vector<[1]x[1]xi128>313 // CHECK-NEXT: tile_id = 9314 %za9_q = arm_sme.get_tile : vector<[1]x[1]xi128>315 // CHECK-NEXT: tile_id = 10316 %za10_q = arm_sme.get_tile : vector<[1]x[1]xi128>317 // CHECK-NEXT: tile_id = 11318 %za11_q = arm_sme.get_tile : vector<[1]x[1]xi128>319 // CHECK-NEXT: tile_id = 12320 %za12_q = arm_sme.get_tile : vector<[1]x[1]xi128>321 // CHECK-NEXT: tile_id = 13322 %za13_q = arm_sme.get_tile : vector<[1]x[1]xi128>323 // CHECK-NEXT: tile_id = 14324 %za14_q = arm_sme.get_tile : vector<[1]x[1]xi128>325 // CHECK-NEXT: tile_id = 15326 %za15_q = arm_sme.get_tile : vector<[1]x[1]xi128>327 // Next tile is in-memory:328 // CHECK-NEXT: tile_id = 16329 %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 return347}348 349// -----350 351// CHECK-LABEL: za_q352func.func @za_q() {353 // CHECK-NEXT: tile_id = 0354 %za0_q = arm_sme.get_tile : vector<[1]x[1]xi128>355 // CHECK-NEXT: tile_id = 1356 %za1_q = arm_sme.get_tile : vector<[1]x[1]xi128>357 // CHECK-NEXT: tile_id = 2358 %za2_q = arm_sme.get_tile : vector<[1]x[1]xi128>359 // CHECK-NEXT: tile_id = 3360 %za3_q = arm_sme.get_tile : vector<[1]x[1]xi128>361 // CHECK-NEXT: tile_id = 4362 %za4_q = arm_sme.get_tile : vector<[1]x[1]xi128>363 // CHECK-NEXT: tile_id = 5364 %za5_q = arm_sme.get_tile : vector<[1]x[1]xi128>365 // CHECK-NEXT: tile_id = 6366 %za6_q = arm_sme.get_tile : vector<[1]x[1]xi128>367 // CHECK-NEXT: tile_id = 7368 %za7_q = arm_sme.get_tile : vector<[1]x[1]xi128>369 // CHECK-NEXT: tile_id = 8370 %za8_q = arm_sme.get_tile : vector<[1]x[1]xi128>371 // CHECK-NEXT: tile_id = 9372 %za9_q = arm_sme.get_tile : vector<[1]x[1]xi128>373 // CHECK-NEXT: tile_id = 10374 %za10_q = arm_sme.get_tile : vector<[1]x[1]xi128>375 // CHECK-NEXT: tile_id = 11376 %za11_q = arm_sme.get_tile : vector<[1]x[1]xi128>377 // CHECK-NEXT: tile_id = 12378 %za12_q = arm_sme.get_tile : vector<[1]x[1]xi128>379 // CHECK-NEXT: tile_id = 13380 %za13_q = arm_sme.get_tile : vector<[1]x[1]xi128>381 // CHECK-NEXT: tile_id = 14382 %za14_q = arm_sme.get_tile : vector<[1]x[1]xi128>383 // CHECK-NEXT: tile_id = 15384 %za15_q = arm_sme.get_tile : vector<[1]x[1]xi128>385 // Next tile is in-memory:386 // CHECK-NEXT: tile_id = 16387 %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 return406}407