1// RUN: mlir-opt -transform-interpreter -canonicalize -split-input-file -verify-diagnostics %s | FileCheck %s 2 3// expected-remark @below {{attr associated to "test.id" = 42 : i32}} 4module attributes { test.dlti = #dlti.map<"test.id" = 42 : i32> } { 5 func.func private @f() 6} 7 8module attributes {transform.with_named_sequence} { 9 transform.named_sequence @__transform_main(%arg: !transform.any_op) { 10 %funcs = transform.structured.match ops{["func.func"]} in %arg : (!transform.any_op) -> !transform.any_op 11 %module = transform.get_parent_op %funcs : (!transform.any_op) -> !transform.any_op 12 %param = transform.dlti.query ["test.id"] at %module : (!transform.any_op) -> !transform.any_param 13 transform.debug.emit_param_as_remark %param, "attr associated to \"test.id\" =" at %module : !transform.any_param, !transform.any_op 14 transform.yield 15 } 16} 17 18// ----- 19 20// expected-remark @below {{i32 present in set : unit}} 21module attributes { test.dlti = #dlti.map<i32 = unit> } { 22 func.func private @f() 23} 24 25module attributes {transform.with_named_sequence} { 26 transform.named_sequence @__transform_main(%arg: !transform.any_op) { 27 %funcs = transform.structured.match ops{["func.func"]} in %arg : (!transform.any_op) -> !transform.any_op 28 %module = transform.get_parent_op %funcs : (!transform.any_op) -> !transform.any_op 29 %param = transform.dlti.query [i32] at %module : (!transform.any_op) -> !transform.any_param 30 transform.debug.emit_param_as_remark %param, "i32 present in set :" at %module : !transform.any_param, !transform.any_op 31 transform.yield 32 } 33} 34 35// ----- 36 37// expected-remark @below {{attr associated to i32's "width_in_bits" = 32 : i32}} 38module attributes { test.dlti = #dlti.map<i32 = #dlti.map<"width_in_bits" = 32 : i32>> } { 39 func.func private @f() 40} 41 42module attributes {transform.with_named_sequence} { 43 transform.named_sequence @__transform_main(%arg: !transform.any_op) { 44 %funcs = transform.structured.match ops{["func.func"]} in %arg : (!transform.any_op) -> !transform.any_op 45 %module = transform.get_parent_op %funcs : (!transform.any_op) -> !transform.any_op 46 %param = transform.dlti.query [i32,"width_in_bits"] at %module : (!transform.any_op) -> !transform.any_param 47 transform.debug.emit_param_as_remark %param, "attr associated to i32's \"width_in_bits\" =" at %module : !transform.any_param, !transform.any_op 48 transform.yield 49 } 50} 51 52// ----- 53 54// expected-remark @below {{width in bits of i32 = 32 : i64}} 55// expected-remark @below {{width in bits of f64 = 64 : i64}} 56module attributes { test.dlti = #dlti.map<"width_in_bits" = #dlti.map<i32 = 32, f64 = 64>> } { 57 func.func private @f() 58} 59 60module attributes {transform.with_named_sequence} { 61 transform.named_sequence @__transform_main(%arg: !transform.any_op) { 62 %funcs = transform.structured.match ops{["func.func"]} in %arg : (!transform.any_op) -> !transform.any_op 63 %module = transform.get_parent_op %funcs : (!transform.any_op) -> !transform.any_op 64 %i32bits = transform.dlti.query ["width_in_bits",i32] at %module : (!transform.any_op) -> !transform.any_param 65 %f64bits = transform.dlti.query ["width_in_bits",f64] at %module : (!transform.any_op) -> !transform.any_param 66 transform.debug.emit_param_as_remark %i32bits, "width in bits of i32 =" at %module : !transform.any_param, !transform.any_op 67 transform.debug.emit_param_as_remark %f64bits, "width in bits of f64 =" at %module : !transform.any_param, !transform.any_op 68 transform.yield 69 } 70} 71 72// ----- 73 74// expected-remark @below {{attr associated to "test.id" = 42 : i32}} 75module attributes { test.dlti = #dlti.dl_spec<"test.id" = 42 : i32> } { 76 func.func private @f() 77} 78 79module attributes {transform.with_named_sequence} { 80 transform.named_sequence @__transform_main(%arg: !transform.any_op) { 81 %funcs = transform.structured.match ops{["func.func"]} in %arg : (!transform.any_op) -> !transform.any_op 82 %module = transform.get_parent_op %funcs : (!transform.any_op) -> !transform.any_op 83 %param = transform.dlti.query ["test.id"] at %module : (!transform.any_op) -> !transform.any_param 84 transform.debug.emit_param_as_remark %param, "attr associated to \"test.id\" =" at %module : !transform.any_param, !transform.any_op 85 transform.yield 86 } 87} 88 89// ----- 90 91module attributes { test.dlti = #dlti.dl_spec<"test.id" = 42 : i32> } { 92 // expected-remark @below {{attr associated to "test.id" = 24 : i32}} 93 func.func private @f() attributes { test.dlti = #dlti.dl_spec<"test.id" = 24 : i32>} 94} 95 96module attributes {transform.with_named_sequence} { 97 transform.named_sequence @__transform_main(%arg: !transform.any_op) { 98 %funcs = transform.structured.match ops{["func.func"]} in %arg : (!transform.any_op) -> !transform.any_op 99 %param = transform.dlti.query ["test.id"] at %funcs : (!transform.any_op) -> !transform.any_param 100 transform.debug.emit_param_as_remark %param, "attr associated to \"test.id\" =" at %funcs : !transform.any_param, !transform.any_op 101 transform.yield 102 } 103} 104 105// ----- 106 107// expected-remark @below {{attr associated to "test.id" = 42 : i32}} 108module attributes { test.dlti = #dlti.dl_spec<"test.id" = 42 : i32> } { 109 func.func private @f() attributes { test.dlti = #dlti.dl_spec<"test.id" = 24 : i32> } 110} 111 112module attributes {transform.with_named_sequence} { 113 transform.named_sequence @__transform_main(%arg: !transform.any_op) { 114 %funcs = transform.structured.match ops{["func.func"]} in %arg : (!transform.any_op) -> !transform.any_op 115 %module = transform.get_parent_op %funcs : (!transform.any_op) -> !transform.any_op 116 %param = transform.dlti.query ["test.id"] at %module : (!transform.any_op) -> !transform.any_param 117 transform.debug.emit_param_as_remark %param, "attr associated to \"test.id\" =" at %module : !transform.any_param, !transform.any_op 118 transform.yield 119 } 120} 121 122// ----- 123 124module attributes { test.dlti = #dlti.dl_spec<"test.id" = 42 : i32> } { 125 func.func @matmul_tensors( 126 %arg0: tensor<?x?xf32>, %arg1: tensor<?x?xf32>, %arg2: tensor<?x?xf32>) 127 -> tensor<?x?xf32> { 128 // expected-remark @below {{associated attr 42 : i32}} 129 %0 = linalg.matmul ins(%arg0, %arg1: tensor<?x?xf32>, tensor<?x?xf32>) 130 outs(%arg2: tensor<?x?xf32>) 131 -> tensor<?x?xf32> 132 return %0 : tensor<?x?xf32> 133 } 134} 135 136module attributes {transform.with_named_sequence} { 137 transform.named_sequence @__transform_main(%arg: !transform.any_op) { 138 %matmul = transform.structured.match ops{["linalg.matmul"]} in %arg : (!transform.any_op) -> !transform.any_op 139 %param = transform.dlti.query ["test.id"] at %matmul : (!transform.any_op) -> !transform.any_param 140 transform.debug.emit_param_as_remark %param, "associated attr" at %matmul : !transform.any_param, !transform.any_op 141 transform.yield 142 } 143} 144 145// ----- 146 147module attributes { test.dlti = #dlti.dl_spec<"test.id" = 42 : i32> } { 148 func.func @matmul_tensors( 149 %arg0: tensor<?x?xf32>, %arg1: tensor<?x?xf32>, %arg2: tensor<?x?xf32>) 150 -> tensor<?x?xf32> attributes {test.dlti = #dlti.dl_spec<"test.id" = 24 : i32> } { 151 // expected-remark @below {{associated attr 24 : i32}} 152 %0 = linalg.matmul ins(%arg0, %arg1: tensor<?x?xf32>, tensor<?x?xf32>) 153 outs(%arg2: tensor<?x?xf32>) 154 -> tensor<?x?xf32> 155 return %0 : tensor<?x?xf32> 156 } 157} 158 159module attributes {transform.with_named_sequence} { 160 transform.named_sequence @__transform_main(%arg: !transform.any_op) { 161 %matmul = transform.structured.match ops{["linalg.matmul"]} in %arg : (!transform.any_op) -> !transform.any_op 162 %param = transform.dlti.query ["test.id"] at %matmul : (!transform.any_op) -> !transform.any_param 163 transform.debug.emit_param_as_remark %param, "associated attr" at %matmul : !transform.any_param, !transform.any_op 164 transform.yield 165 } 166} 167 168// ----- 169 170// expected-remark @below {{associated attr 42 : i32}} 171module attributes { test.dlti = 172 #dlti.target_system_spec<"CPU" = 173 #dlti.target_device_spec<"test.id" = 42 : i32>> } { 174 func.func private @f() 175} 176 177module attributes {transform.with_named_sequence} { 178 transform.named_sequence @__transform_main(%arg: !transform.any_op) { 179 %func = transform.structured.match ops{["func.func"]} in %arg : (!transform.any_op) -> !transform.any_op 180 %module = transform.get_parent_op %func : (!transform.any_op) -> !transform.any_op 181 %param = transform.dlti.query ["CPU","test.id"] at %module : (!transform.any_op) -> !transform.any_param 182 transform.debug.emit_param_as_remark %param, "associated attr" at %module : !transform.any_param, !transform.any_op 183 transform.yield 184 } 185} 186 187// ----- 188 189module attributes { test.dlti = #dlti.target_system_spec<"CPU" = #dlti.target_device_spec<"test.id" = 42 : i32>, 190 "GPU" = #dlti.target_device_spec<"test.id" = 43 : i32>> } { 191 // expected-remark @below {{associated attr 43 : i32}} 192 func.func private @f() 193} 194 195module attributes {transform.with_named_sequence} { 196 transform.named_sequence @__transform_main(%arg: !transform.any_op) { 197 %func = transform.structured.match ops{["func.func"]} in %arg : (!transform.any_op) -> !transform.any_op 198 %param = transform.dlti.query ["GPU","test.id"] at %func : (!transform.any_op) -> !transform.any_param 199 transform.debug.emit_param_as_remark %param, "associated attr" at %func : !transform.any_param, !transform.any_op 200 transform.yield 201 } 202} 203 204// ----- 205 206module attributes { test.dlti = #dlti.target_system_spec<"CPU" = #dlti.target_device_spec<"test.id" = 42 : i32>, 207 "GPU" = #dlti.target_device_spec<"test.id" = 43 : i32>> } { 208 // expected-remark @below {{associated attr 24 : i32}} 209 func.func private @f() attributes { test.dlti = #dlti.target_system_spec<"CPU" = #dlti.target_device_spec<"test.id" = 24 : i32>> } 210} 211 212module attributes {transform.with_named_sequence} { 213 transform.named_sequence @__transform_main(%arg: !transform.any_op) { 214 %func = transform.structured.match ops{["func.func"]} in %arg : (!transform.any_op) -> !transform.any_op 215 %param = transform.dlti.query ["CPU","test.id"] at %func : (!transform.any_op) -> !transform.any_param 216 transform.debug.emit_param_as_remark %param, "associated attr" at %func : !transform.any_param, !transform.any_op 217 transform.yield 218 } 219} 220 221// ----- 222 223module attributes { test.dlti = #dlti.target_system_spec< 224 "CPU" = #dlti.target_device_spec< 225 "cache::L1::size_in_bytes" = 65536 : i32, 226 "cache::L1d::size_in_bytes" = 32768 : i32>> } { 227 // expected-remark @below {{L1::size_in_bytes 65536 : i32}} 228 // expected-remark @below {{L1d::size_in_bytes 32768 : i32}} 229 func.func private @f() 230} 231 232module attributes {transform.with_named_sequence} { 233 transform.named_sequence @__transform_main(%arg: !transform.any_op) { 234 %func = transform.structured.match ops{["func.func"]} in %arg : (!transform.any_op) -> !transform.any_op 235 %l1_size = transform.dlti.query ["CPU","cache::L1::size_in_bytes"] at %func : (!transform.any_op) -> !transform.param<i32> 236 %l1d_size = transform.dlti.query ["CPU","cache::L1d::size_in_bytes"] at %func : (!transform.any_op) -> !transform.param<i32> 237 transform.debug.emit_param_as_remark %l1_size, "L1::size_in_bytes" at %func : !transform.param<i32>, !transform.any_op 238 transform.debug.emit_param_as_remark %l1d_size, "L1d::size_in_bytes" at %func : !transform.param<i32>, !transform.any_op 239 transform.yield 240 } 241} 242 243// ----- 244 245#l1_size = #dlti.map<"size_in_bytes" = 65536 : i32> 246#l1d_size = #dlti.map<"size_in_bytes" = 32768 : i32> 247module attributes { test.dlti = 248 #dlti.target_system_spec<"CPU" = 249 #dlti.target_device_spec<"cache" = 250 #dlti.map<"L1" = #l1_size, 251 "L1d" = #l1d_size >>> } { 252 // expected-remark @below {{L1::size_in_bytes 65536 : i32}} 253 // expected-remark @below {{L1d::size_in_bytes 32768 : i32}} 254 func.func private @f() 255} 256 257module attributes {transform.with_named_sequence} { 258 transform.named_sequence @__transform_main(%arg: !transform.any_op) { 259 %func = transform.structured.match ops{["func.func"]} in %arg : (!transform.any_op) -> !transform.any_op 260 %l1_size = transform.dlti.query ["CPU","cache","L1","size_in_bytes"] at %func : (!transform.any_op) -> !transform.param<i32> 261 %l1d_size = transform.dlti.query ["CPU","cache","L1d","size_in_bytes"] at %func : (!transform.any_op) -> !transform.param<i32> 262 transform.debug.emit_param_as_remark %l1_size, "L1::size_in_bytes" at %func : !transform.param<i32>, !transform.any_op 263 transform.debug.emit_param_as_remark %l1d_size, "L1d::size_in_bytes" at %func : !transform.param<i32>, !transform.any_op 264 transform.yield 265 } 266} 267 268// ----- 269 270module attributes { test.dlti = #dlti.target_system_spec< 271 "CPU" = #dlti.target_device_spec<"inner_most_tile_size" = 42 : i32>> } { 272 // CHECK-LABEL: func @matmul_tensors 273 func.func @matmul_tensors( 274 %arg0: tensor<?x?xf32>, %arg1: tensor<?x?xf32>, %arg2: tensor<?x?xf32>) 275 -> tensor<?x?xf32> { 276 // CHECK: scf.for {{.*}} to {{.*}} step {{.*}}42 277 // CHECK: tensor.extract_slice 278 // CHECK: linalg.matmul 279 // CHECK: tensor.insert_slice 280 // CHECK: scf.yield 281 %0 = linalg.matmul ins(%arg0, %arg1: tensor<?x?xf32>, tensor<?x?xf32>) 282 outs(%arg2: tensor<?x?xf32>) 283 -> tensor<?x?xf32> 284 // CHECK: return 285 return %0 : tensor<?x?xf32> 286 } 287} 288 289// Demonstrates obtaining transform op parameters from DLTI attributes and directly putting them to use. 290module attributes {transform.with_named_sequence} { 291 transform.named_sequence @__transform_main(%arg: !transform.any_op) { 292 %matmul = transform.structured.match ops{["linalg.matmul"]} in %arg : (!transform.any_op) -> !transform.any_op 293 %tile_size = transform.dlti.query ["CPU","inner_most_tile_size"] at %matmul : (!transform.any_op) -> !transform.param<i32> 294 transform.structured.tile_using_for %matmul tile_sizes [%tile_size] : (!transform.any_op, !transform.param<i32>) -> (!transform.any_op, !transform.any_op) 295 transform.yield 296 } 297} 298 299// ----- 300 301// expected-note @below {{key "NPU" has no DLTI-mapping per attr: #dlti.target_system_spec}} 302module attributes { test.dlti = #dlti.target_system_spec< 303 "CPU" = #dlti.target_device_spec<"test.id" = 42 : i32>, 304 "GPU" = #dlti.target_device_spec<"test.id" = 43 : i32>> } { 305 // expected-error @below {{target op of failed DLTI query}} 306 func.func private @f() 307} 308 309module attributes {transform.with_named_sequence} { 310 transform.named_sequence @__transform_main(%arg: !transform.any_op) { 311 %func = transform.structured.match ops{["func.func"]} in %arg : (!transform.any_op) -> !transform.any_op 312 // expected-error @below {{'transform.dlti.query' op failed to apply}} 313 %param = transform.dlti.query ["NPU","test.id"] at %func : (!transform.any_op) -> !transform.any_param 314 transform.yield 315 } 316} 317 318// ----- 319 320// expected-note @below {{key "unspecified" has no DLTI-mapping per attr: #dlti.target_device_spec}} 321module attributes { test.dlti = #dlti.target_system_spec< 322 "CPU" = #dlti.target_device_spec<"test.id" = 42 : i32>, 323 "GPU" = #dlti.target_device_spec<"test.id" = 43 : i32>> } { 324 // expected-error @below {{target op of failed DLTI query}} 325 func.func private @f() 326} 327 328module attributes {transform.with_named_sequence} { 329 transform.named_sequence @__transform_main(%arg: !transform.any_op) { 330 %func = transform.structured.match ops{["func.func"]} in %arg : (!transform.any_op) -> !transform.any_op 331 // expected-error @below {{'transform.dlti.query' op failed to apply}} 332 %param = transform.dlti.query ["CPU","unspecified"] at %func : (!transform.any_op) -> !transform.any_param 333 transform.yield 334 } 335} 336 337// ----- 338 339// expected-note @below {{key "test.id" has no DLTI-mapping per attr: #dlti.target_system_spec}} 340module attributes { test.dlti = #dlti.target_system_spec< 341 "CPU" = #dlti.target_device_spec<"test.id" = 42 : i32>, 342 "GPU" = #dlti.target_device_spec<"test.id" = 43 : i32>> } { 343 // expected-error @below {{target op of failed DLTI query}} 344 func.func private @f() 345} 346 347module attributes {transform.with_named_sequence} { 348 transform.named_sequence @__transform_main(%arg: !transform.any_op) { 349 %func = transform.structured.match ops{["func.func"]} in %arg : (!transform.any_op) -> !transform.any_op 350 // expected-error @below {{'transform.dlti.query' op failed to apply}} 351 %param = transform.dlti.query ["test.id"] at %func : (!transform.any_op) -> !transform.any_param 352 transform.yield 353 } 354} 355 356// ----- 357 358// expected-note @below {{key "CPU" has no DLTI-mapping per attr: #dlti.dl_spec}} 359module attributes { test.dlti = #dlti.dl_spec<"test.id" = 42 : i32> } { 360 // expected-error @below {{target op of failed DLTI query}} 361 func.func private @f() 362} 363 364module attributes {transform.with_named_sequence} { 365 transform.named_sequence @__transform_main(%arg: !transform.any_op) { 366 %func = transform.structured.match ops{["func.func"]} in %arg : (!transform.any_op) -> !transform.any_op 367 // expected-error @below {{'transform.dlti.query' op failed to apply}} 368 %param = transform.dlti.query ["CPU","test.id"] at %func : (!transform.any_op) -> !transform.any_param 369 transform.yield 370 } 371} 372 373// ----- 374 375// expected-note @below {{got non-DLTI-queryable attribute upon looking up keys ["CPU"]}} 376module attributes { test.dlti = #dlti.dl_spec<"CPU" = 42 : i32> } { 377 // expected-error @below {{target op of failed DLTI query}} 378 func.func private @f() 379} 380 381module attributes {transform.with_named_sequence} { 382 transform.named_sequence @__transform_main(%arg: !transform.any_op) { 383 %func = transform.structured.match ops{["func.func"]} in %arg : (!transform.any_op) -> !transform.any_op 384 // expected-error @below {{'transform.dlti.query' op failed to apply}} 385 %param = transform.dlti.query ["CPU","test.id"] at %func : (!transform.any_op) -> !transform.any_param 386 transform.yield 387 } 388} 389 390// ----- 391 392// expected-note @below {{got non-DLTI-queryable attribute upon looking up keys [i32]}} 393module attributes { test.dlti = #dlti.dl_spec<i32 = 32 : i32> } { 394 // expected-error @below {{target op of failed DLTI query}} 395 func.func private @f() 396} 397 398module attributes {transform.with_named_sequence} { 399 transform.named_sequence @__transform_main(%arg: !transform.any_op) { 400 %func = transform.structured.match ops{["func.func"]} in %arg : (!transform.any_op) -> !transform.any_op 401 // expected-error @below {{'transform.dlti.query' op failed to apply}} 402 %param = transform.dlti.query [i32,"width_in_bits"] at %func : (!transform.any_op) -> !transform.any_param 403 transform.yield 404 } 405} 406 407// ----- 408 409module { 410 // expected-error @below {{target op of failed DLTI query}} 411 // expected-note @below {{no DLTI-queryable attrs on target op or any of its ancestors}} 412 func.func private @f() 413} 414 415module attributes {transform.with_named_sequence} { 416 transform.named_sequence @__transform_main(%arg: !transform.any_op) { 417 %func = transform.structured.match ops{["func.func"]} in %arg : (!transform.any_op) -> !transform.any_op 418 // expected-error @below {{'transform.dlti.query' op failed to apply}} 419 %param = transform.dlti.query ["CPU","test.id"] at %func : (!transform.any_op) -> !transform.any_param 420 transform.yield 421 } 422} 423 424// ----- 425 426// expected-note @below {{key i64 has no DLTI-mapping per attr: #dlti.map<i32 = 32 : i64>}} 427module attributes { test.dlti = #dlti.map<"width_in_bits" = #dlti.map<i32 = 32>>} { 428 // expected-error @below {{target op of failed DLTI query}} 429 func.func private @f() 430} 431 432module attributes {transform.with_named_sequence} { 433 transform.named_sequence @__transform_main(%arg: !transform.any_op) { 434 %func = transform.structured.match ops{["func.func"]} in %arg : (!transform.any_op) -> !transform.any_op 435 // expected-error @below {{'transform.dlti.query' op failed to apply}} 436 %param = transform.dlti.query ["width_in_bits",i64] at %func : (!transform.any_op) -> !transform.any_param 437 transform.yield 438 } 439} 440 441// ----- 442 443module attributes { test.dlti = #dlti.dl_spec<"test.id" = 42 : i32>} { 444 func.func private @f() 445} 446 447module attributes {transform.with_named_sequence} { 448 transform.named_sequence @__transform_main(%arg: !transform.any_op) { 449 %funcs = transform.structured.match ops{["func.func"]} in %arg : (!transform.any_op) -> !transform.any_op 450 // expected-error @below {{'transform.dlti.query' keys of wrong type: only StringAttr and TypeAttr are allowed}} 451 %param = transform.dlti.query [1] at %funcs : (!transform.any_op) -> !transform.param<i64> 452 transform.yield 453 } 454} 455 456// ----- 457 458module attributes { test.dlti = #dlti.map<#dlti.dl_entry<"test.id", 42 : i32>>} { 459 // expected-error @below {{target op of failed DLTI query}} 460 // expected-note @below {{no keys provided to attempt query with}} 461 func.func private @f() 462} 463 464module attributes {transform.with_named_sequence} { 465 transform.named_sequence @__transform_main(%arg: !transform.any_op) { 466 %func = transform.structured.match ops{["func.func"]} in %arg : (!transform.any_op) -> !transform.any_op 467 // expected-error @below {{'transform.dlti.query' op failed to apply}} 468 %param = transform.dlti.query [] at %func : (!transform.any_op) -> !transform.any_param 469 transform.yield 470 } 471} 472 473// ----- 474 475module attributes { test.dlti = #dlti.dl_spec<#dlti.dl_entry<"test.id", 42 : i32>>} { 476 func.func private @f() 477} 478 479module attributes {transform.with_named_sequence} { 480 transform.named_sequence @__transform_main(%arg: !transform.any_op) { 481 %funcs = transform.structured.match ops{["func.func"]} in %arg : (!transform.any_op) -> !transform.any_op 482 // expected-error @below {{expected the type of the parameter attribute ('i32') to match the parameter type ('i64')}} 483 %param = transform.dlti.query ["test.id"] at %funcs : (!transform.any_op) -> !transform.param<i64> 484 transform.yield 485 } 486}