xref: /llvm-project/mlir/test/Dialect/Transform/ops-invalid.mlir (revision d462bf687548a5630f60a8afaa66120df8319e88)
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