1// RUN: mlir-opt %s -split-input-file -verify-diagnostics | FileCheck %s 2 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_op 32}) : () -> () 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 : f32 50} 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.yield 59} 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.yield 69 } 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_op 85// 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_op 180 // 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_op 182 // 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_op 184} 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_op 192 // 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_op 194 // 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_op 198 } 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_op 207 // 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_op 209 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_op 213 } 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_op 222 // 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_op 224 // 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_op 230 } 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.alternatives 240} 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_op 250 }, { 251 ^bb2(%arg2: !transform.any_op): 252 // expected-note @below {{terminator}} 253 transform.yield 254 } 255} 256 257// ----- 258 259// expected-error @below {{expects the entry block to have at least one argument}} 260transform.alternatives { 261^bb0: 262 transform.yield 263} 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_op 271 // 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_op 275 } 276 // expected-note @below {{used here as operand #0}} 277 transform.test_consume_operand %0 : !transform.any_op 278} 279 280// ----- 281 282transform.sequence failures(propagate) { 283 ^bb0(%root: !transform.any_op): 284 %op = test_produce_self_handle_or_forward_operand : () -> !transform.any_op 285 // 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_value 289 } 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_op 297 // 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_value 301 } 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_op 309 // 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_op 313 } 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_op 321 %val = transform.test_produce_value_handle_to_self_operand %op : (!transform.any_op) -> !transform.any_value 322 // 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_op 326 } 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_op 336} 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_op 345} 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 } 373} 374 375// ----- 376 377module @mutual_recursion attributes { transform.with_named_sequence } { 378 // expected-note @below {{operation on recursion stack}} 379 transform.named_sequence @foo(%arg0: !transform.any_op) -> () { 380 transform.include @bar failures(suppress) (%arg0) : (!transform.any_op) -> () 381 transform.yield 382 } 383 384 // expected-error @below {{recursion not allowed in named sequences}} 385 transform.named_sequence @bar(%arg0: !transform.any_op) -> () { 386 transform.include @foo failures(propagate) (%arg0) : (!transform.any_op) -> () 387 transform.yield 388 } 389} 390 391// ----- 392 393// expected-error @below {{unknown attribute: "transform.unknown_container"}} 394module @unknown_attribute attributes { transform.unknown_container } {} 395 396// ----- 397 398module { 399 transform.sequence failures(suppress) { 400 ^bb0(%arg0: !transform.any_op): 401 // expected-error @below {{op does not reference a named transform sequence}} 402 transform.include @non_existent failures(propagate) () : () -> () 403 } 404} 405 406// ----- 407 408module attributes { transform.with_named_sequence } { 409 transform.sequence failures(suppress) { 410 ^bb0(%arg0: !transform.any_op): 411 // expected-error @below {{requires attribute 'target'}} 412 "transform.include"() {failure_propagation_mode = 1 : i32} : () -> () 413 } 414} 415 416// ----- 417 418module attributes { transform.with_named_sequence } { 419 transform.named_sequence @foo(%arg0: !transform.any_op) -> () { 420 transform.yield 421 } 422 423 transform.sequence failures(suppress) { 424 ^bb0(%arg1: !transform.any_op): 425 // expected-error @below {{incorrect number of operands for callee}} 426 transform.include @foo failures(suppress) () : () -> () 427 } 428} 429 430// ----- 431 432module attributes { transform.with_named_sequence } { 433 transform.named_sequence @foo(%arg0: !transform.any_op) -> () { 434 transform.yield 435 } 436 437 transform.sequence failures(suppress) { 438 ^bb0(%arg1: !transform.op<"builtin.module">): 439 // expected-error @below {{operand type mismatch: expected operand type '!transform.any_op', but provided '!transform.op<"builtin.module">' for operand number 0}} 440 transform.include @foo failures(suppress) (%arg1) : (!transform.op<"builtin.module">) -> () 441 } 442} 443 444// ----- 445 446module attributes { transform.with_named_sequence } { 447 transform.named_sequence @foo(%arg0: !transform.any_op) -> (!transform.any_op) { 448 transform.yield %arg0 : !transform.any_op 449 } 450 451 transform.sequence failures(suppress) { 452 ^bb0(%arg1: !transform.any_op): 453 // expected-error @below {{incorrect number of results for callee}} 454 transform.include @foo failures(suppress) (%arg1) : (!transform.any_op) -> () 455 } 456} 457 458// ----- 459 460module attributes { transform.with_named_sequence } { 461 transform.named_sequence @foo(%arg0: !transform.any_op) -> (!transform.any_op) { 462 transform.yield %arg0 : !transform.any_op 463 } 464 465 transform.sequence failures(suppress) { 466 ^bb0(%arg1: !transform.any_op): 467 // expected-error @below {{type of result #0 must implement the same transform dialect interface as the corresponding callee result}} 468 transform.include @foo failures(suppress) (%arg1) : (!transform.any_op) -> (!transform.any_value) 469 } 470} 471 472// ----- 473 474// expected-note @below {{symbol table operation}} 475module { 476 // expected-error @below {{expects the parent symbol table to have the 'transform.with_named_sequence' attribute}} 477 transform.named_sequence @parent_has_no_attributes() { 478 transform.yield 479 } 480} 481 482// ----- 483 484module attributes { transform.with_named_sequence} { 485 transform.sequence failures(suppress) { 486 ^bb0(%arg0: !transform.any_op): 487 // expected-error @below {{op symbol's parent must have the SymbolTable trai}} 488 transform.named_sequence @nested() { 489 transform.yield 490 } 491 } 492} 493 494// ----- 495 496module attributes { transform.with_named_sequence} { 497 func.func private @foo() 498 499 // expected-error @below {{expected 'transform.yield' as terminator}} 500 transform.named_sequence @nested() { 501 // expected-note @below {{terminator}} 502 func.call @foo() : () -> () 503 } 504} 505 506 507// ----- 508 509module attributes { transform.with_named_sequence} { 510 func.func private @foo() 511 512 transform.named_sequence @nested(%arg0: !transform.any_op) { 513 // expected-error @below {{expected terminator to have as many operands as the parent op has results}} 514 transform.yield %arg0 : !transform.any_op 515 } 516} 517 518// ----- 519 520module attributes { transform.with_named_sequence} { 521 func.func private @foo() 522 523 transform.named_sequence @nested(%arg0: !transform.any_op) -> !transform.op<"builtin.module"> { 524 // expected-error @below {{the type of the terminator operand #0 must match the type of the corresponding parent op result}} 525 transform.yield %arg0 : !transform.any_op 526 } 527} 528 529// ----- 530 531module attributes { transform.with_named_sequence } { 532 // expected-error @below {{must provide consumed/readonly status for arguments of external or called ops}} 533 transform.named_sequence @foo(%op: !transform.any_op ) 534} 535 536// ----- 537 538module attributes { transform.with_named_sequence } { 539 // expected-error @below {{argument #0 cannot be both readonly and consumed}} 540 transform.named_sequence @foo(%op: !transform.any_op { transform.readonly, transform.consumed } ) 541} 542 543// ----- 544 545module attributes { transform.with_named_sequence } { 546 // expected-error @below {{must provide consumed/readonly status for arguments of external or called ops}} 547 transform.named_sequence @foo(%op: !transform.any_op) { 548 transform.debug.emit_remark_at %op, "message" : !transform.any_op 549 transform.yield 550 } 551 552 transform.sequence failures(propagate) { 553 ^bb0(%arg0: !transform.any_op): 554 transform.include @foo failures(propagate) (%arg0) : (!transform.any_op) -> () 555 transform.yield 556 } 557} 558 559// ----- 560 561module attributes { transform.with_named_sequence } { 562 // expected-error @below {{argument #0 cannot be both readonly and consumed}} 563 transform.named_sequence @foo(%op: !transform.any_op {transform.readonly, transform.consumed}) { 564 transform.debug.emit_remark_at %op, "message" : !transform.any_op 565 transform.yield 566 } 567 568 transform.sequence failures(propagate) { 569 ^bb0(%arg0: !transform.any_op): 570 transform.include @foo failures(propagate) (%arg0) : (!transform.any_op) -> () 571 transform.yield 572 } 573} 574 575// ----- 576 577module attributes { transform.with_named_sequence } { 578 // Note that printing a warning doesn't result in verification failures, so this 579 // also checks for the IR being printed back. 580 // CHECK-LABEL: transform.named_sequence @emit_warning_only 581 // expected-warning @below {{argument #0 is not consumed in the body but is marked as consume}} 582 transform.named_sequence @emit_warning_only(%op: !transform.any_op {transform.consumed}) { 583 transform.debug.emit_remark_at %op, "message" : !transform.any_op 584 transform.yield 585 } 586 587 transform.sequence failures(propagate) { 588 ^bb0(%arg0: !transform.any_op): 589 transform.include @emit_warning_only failures(propagate) (%arg0) : (!transform.any_op) -> () 590 transform.yield 591 } 592} 593 594// ----- 595 596module attributes { transform.with_named_sequence } { 597 // expected-error @below {{argument #0 is consumed in the body but is not marked as such}} 598 transform.named_sequence @foo(%op: !transform.any_op {transform.readonly}) { 599 transform.test_consume_operand %op : !transform.any_op 600 transform.yield 601 } 602 603 transform.sequence failures(propagate) { 604 ^bb0(%arg0: !transform.any_op): 605 transform.include @foo failures(propagate) (%arg0) : (!transform.any_op) -> () 606 transform.yield 607 } 608} 609 610// ----- 611 612// Checking that consumptions annotations are used correctly in invocation checks. 613module attributes { transform.with_named_sequence } { 614 transform.named_sequence @foo(%op: !transform.any_op { transform.consumed } ) 615 616 // expected-error @below {{'transform.sequence' op block argument #0 has more than one potential consumer}} 617 transform.sequence failures(propagate) { 618 ^bb0(%arg0: !transform.any_op): 619 // expected-note @below {{used here as operand #0}} 620 transform.include @foo failures(propagate) (%arg0) : (!transform.any_op) -> () 621 // expected-note @below {{used here as operand #0}} 622 transform.include @foo failures(propagate) (%arg0) : (!transform.any_op) -> () 623 transform.yield 624 } 625} 626 627// ----- 628 629module attributes { transform.with_named_sequence } { 630 transform.sequence failures(propagate) { 631 ^bb0(%root: !transform.any_op): 632 // expected-error @below {{unresolved matcher symbol @foo}} 633 transform.foreach_match in %root 634 @foo -> @bar : (!transform.any_op) -> !transform.any_op 635 } 636} 637 638// ----- 639 640module attributes { transform.with_named_sequence } { 641 func.func private @foo() 642 643 transform.sequence failures(propagate) { 644 ^bb0(%root: !transform.any_op): 645 // expected-error @below {{unresolved matcher symbol @foo}} 646 transform.foreach_match in %root 647 @foo -> @bar : (!transform.any_op) -> !transform.any_op 648 } 649} 650 651// ----- 652 653module attributes { transform.with_named_sequence } { 654 transform.named_sequence @match() 655 656 transform.sequence failures(propagate) { 657 ^bb0(%root: !transform.any_op): 658 // expected-error @below {{unresolved action symbol @bar}} 659 transform.foreach_match in %root 660 @match -> @bar : (!transform.any_op) -> !transform.any_op 661 } 662} 663 664// ----- 665 666module attributes { transform.with_named_sequence } { 667 func.func private @bar() 668 transform.named_sequence @match() 669 670 transform.sequence failures(propagate) { 671 ^bb0(%root: !transform.any_op): 672 // expected-error @below {{unresolved action symbol @bar}} 673 transform.foreach_match in %root 674 @match -> @bar : (!transform.any_op) -> !transform.any_op 675 } 676} 677 678// ----- 679 680module attributes { transform.with_named_sequence } { 681 // expected-note @below {{symbol declaration}} 682 transform.named_sequence @match(!transform.any_op {transform.readonly}, !transform.any_op {transform.readonly}) -> !transform.any_op 683 transform.named_sequence @action(!transform.any_op {transform.readonly}) 684 685 transform.sequence failures(propagate) { 686 ^bb0(%root: !transform.any_op): 687 // expected-error @below {{the number of operands (1) doesn't match the number of matcher arguments (2) for @match}} 688 transform.foreach_match in %root 689 @match -> @action : (!transform.any_op) -> !transform.any_op 690 } 691} 692 693// ----- 694 695module attributes { transform.with_named_sequence } { 696 // expected-note @below {{symbol declaration}} 697 transform.named_sequence @match(!transform.any_op {transform.readonly}, !transform.any_op {transform.consumed}) -> !transform.any_op 698 transform.named_sequence @action(!transform.any_op {transform.readonly}) 699 700 transform.sequence failures(propagate) { 701 ^bb0(%root: !transform.any_op): 702 %r = transform.replicate num(%root) %root : !transform.any_op, !transform.any_op 703 // expected-error @below {{'transform.foreach_match' op does not expect matcher symbol to consume its operand #1}} 704 transform.foreach_match in %root, %r 705 @match -> @action : (!transform.any_op, !transform.any_op) -> !transform.any_op 706 } 707} 708 709// ----- 710 711module attributes { transform.with_named_sequence } { 712 // expected-note @below {{symbol declaration}} 713 transform.named_sequence @match(!transform.any_op {transform.readonly}, !transform.any_op {transform.readonly}) -> !transform.any_op 714 transform.named_sequence @action(!transform.any_op {transform.readonly}) 715 716 transform.sequence failures(propagate) { 717 ^bb0(%root: !transform.any_op): 718 %r = transform.get_operand %root[0] : (!transform.any_op) -> !transform.any_value 719 // expected-error @below {{mismatching type interfaces for operand and matcher argument #1 of matcher @match}} 720 transform.foreach_match in %root, %r 721 @match -> @action : (!transform.any_op, !transform.any_value) -> !transform.any_op 722 } 723} 724 725// ----- 726 727module attributes { transform.with_named_sequence } { 728 transform.named_sequence @match(!transform.any_op {transform.readonly}) -> !transform.any_op 729 // expected-note @below {{symbol declaration}} 730 transform.named_sequence @action(!transform.any_op {transform.readonly}) -> !transform.any_op 731 732 transform.sequence failures(propagate) { 733 ^bb0(%root: !transform.any_op): 734 // expected-error @below {{the number of action results (1) for @action doesn't match the number of extra op results (0)}} 735 transform.foreach_match in %root 736 @match -> @action : (!transform.any_op) -> !transform.any_op 737 } 738} 739 740// ----- 741 742module attributes { transform.with_named_sequence } { 743 transform.named_sequence @match(!transform.any_op {transform.readonly}) -> !transform.any_op 744 // expected-note @below {{symbol declaration}} 745 transform.named_sequence @action(!transform.any_op {transform.readonly}) -> !transform.any_op 746 747 transform.sequence failures(propagate) { 748 ^bb0(%root: !transform.any_op): 749 // expected-error @below {{mismatching type interfaces for action result #0 of action @action and op result}} 750 transform.foreach_match in %root 751 @match -> @action : (!transform.any_op) -> (!transform.any_op, !transform.any_value) 752 } 753} 754 755// ----- 756 757module attributes { transform.with_named_sequence } { 758 transform.named_sequence @match(!transform.any_op {transform.readonly}) -> !transform.any_op 759 transform.named_sequence @action() 760 761 transform.sequence failures(propagate) { 762 ^bb0(%root: !transform.any_op): 763 // expected-error @below {{mismatching number of matcher results and action arguments between @match (1) and @action (0)}} 764 transform.foreach_match in %root 765 @match -> @action : (!transform.any_op) -> !transform.any_op 766 } 767} 768 769// ----- 770 771module attributes { transform.with_named_sequence } { 772 transform.named_sequence @match(!transform.any_op {transform.readonly}) 773 // expected-note @below {{symbol declaration}} 774 transform.named_sequence @action() -> !transform.any_op 775 776 transform.sequence failures(propagate) { 777 ^bb0(%root: !transform.any_op): 778 // expected-error @below {{the number of action results (1) for @action doesn't match the number of extra op results (0)}} 779 transform.foreach_match in %root 780 @match -> @action : (!transform.any_op) -> !transform.any_op 781 } 782} 783 784// ----- 785 786module attributes { transform.with_named_sequence } { 787 // expected-note @below {{symbol declaration}} 788 transform.named_sequence @match() 789 transform.named_sequence @action() 790 791 transform.sequence failures(propagate) { 792 ^bb0(%root: !transform.any_op): 793 // expected-error @below {{the number of operands (1) doesn't match the number of matcher arguments (0) for @match}} 794 transform.foreach_match in %root 795 @match -> @action : (!transform.any_op) -> !transform.any_op 796 } 797} 798 799// ----- 800 801module attributes { transform.with_named_sequence } { 802 // expected-note @below {{symbol declaration}} 803 transform.named_sequence @match(!transform.any_op {transform.consumed}) 804 transform.named_sequence @action() 805 806 transform.sequence failures(propagate) { 807 ^bb0(%root: !transform.any_op): 808 // expected-error @below {{'transform.foreach_match' op does not expect matcher symbol to consume its operand #0}} 809 transform.foreach_match in %root 810 @match -> @action : (!transform.any_op) -> !transform.any_op 811 } 812} 813 814// ----- 815 816transform.sequence failures(propagate) { 817^bb0(%arg0: !transform.any_op): 818 // expected-error @below {{expected children ops to implement PatternDescriptorOpInterface}} 819 transform.apply_patterns to %arg0 { 820 // expected-note @below {{op without interface}} 821 transform.named_sequence @foo() 822 } : !transform.any_op 823} 824 825// ----- 826 827transform.sequence failures(propagate) { 828^bb0(%arg0: !transform.any_op): 829 // expected-error @below {{expected the type of the parameter attribute ('i64') to match the parameter type ('i32')}} 830 transform.num_associations %arg0 : (!transform.any_op) -> !transform.param<i32> 831} 832 833// ----- 834 835module attributes { transform.with_named_sequence } { 836 transform.named_sequence @__transform_main(%arg0: !transform.any_op) { 837 // expected-error @below {{unresolved matcher symbol @missing_symbol}} 838 transform.collect_matching @missing_symbol in %arg0 : (!transform.any_op) -> !transform.any_op 839 transform.yield 840 } 841} 842 843// ----- 844 845module attributes { transform.with_named_sequence } { 846 transform.named_sequence @__transform_main(%arg0: !transform.any_op) { 847 // expected-error @below {{expected the matcher to take one operation handle argument}} 848 transform.collect_matching @matcher in %arg0 : (!transform.any_op) -> !transform.any_op 849 transform.yield 850 } 851 852 transform.named_sequence @matcher() { 853 transform.yield 854 } 855} 856 857// ----- 858 859 860module attributes { transform.with_named_sequence } { 861 transform.named_sequence @__transform_main(%arg0: !transform.any_op) { 862 // expected-error @below {{expected the matcher argument to be marked readonly}} 863 transform.collect_matching @matcher in %arg0 : (!transform.any_op) -> !transform.any_op 864 transform.yield 865 } 866 867 transform.named_sequence @matcher(%arg0: !transform.any_op) { 868 transform.yield 869 } 870} 871 872 873// ----- 874 875module attributes { transform.with_named_sequence } { 876 transform.named_sequence @__transform_main(%arg0: !transform.any_op) { 877 // expected-error @below {{expected the matcher to yield as many values as op has results (1), got 0}} 878 transform.collect_matching @matcher in %arg0 : (!transform.any_op) -> !transform.any_op 879 transform.yield 880 } 881 882 transform.named_sequence @matcher(%arg0: !transform.any_op {transform.readonly}) { 883 transform.yield 884 } 885} 886 887// ----- 888 889module attributes { transform.with_named_sequence } { 890 transform.named_sequence @__transform_main(%arg0: !transform.any_op) { 891 // expected-error @below {{mismatching type interfaces for matcher result and op result #0}} 892 transform.collect_matching @matcher in %arg0 : (!transform.any_op) -> !transform.any_value 893 transform.yield 894 } 895 896 transform.named_sequence @matcher(%arg0: !transform.any_op {transform.readonly}) -> !transform.any_op { 897 transform.yield %arg0 : !transform.any_op 898 } 899} 900 901// ----- 902 903module attributes { transform.with_named_sequence } { 904 transform.named_sequence @match_matmul(%entry: !transform.any_op) -> () { 905 %c3 = transform.param.constant 1 : i64 -> !transform.param<i64> 906 // expected-error @below {{op operand #0 must be TransformHandleTypeInterface instance}} 907 transform.print %c3 : !transform.param<i64> 908 transform.yield 909 } 910} 911