964 lines · plain
1// RUN: mlir-opt %s -split-input-file -verify-diagnostics | FileCheck %s2 3// expected-error @below {{expects the entry block to have at least one argument}}4transform.sequence failures(propagate) {5}6 7// -----8 9// expected-error @below {{expects the first entry block argument to be of type implementing TransformHandleTypeInterface}}10transform.sequence failures(propagate) {11^bb0(%rag0: i64):12}13 14// -----15 16// expected-note @below {{nested in another possible top-level op}}17transform.sequence failures(propagate) {18^bb0(%arg0: !transform.any_op):19 // expected-error @below {{expects operands to be provided for a nested op}}20 transform.sequence failures(propagate) {21 ^bb1(%arg1: !transform.any_op):22 }23}24 25// -----26 27// expected-error @below {{expects to have a terminator in the body}}28"transform.sequence"() <{failure_propagation_mode = 1 : i32, operandSegmentSizes = array<i32: 0, 0>}> ({29^bb0(%arg0: !transform.any_op):30 transform.apply_patterns to %arg0 {31 } : !transform.any_op32}) : () -> ()33 34 35// -----36 37// expected-error @below {{'transform.sequence' op expects trailing entry block arguments to be of type implementing TransformHandleTypeInterface, TransformValueHandleTypeInterface or TransformParamTypeInterface}}38// expected-note @below {{argument #1 does not}}39transform.sequence failures(propagate) {40^bb0(%arg0: !transform.any_op, %arg1: i64):41}42 43// -----44 45// expected-error @below {{expected children ops to implement TransformOpInterface}}46transform.sequence failures(propagate) {47^bb0(%arg0: !transform.any_op):48 // expected-note @below {{op without interface}}49 arith.constant 42.0 : f3250}51 52// -----53 54// expected-error @below {{expects the types of the terminator operands to match the types of the result}}55%0 = transform.sequence -> !transform.any_op failures(propagate) {56^bb0(%arg0: !transform.any_op):57 // expected-note @below {{terminator}}58 transform.yield59}60 61// -----62 63transform.sequence failures(propagate) {64^bb0(%arg0: !transform.any_op):65 // expected-error @below {{expects the type of the block argument to match the type of the operand}}66 transform.sequence %arg0: !transform.any_op failures(propagate) {67 ^bb1(%arg1: !transform.op<"builtin.module">):68 transform.yield69 }70}71 72// -----73 74transform.sequence failures(propagate) {75^bb0(%arg0: !transform.any_op, %arg1: !transform.any_op, %arg2: !transform.any_op):76 // expected-error @below {{expected types to be provided for all operands}}77 transform.sequence %arg0, %arg1, %arg2 : (!transform.any_op, !transform.any_op) failures(propagate) {78 ^bb0(%arg3: !transform.any_op, %arg4: !transform.any_op, %arg5: !transform.any_op):79 }80}81 82// -----83 84%0 = "test.generate_something"() : () -> !transform.any_op85// expected-error @below {{does not expect extra operands when used as top-level}}86"transform.sequence"(%0) ({87^bb0(%arg0: !transform.any_op):88 "transform.yield"() : () -> ()89}) {failure_propagation_mode = 1 : i32, operandSegmentSizes = array<i32: 0, 1>} : (!transform.any_op) -> ()90 91// -----92 93// expected-note @below {{nested in another possible top-level op}}94transform.with_pdl_patterns {95^bb0(%arg0: !transform.any_op):96 // expected-error @below {{expects operands to be provided for a nested op}}97 transform.sequence failures(propagate) {98 ^bb1(%arg1: !transform.any_op):99 }100}101 102// -----103 104// expected-error @below {{expects only one non-pattern op in its body}}105transform.with_pdl_patterns {106^bb0(%arg0: !transform.any_op):107 // expected-note @below {{first non-pattern op}}108 transform.sequence failures(propagate) {109 ^bb1(%arg1: !transform.any_op):110 }111 // expected-note @below {{second non-pattern op}}112 transform.sequence failures(propagate) {113 ^bb1(%arg1: !transform.any_op):114 }115}116 117// -----118 119// expected-error @below {{expects only pattern and top-level transform ops in its body}}120transform.with_pdl_patterns {121^bb0(%arg0: !transform.any_op):122 // expected-note @below {{offending op}}123 "test.something"() : () -> ()124}125 126// -----127 128// expected-note @below {{parent operation}}129transform.with_pdl_patterns {130^bb0(%arg0: !transform.any_op):131 // expected-error @below {{op cannot be nested}}132 transform.with_pdl_patterns %arg0 : !transform.any_op {133 ^bb1(%arg1: !transform.any_op):134 }135}136 137// -----138 139// expected-error @below {{op expects at least one non-pattern op}}140transform.with_pdl_patterns {141^bb0(%arg0: !transform.any_op):142 pdl.pattern @some : benefit(1) {143 %0 = pdl.operation "test.foo"144 pdl.rewrite %0 with "transform.dialect"145 }146}147 148// -----149 150transform.sequence failures(propagate) {151^bb0(%arg0: !transform.any_op):152 // expected-error @below {{op expects at least one non-pattern op}}153 with_pdl_patterns %arg0 : !transform.any_op {154 ^bb1(%arg1: !transform.any_op):155 }156}157 158 159// -----160 161// expected-error @below {{expects at least one region}}162"transform.test_transform_unrestricted_op_no_interface"() : () -> ()163 164// -----165 166// expected-error @below {{expects a single-block region}}167"transform.test_transform_unrestricted_op_no_interface"() ({168^bb0(%arg0: !transform.any_op):169 "test.potential_terminator"() : () -> ()170^bb1:171 "test.potential_terminator"() : () -> ()172}) : () -> ()173 174// -----175 176transform.sequence failures(propagate) {177^bb0(%arg0: !transform.any_op):178 // expected-error @below {{result #0 has more than one potential consumer}}179 %0 = test_produce_self_handle_or_forward_operand : () -> !transform.any_op180 // expected-note @below {{used here as operand #0}}181 test_consume_operand_of_op_kind_or_fail %0, "transform.test_produce_self_handle_or_forward_operand" : !transform.any_op182 // expected-note @below {{used here as operand #0}}183 test_consume_operand_of_op_kind_or_fail %0, "transform.test_produce_self_handle_or_forward_operand" : !transform.any_op184}185 186// -----187 188transform.sequence failures(propagate) {189^bb0(%arg0: !transform.any_op):190 // expected-error @below {{result #0 has more than one potential consumer}}191 %0 = test_produce_self_handle_or_forward_operand : () -> !transform.any_op192 // expected-note @below {{used here as operand #0}}193 test_consume_operand_of_op_kind_or_fail %0, "transform.test_produce_self_handle_or_forward_operand" : !transform.any_op194 // expected-note @below {{used here as operand #0}}195 transform.sequence %0 : !transform.any_op failures(propagate) {196 ^bb1(%arg1: !transform.any_op):197 test_consume_operand_of_op_kind_or_fail %arg1, "transform.test_produce_self_handle_or_forward_operand" : !transform.any_op198 }199}200 201// -----202 203transform.sequence failures(propagate) {204^bb0(%arg0: !transform.any_op):205 // expected-error @below {{result #0 has more than one potential consumer}}206 %0 = test_produce_self_handle_or_forward_operand : () -> !transform.any_op207 // expected-note @below {{used here as operand #0}}208 test_consume_operand_of_op_kind_or_fail %0, "transform.test_produce_self_handle_or_forward_operand" : !transform.any_op209 transform.sequence %0 : !transform.any_op failures(propagate) {210 ^bb1(%arg1: !transform.any_op):211 // expected-note @below {{used here as operand #0}}212 test_consume_operand_of_op_kind_or_fail %0, "transform.test_produce_self_handle_or_forward_operand" : !transform.any_op213 }214}215 216// -----217 218transform.sequence failures(propagate) {219^bb0(%arg0: !transform.any_op):220 // expected-error @below {{result #0 has more than one potential consumer}}221 %0 = test_produce_self_handle_or_forward_operand : () -> !transform.any_op222 // expected-note @below {{used here as operand #0}}223 test_consume_operand_of_op_kind_or_fail %0, "transform.test_produce_self_handle_or_forward_operand" : !transform.any_op224 // expected-note @below {{used here as operand #0}}225 transform.sequence %0 : !transform.any_op failures(propagate) {226 ^bb1(%arg1: !transform.any_op):227 transform.sequence %arg1 : !transform.any_op failures(propagate) {228 ^bb2(%arg2: !transform.any_op):229 test_consume_operand_of_op_kind_or_fail %arg2, "transform.test_produce_self_handle_or_forward_operand" : !transform.any_op230 }231 }232}233 234// -----235 236transform.sequence failures(propagate) {237^bb1(%arg1: !transform.any_op):238 // expected-error @below {{expects at least one region}}239 transform.alternatives240}241 242// -----243 244transform.sequence failures(propagate) {245^bb1(%arg1: !transform.any_op):246 // expected-error @below {{expects terminator operands to have the same type as results of the operation}}247 %2 = transform.alternatives %arg1 : !transform.any_op -> !transform.any_op {248 ^bb2(%arg2: !transform.any_op):249 transform.yield %arg2 : !transform.any_op250 }, {251 ^bb2(%arg2: !transform.any_op):252 // expected-note @below {{terminator}}253 transform.yield254 }255}256 257// -----258 259// expected-error @below {{expects the entry block to have at least one argument}}260transform.alternatives {261^bb0:262 transform.yield263}264 265// -----266 267transform.sequence failures(propagate) {268^bb0(%arg0: !transform.any_op):269 // expected-error @below {{result #0 has more than one potential consumer}}270 %0 = test_produce_self_handle_or_forward_operand : () -> !transform.any_op271 // expected-note @below {{used here as operand #0}}272 transform.foreach %0 : !transform.any_op {273 ^bb1(%arg1: !transform.any_op):274 transform.test_consume_operand %arg1 : !transform.any_op275 }276 // expected-note @below {{used here as operand #0}}277 transform.test_consume_operand %0 : !transform.any_op278}279 280// -----281 282transform.sequence failures(propagate) {283 ^bb0(%root: !transform.any_op):284 %op = test_produce_self_handle_or_forward_operand : () -> !transform.any_op285 // expected-error @below {{op expects the same number of targets as the body has block arguments}}286 transform.foreach %op : !transform.any_op -> !transform.any_op, !transform.any_value {287 ^bb1(%op_arg: !transform.any_op, %val_arg: !transform.any_value):288 transform.yield %op_arg, %val_arg : !transform.any_op, !transform.any_value289 }290}291 292// -----293 294transform.sequence failures(propagate) {295 ^bb0(%root: !transform.any_op):296 %op = test_produce_self_handle_or_forward_operand : () -> !transform.any_op297 // expected-error @below {{op expects co-indexed targets and the body's block arguments to have the same op/value/param type}}298 transform.foreach %op : !transform.any_op -> !transform.any_value {299 ^bb1(%val_arg: !transform.any_value):300 transform.yield %val_arg : !transform.any_value301 }302}303 304// -----305 306transform.sequence failures(propagate) {307 ^bb0(%root: !transform.any_op):308 %op = test_produce_self_handle_or_forward_operand : () -> !transform.any_op309 // expected-error @below {{op expects the same number of results as the yield terminator has operands}}310 transform.foreach %op : !transform.any_op -> !transform.any_op, !transform.any_op {311 ^bb1(%arg_op: !transform.any_op):312 transform.yield %arg_op : !transform.any_op313 }314}315 316// -----317 318transform.sequence failures(propagate) {319 ^bb0(%root: !transform.any_op):320 %op = test_produce_self_handle_or_forward_operand : () -> !transform.any_op321 %val = transform.test_produce_value_handle_to_self_operand %op : (!transform.any_op) -> !transform.any_value322 // expected-error @below {{expects co-indexed results and yield operands to have the same op/value/param type}}323 transform.foreach %op, %val : !transform.any_op, !transform.any_value -> !transform.any_op, !transform.any_value {324 ^bb1(%op_arg: !transform.any_op, %val_arg: !transform.any_value):325 transform.yield %val_arg, %op_arg : !transform.any_value, !transform.any_op326 }327}328 329// -----330 331transform.sequence failures(suppress) {332^bb0(%arg0: !transform.any_op):333 // expected-error @below {{TransformOpInterface requires memory effects on operands to be specified}}334 // expected-note @below {{no effects specified for operand #0}}335 transform.test_required_memory_effects %arg0 {modifies_payload} : (!transform.any_op) -> !transform.any_op336}337 338// -----339 340transform.sequence failures(suppress) {341^bb0(%arg0: !transform.any_op):342 // expected-error @below {{TransformOpInterface requires 'allocate' memory effect to be specified for results}}343 // expected-note @below {{no 'allocate' effect specified for result #0}}344 transform.test_required_memory_effects %arg0 {has_operand_effect, modifies_payload} : (!transform.any_op) -> !transform.any_op345}346 347// -----348 349// expected-error @below {{attribute can only be attached to operations with symbol tables}}350"test.unknown_container"() { transform.with_named_sequence } : () -> ()351 352// -----353 354module attributes { transform.with_named_sequence } {355 // expected-error @below {{expected a non-empty body block}}356 "transform.named_sequence"() ({357 ^bb0:358 }) { sym_name = "external_named_sequence", function_type = () -> () } : () -> ()359 360 transform.sequence failures(propagate) {361 ^bb0(%arg0: !transform.any_op):362 transform.include @external_named_sequence failures(propagate) () : () -> ()363 }364}365 366// -----367 368module attributes { transform.with_named_sequence } {369 // expected-error @below {{recursion not allowed in named sequences}}370 transform.named_sequence @self_recursion() -> () {371 transform.include @self_recursion failures(suppress) () : () -> ()372 transform.yield373 }374}375 376// -----377 378module @mutual_recursion attributes { transform.with_named_sequence } {379 // expected-note @below {{operation on recursion stack}} 380 transform.named_sequence @foo(%arg0: !transform.any_op {transform.readonly}) -> () {381 transform.include @bar failures(suppress) (%arg0) : (!transform.any_op) -> ()382 transform.yield383 }384 385 // expected-error @below {{recursion not allowed in named sequences}}386 transform.named_sequence @bar(%arg0: !transform.any_op {transform.readonly}) -> () {387 transform.include @foo failures(propagate) (%arg0) : (!transform.any_op) -> ()388 transform.yield389 }390}391 392// -----393 394// expected-error @below {{unknown attribute: "transform.unknown_container"}}395module @unknown_attribute attributes { transform.unknown_container } {}396 397// -----398 399module {400 transform.sequence failures(suppress) {401 ^bb0(%arg0: !transform.any_op):402 // expected-error @below {{op does not reference a named transform sequence}}403 transform.include @non_existent failures(propagate) () : () -> ()404 }405}406 407// -----408 409module attributes { transform.with_named_sequence } {410 transform.sequence failures(suppress) {411 ^bb0(%arg0: !transform.any_op):412 // expected-error @below {{requires attribute 'target'}}413 "transform.include"() {failure_propagation_mode = 1 : i32} : () -> ()414 }415}416 417// -----418 419module attributes { transform.with_named_sequence } {420 transform.named_sequence @foo(%arg0: !transform.any_op) -> () {421 transform.yield422 }423 424 transform.sequence failures(suppress) {425 ^bb0(%arg1: !transform.any_op):426 // expected-error @below {{incorrect number of operands for callee}}427 transform.include @foo failures(suppress) () : () -> ()428 }429}430 431// -----432 433module attributes { transform.with_named_sequence } {434 transform.named_sequence @foo(%arg0: !transform.any_op {transform.readonly}) -> () {435 transform.yield436 }437 438 transform.sequence failures(suppress) {439 ^bb0(%arg1: !transform.op<"builtin.module">):440 // expected-error @below {{operand type mismatch: expected operand type '!transform.any_op', but provided '!transform.op<"builtin.module">' for operand number 0}}441 transform.include @foo failures(suppress) (%arg1) : (!transform.op<"builtin.module">) -> ()442 }443}444 445// -----446 447module attributes { transform.with_named_sequence } {448 transform.named_sequence @foo(%arg0: !transform.any_op {transform.readonly}) -> (!transform.any_op) {449 transform.yield %arg0 : !transform.any_op450 }451 452 transform.sequence failures(suppress) {453 ^bb0(%arg1: !transform.any_op):454 // expected-error @below {{incorrect number of results for callee}}455 transform.include @foo failures(suppress) (%arg1) : (!transform.any_op) -> ()456 }457}458 459// -----460 461module attributes { transform.with_named_sequence } {462 transform.named_sequence @foo(%arg0: !transform.any_op {transform.readonly}) -> (!transform.any_op) {463 transform.yield %arg0 : !transform.any_op464 }465 466 transform.sequence failures(suppress) {467 ^bb0(%arg1: !transform.any_op):468 // expected-error @below {{type of result #0 must implement the same transform dialect interface as the corresponding callee result}}469 transform.include @foo failures(suppress) (%arg1) : (!transform.any_op) -> (!transform.any_value)470 }471}472 473// -----474 475// expected-note @below {{symbol table operation}}476module {477 // expected-error @below {{expects the parent symbol table to have the 'transform.with_named_sequence' attribute}}478 transform.named_sequence @parent_has_no_attributes() {479 transform.yield480 }481}482 483// -----484 485module attributes { transform.with_named_sequence} {486 transform.sequence failures(suppress) {487 ^bb0(%arg0: !transform.any_op):488 // expected-error @below {{op symbol's parent must have the SymbolTable trai}}489 transform.named_sequence @nested() {490 transform.yield491 }492 }493}494 495// -----496 497module attributes { transform.with_named_sequence} {498 func.func private @foo()499 500 // expected-error @below {{expected 'transform.yield' as terminator}}501 transform.named_sequence @nested() {502 // expected-note @below {{terminator}}503 func.call @foo() : () -> ()504 }505}506 507 508// -----509 510module attributes { transform.with_named_sequence} {511 func.func private @foo()512 513 transform.named_sequence @nested(%arg0: !transform.any_op) {514 // expected-error @below {{expected terminator to have as many operands as the parent op has results}}515 transform.yield %arg0 : !transform.any_op516 }517}518 519// -----520 521module attributes { transform.with_named_sequence} {522 func.func private @foo()523 524 transform.named_sequence @nested(%arg0: !transform.any_op) -> !transform.op<"builtin.module"> {525 // expected-error @below {{the type of the terminator operand #0 must match the type of the corresponding parent op result}}526 transform.yield %arg0 : !transform.any_op527 }528}529 530// -----531 532module attributes { transform.with_named_sequence } {533 // expected-error @below {{must provide consumed/readonly status for arguments of external or called ops}}534 transform.named_sequence @foo(%op: !transform.any_op )535}536 537// -----538 539module attributes { transform.with_named_sequence } {540 // expected-error @below {{argument #0 cannot be both readonly and consumed}}541 transform.named_sequence @foo(%op: !transform.any_op { transform.readonly, transform.consumed } )542}543 544// -----545 546module attributes { transform.with_named_sequence } {547 transform.named_sequence @foo(%op: !transform.any_op) {548 transform.debug.emit_remark_at %op, "message" : !transform.any_op549 transform.yield550 }551 552 transform.sequence failures(propagate) {553 ^bb0(%arg0: !transform.any_op):554 // expected-error @below {{TransformOpInterface requires memory effects on operands to be specified}}555 // expected-note @below {{no effects specified for operand #0}}556 transform.include @foo failures(propagate) (%arg0) : (!transform.any_op) -> ()557 transform.yield558 }559}560 561// -----562 563module attributes { transform.with_named_sequence } {564 // expected-error @below {{argument #0 cannot be both readonly and consumed}}565 transform.named_sequence @foo(%op: !transform.any_op {transform.readonly, transform.consumed}) {566 transform.debug.emit_remark_at %op, "message" : !transform.any_op567 transform.yield568 }569 570 transform.sequence failures(propagate) {571 ^bb0(%arg0: !transform.any_op):572 transform.include @foo failures(propagate) (%arg0) : (!transform.any_op) -> ()573 transform.yield574 }575}576 577// -----578 579module attributes { transform.with_named_sequence } {580 // Note that printing a warning doesn't result in verification failures, so this581 // also checks for the IR being printed back.582 // CHECK-LABEL: transform.named_sequence @emit_warning_only583 // expected-warning @below {{argument #0 is not consumed in the body but is marked as consume}}584 transform.named_sequence @emit_warning_only(%op: !transform.any_op {transform.consumed}) {585 transform.debug.emit_remark_at %op, "message" : !transform.any_op586 transform.yield587 }588 589 transform.sequence failures(propagate) {590 ^bb0(%arg0: !transform.any_op):591 transform.include @emit_warning_only failures(propagate) (%arg0) : (!transform.any_op) -> ()592 transform.yield593 }594}595 596// -----597 598module attributes { transform.with_named_sequence } {599 // expected-error @below {{argument #0 is consumed in the body but is not marked as such}}600 transform.named_sequence @foo(%op: !transform.any_op {transform.readonly}) {601 transform.test_consume_operand %op : !transform.any_op602 transform.yield603 }604 605 transform.sequence failures(propagate) {606 ^bb0(%arg0: !transform.any_op):607 transform.include @foo failures(propagate) (%arg0) : (!transform.any_op) -> ()608 transform.yield609 }610}611 612// -----613 614// Checking that consumptions annotations are used correctly in invocation checks.615module attributes { transform.with_named_sequence } {616 transform.named_sequence @foo(%op: !transform.any_op { transform.consumed } )617 618 // expected-error @below {{'transform.sequence' op block argument #0 has more than one potential consumer}}619 transform.sequence failures(propagate) {620 ^bb0(%arg0: !transform.any_op):621 // expected-note @below {{used here as operand #0}}622 transform.include @foo failures(propagate) (%arg0) : (!transform.any_op) -> ()623 // expected-note @below {{used here as operand #0}}624 transform.include @foo failures(propagate) (%arg0) : (!transform.any_op) -> ()625 transform.yield626 }627}628 629// -----630 631module attributes { transform.with_named_sequence } {632 transform.sequence failures(propagate) {633 ^bb0(%root: !transform.any_op):634 // expected-error @below {{unresolved matcher symbol @foo}}635 transform.foreach_match in %root636 @foo -> @bar : (!transform.any_op) -> !transform.any_op637 }638}639 640// -----641 642module attributes { transform.with_named_sequence } {643 func.func private @foo()644 645 transform.sequence failures(propagate) {646 ^bb0(%root: !transform.any_op):647 // expected-error @below {{unresolved matcher symbol @foo}}648 transform.foreach_match in %root649 @foo -> @bar : (!transform.any_op) -> !transform.any_op650 }651}652 653// -----654 655module attributes { transform.with_named_sequence } {656 transform.named_sequence @match()657 658 transform.sequence failures(propagate) {659 ^bb0(%root: !transform.any_op):660 // expected-error @below {{unresolved action symbol @bar}}661 transform.foreach_match in %root662 @match -> @bar : (!transform.any_op) -> !transform.any_op663 }664}665 666// -----667 668module attributes { transform.with_named_sequence } {669 func.func private @bar()670 transform.named_sequence @match()671 672 transform.sequence failures(propagate) {673 ^bb0(%root: !transform.any_op):674 // expected-error @below {{unresolved action symbol @bar}}675 transform.foreach_match in %root676 @match -> @bar : (!transform.any_op) -> !transform.any_op677 }678}679 680// -----681 682module attributes { transform.with_named_sequence } {683 // expected-note @below {{symbol declaration}}684 transform.named_sequence @match(!transform.any_op {transform.readonly}, !transform.any_op {transform.readonly}) -> !transform.any_op685 transform.named_sequence @action(!transform.any_op {transform.readonly})686 687 transform.sequence failures(propagate) {688 ^bb0(%root: !transform.any_op):689 // expected-error @below {{the number of operands (1) doesn't match the number of matcher arguments (2) for @match}}690 transform.foreach_match in %root691 @match -> @action : (!transform.any_op) -> !transform.any_op692 }693}694 695// -----696 697module attributes { transform.with_named_sequence } {698 // expected-note @below {{symbol declaration}}699 transform.named_sequence @match(!transform.any_op {transform.readonly}, !transform.any_op {transform.consumed}) -> !transform.any_op700 transform.named_sequence @action(!transform.any_op {transform.readonly})701 702 transform.sequence failures(propagate) {703 ^bb0(%root: !transform.any_op):704 %r = transform.replicate num(%root) %root : !transform.any_op, !transform.any_op705 // expected-error @below {{'transform.foreach_match' op does not expect matcher symbol to consume its operand #1}}706 transform.foreach_match in %root, %r707 @match -> @action : (!transform.any_op, !transform.any_op) -> !transform.any_op708 }709}710 711// -----712 713module attributes { transform.with_named_sequence } {714 // expected-note @below {{symbol declaration}}715 transform.named_sequence @match(!transform.any_op {transform.readonly}, !transform.any_op {transform.readonly}) -> !transform.any_op716 transform.named_sequence @action(!transform.any_op {transform.readonly})717 718 transform.sequence failures(propagate) {719 ^bb0(%root: !transform.any_op):720 %r = transform.get_operand %root[0] : (!transform.any_op) -> !transform.any_value721 // expected-error @below {{mismatching type interfaces for operand and matcher argument #1 of matcher @match}}722 transform.foreach_match in %root, %r723 @match -> @action : (!transform.any_op, !transform.any_value) -> !transform.any_op724 }725}726 727// -----728 729module attributes { transform.with_named_sequence } {730 transform.named_sequence @match(!transform.any_op {transform.readonly}) -> !transform.any_op731 // expected-note @below {{symbol declaration}}732 transform.named_sequence @action(!transform.any_op {transform.readonly}) -> !transform.any_op733 734 transform.sequence failures(propagate) {735 ^bb0(%root: !transform.any_op):736 // expected-error @below {{the number of action results (1) for @action doesn't match the number of extra op results (0)}}737 transform.foreach_match in %root738 @match -> @action : (!transform.any_op) -> !transform.any_op739 }740}741 742// -----743 744module attributes { transform.with_named_sequence } {745 transform.named_sequence @match(!transform.any_op {transform.readonly}) -> !transform.any_op746 // expected-note @below {{symbol declaration}}747 transform.named_sequence @action(!transform.any_op {transform.readonly}) -> !transform.any_op748 749 transform.sequence failures(propagate) {750 ^bb0(%root: !transform.any_op):751 // expected-error @below {{mismatching type interfaces for action result #0 of action @action and op result}}752 transform.foreach_match in %root753 @match -> @action : (!transform.any_op) -> (!transform.any_op, !transform.any_value)754 }755}756 757// -----758 759module attributes { transform.with_named_sequence } {760 transform.named_sequence @match(!transform.any_op {transform.readonly}) -> !transform.any_op761 transform.named_sequence @action()762 763 transform.sequence failures(propagate) {764 ^bb0(%root: !transform.any_op):765 // expected-error @below {{mismatching number of matcher results and action arguments between @match (1) and @action (0)}}766 transform.foreach_match in %root767 @match -> @action : (!transform.any_op) -> !transform.any_op768 }769}770 771// -----772 773module attributes { transform.with_named_sequence } {774 transform.named_sequence @match(!transform.any_op {transform.readonly})775 // expected-note @below {{symbol declaration}}776 transform.named_sequence @action() -> !transform.any_op777 778 transform.sequence failures(propagate) {779 ^bb0(%root: !transform.any_op):780 // expected-error @below {{the number of action results (1) for @action doesn't match the number of extra op results (0)}}781 transform.foreach_match in %root782 @match -> @action : (!transform.any_op) -> !transform.any_op783 }784}785 786// -----787 788module attributes { transform.with_named_sequence } {789 // expected-note @below {{symbol declaration}}790 transform.named_sequence @match()791 transform.named_sequence @action()792 793 transform.sequence failures(propagate) {794 ^bb0(%root: !transform.any_op):795 // expected-error @below {{the number of operands (1) doesn't match the number of matcher arguments (0) for @match}}796 transform.foreach_match in %root797 @match -> @action : (!transform.any_op) -> !transform.any_op798 }799}800 801// -----802 803module attributes { transform.with_named_sequence } {804 // expected-note @below {{symbol declaration}}805 transform.named_sequence @match(!transform.any_op {transform.consumed})806 transform.named_sequence @action()807 808 transform.sequence failures(propagate) {809 ^bb0(%root: !transform.any_op):810 // expected-error @below {{'transform.foreach_match' op does not expect matcher symbol to consume its operand #0}}811 transform.foreach_match in %root812 @match -> @action : (!transform.any_op) -> !transform.any_op813 }814}815 816// -----817 818transform.sequence failures(propagate) {819^bb0(%arg0: !transform.any_op):820 // expected-error @below {{expected children ops to implement PatternDescriptorOpInterface}}821 transform.apply_patterns to %arg0 {822 // expected-note @below {{op without interface}}823 transform.named_sequence @foo()824 } : !transform.any_op825}826 827// -----828 829transform.sequence failures(propagate) {830^bb0(%arg0: !transform.any_op):831 // expected-error @below {{expected the type of the parameter attribute ('i64') to match the parameter type ('i32')}}832 transform.num_associations %arg0 : (!transform.any_op) -> !transform.param<i32>833}834 835// -----836 837module attributes { transform.with_named_sequence } {838 transform.named_sequence @__transform_main(%arg0: !transform.any_op) {839 // expected-error @below {{unresolved matcher symbol @missing_symbol}}840 transform.collect_matching @missing_symbol in %arg0 : (!transform.any_op) -> !transform.any_op841 transform.yield842 }843}844 845// -----846 847module attributes { transform.with_named_sequence } {848 transform.named_sequence @__transform_main(%arg0: !transform.any_op) {849 // expected-error @below {{expected the matcher to take one operation handle argument}}850 transform.collect_matching @matcher in %arg0 : (!transform.any_op) -> !transform.any_op851 transform.yield852 }853 854 transform.named_sequence @matcher() {855 transform.yield856 }857}858 859// -----860 861 862module attributes { transform.with_named_sequence } {863 transform.named_sequence @__transform_main(%arg0: !transform.any_op) {864 // expected-error @below {{expected the matcher argument to be marked readonly}}865 transform.collect_matching @matcher in %arg0 : (!transform.any_op) -> !transform.any_op866 transform.yield867 }868 869 transform.named_sequence @matcher(%arg0: !transform.any_op) {870 transform.yield871 }872}873 874 875// -----876 877module attributes { transform.with_named_sequence } {878 transform.named_sequence @__transform_main(%arg0: !transform.any_op) {879 // expected-error @below {{expected the matcher to yield as many values as op has results (1), got 0}}880 transform.collect_matching @matcher in %arg0 : (!transform.any_op) -> !transform.any_op881 transform.yield882 }883 884 transform.named_sequence @matcher(%arg0: !transform.any_op {transform.readonly}) {885 transform.yield886 }887}888 889// -----890 891module attributes { transform.with_named_sequence } {892 transform.named_sequence @__transform_main(%arg0: !transform.any_op) {893 // expected-error @below {{mismatching type interfaces for matcher result and op result #0}}894 transform.collect_matching @matcher in %arg0 : (!transform.any_op) -> !transform.any_value895 transform.yield896 }897 898 transform.named_sequence @matcher(%arg0: !transform.any_op {transform.readonly}) -> !transform.any_op {899 transform.yield %arg0 : !transform.any_op900 }901}902 903// -----904 905module attributes { transform.with_named_sequence } {906 transform.named_sequence @match_matmul(%entry: !transform.any_op) -> () {907 %c3 = transform.param.constant 1 : i64 -> !transform.param<i64>908 // expected-error @below {{op operand #0 must be TransformHandleTypeInterface instance}}909 transform.print %c3 : !transform.param<i64>910 transform.yield911 }912}913 914// -----915 916module attributes { transform.with_named_sequence } {917 transform.named_sequence @__transform_main(%arg0: !transform.any_op) -> () {918 // Intentionally malformed func with no region. This shouldn't crash the919 // verifier of `with_named_sequence` that runs before we get to the920 // function.921 // expected-error @below {{requires one region}}922 "func.func"() : () -> ()923 transform.yield924 }925}926 927// -----928 929module attributes { transform.with_named_sequence } {930 transform.named_sequence @__transform_main(%arg0: !transform.any_op) -> () {931 // Intentionally malformed call with a region. This shouldn't crash the932 // verifier of `with_named_sequence` that runs before we get to the call.933 // expected-error @below {{requires zero regions}}934 "func.call"() <{935 function_type = () -> (),936 sym_name = "lambda_function"937 }> ({938 ^bb0:939 "func.return"() : () -> ()940 }) : () -> ()941 transform.yield942 }943}944 945// -----946 947module attributes { transform.with_named_sequence } {948 // Intentionally malformed sequence where the verifier should not crash.949 // expected-error @below {{ op expects argument attribute array to have the same number of elements as the number of function arguments, got 1, but expected 3}}950 "transform.named_sequence"() <{951 arg_attrs = [{transform.readonly}],952 function_type = (i1, tensor<f32>, tensor<f32>) -> (),953 sym_name = "print_message"954 }> ({}) : () -> ()955 "transform.named_sequence"() <{956 function_type = (!transform.any_op) -> (),957 sym_name = "reference_other_module"958 }> ({959 ^bb0(%arg0: !transform.any_op):960 "transform.include"(%arg0) <{target = @print_message}> : (!transform.any_op) -> ()961 "transform.yield"() : () -> ()962 }) : () -> ()963}964