xref: /llvm-project/mlir/test/Dialect/Transform/ops.mlir (revision d462bf687548a5630f60a8afaa66120df8319e88)
1// RUN: mlir-opt %s | mlir-opt | FileCheck %s
2
3// CHECK: transform.sequence
4// CHECK: ^{{.+}}(%{{.+}}: !transform.any_op):
5transform.sequence failures(propagate) {
6^bb0(%arg0: !transform.any_op):
7  // CHECK: sequence %{{.+}} : !transform.any_op
8  // CHECK: ^{{.+}}(%{{.+}}: !transform.any_op):
9  sequence %arg0 : !transform.any_op failures(propagate) {
10  ^bb1(%arg1: !transform.any_op):
11  }
12}
13
14// CHECK: transform.with_pdl_patterns
15// CHECK: ^{{.+}}(%[[ARG:.+]]: !transform.any_op):
16transform.with_pdl_patterns {
17^bb0(%arg0: !transform.any_op):
18  // CHECK: sequence %[[ARG]] : !transform.any_op
19  sequence %arg0 : !transform.any_op failures(propagate) {
20  ^bb1(%arg1: !transform.any_op):
21  }
22}
23
24// Using the same value multiple times without consuming it is fine.
25// CHECK: transform.sequence
26// CHECK: %[[V:.+]] = sequence %{{.*}} : !transform.any_op -> !transform.any_op
27// CHECK: sequence %[[V]]
28// CHECK: sequence %[[V]]
29transform.sequence failures(propagate) {
30^bb0(%arg0: !transform.any_op):
31  %0 = transform.sequence %arg0 : !transform.any_op -> !transform.any_op failures(propagate) {
32  ^bb1(%arg1: !transform.any_op):
33    yield %arg1 : !transform.any_op
34  }
35  transform.sequence %0 : !transform.any_op failures(propagate) {
36  ^bb2(%arg2: !transform.any_op):
37  }
38  transform.sequence %0 : !transform.any_op failures(propagate) {
39  ^bb3(%arg3: !transform.any_op):
40  }
41}
42
43// CHECK: transform.sequence failures(propagate)
44transform.sequence failures(propagate) {
45^bb0(%arg0: !transform.any_op, %arg1: !transform.any_op, %arg2: !transform.any_op):
46  // CHECK: sequence %{{.*}}, %{{.*}}, %{{.*}} : (!transform.any_op, !transform.any_op, !transform.any_op) failures(propagate)
47  transform.sequence %arg0, %arg1, %arg2 : !transform.any_op, !transform.any_op, !transform.any_op failures(propagate) {
48  ^bb0(%arg3: !transform.any_op, %arg4: !transform.any_op, %arg5: !transform.any_op):
49  }
50}
51
52// CHECK: transform.sequence failures(propagate)
53transform.sequence failures(propagate) {
54^bb0(%arg0: !transform.any_op, %arg1: !transform.any_op, %arg2: !transform.any_op):
55  // CHECK: sequence %{{.*}}, %{{.*}}, %{{.*}} : (!transform.any_op, !transform.any_op, !transform.any_op) failures(propagate)
56  transform.sequence %arg0, %arg1, %arg2 : (!transform.any_op, !transform.any_op, !transform.any_op) failures(propagate) {
57  ^bb0(%arg3: !transform.any_op, %arg4: !transform.any_op, %arg5: !transform.any_op):
58  }
59}
60
61// CHECK: transform.sequence failures(propagate)
62transform.sequence failures(propagate) {
63^bb0(%arg0: !transform.any_op, %arg1: !transform.any_op, %arg2: !transform.any_op):
64  // CHECK: sequence %{{.*}}, %{{.*}}, %{{.*}} : (!transform.any_op, !transform.any_op, !transform.any_op) failures(propagate)
65  transform.sequence %arg0, %arg1, %arg2 : (!transform.any_op, !transform.any_op, !transform.any_op) failures(propagate) {
66  ^bb0(%arg3: !transform.any_op, %arg4: !transform.any_op, %arg5: !transform.any_op):
67  }
68}
69
70// CHECK: transform.sequence
71transform.sequence failures(propagate) {
72^bb0(%op0: !transform.any_op, %val0: !transform.any_value, %par0: !transform.any_param):
73  // CHECK: foreach %{{.*}} : !transform.any_op
74  transform.foreach %op0 : !transform.any_op {
75  ^bb1(%op1: !transform.any_op):
76  }
77  // CHECK: foreach %{{.*}} : !transform.any_op, !transform.any_value, !transform.any_param
78  transform.foreach %op0, %val0, %par0 : !transform.any_op, !transform.any_value, !transform.any_param {
79  ^bb1(%op1: !transform.any_op, %val1: !transform.any_value, %par1: !transform.any_param):
80  }
81  // CHECK: foreach %{{.*}} : !transform.any_op, !transform.any_value, !transform.any_param -> !transform.any_op
82  transform.foreach %op0, %val0, %par0 : !transform.any_op, !transform.any_value, !transform.any_param -> !transform.any_op {
83  ^bb1(%op1: !transform.any_op, %val1: !transform.any_value, %par1: !transform.any_param):
84    transform.yield %op1 : !transform.any_op
85  }
86  // CHECK: foreach %{{.*}} : !transform.any_op, !transform.any_value, !transform.any_param -> !transform.any_param, !transform.any_value
87  transform.foreach %op0, %val0, %par0 : !transform.any_op, !transform.any_value, !transform.any_param -> !transform.any_param, !transform.any_value {
88  ^bb1(%op1: !transform.any_op, %val1: !transform.any_value, %par1: !transform.any_param):
89    transform.yield %par1, %val1 : !transform.any_param, !transform.any_value
90  }
91}
92
93// CHECK: transform.sequence
94transform.sequence failures(propagate) {
95^bb0(%arg0: !transform.any_op):
96  // CHECK: cast %{{.*}} : !transform.any_op to !transform.any_op
97  %0 = cast %arg0: !transform.any_op to !transform.any_op
98  // CHECK: cast %{{.*}} : !transform.any_op to !transform.op<"builtin.module">
99  %1 = cast %0: !transform.any_op to !transform.op<"builtin.module">
100}
101
102// CHECK: transform.sequence
103// CHECK-COUNT-9: print
104transform.sequence failures(propagate) {
105^bb0(%arg0: !transform.any_op):
106  transform.print %arg0 : !transform.any_op
107  transform.print
108  transform.print %arg0 {name = "test"} : !transform.any_op
109  transform.print {name = "test"}
110  transform.print {name = "test", assume_verified}
111  transform.print %arg0 {assume_verified} : !transform.any_op
112  transform.print %arg0 {use_local_scope} : !transform.any_op
113  transform.print %arg0 {skip_regions} : !transform.any_op
114  transform.print %arg0 {assume_verified, use_local_scope, skip_regions} : !transform.any_op
115}
116
117// CHECK: transform.sequence
118// CHECK: transform.structured.tile_using_for %0 tile_sizes [4, 4, [4]]
119transform.sequence failures(propagate) {
120^bb0(%arg1: !transform.any_op):
121  %0 = transform.structured.match ops{["linalg.matmul"]} in %arg1 : (!transform.any_op) -> !transform.any_op
122  transform.structured.tile_using_for %0 tile_sizes [4, 4, [4]] : (!transform.any_op) -> (!transform.any_op, !transform.any_op, !transform.any_op, !transform.any_op)
123}
124
125// CHECK: transform.sequence
126// CHECK: transform.structured.tile_using_for %0 tile_sizes {{\[}}[2], 4, 8]
127transform.sequence failures(propagate) {
128^bb0(%arg1: !transform.any_op):
129  %0 = transform.structured.match ops{["linalg.matmul"]} in %arg1 : (!transform.any_op) -> !transform.any_op
130  transform.structured.tile_using_for %0 tile_sizes [[2], 4, 8] : (!transform.any_op) -> (!transform.any_op, !transform.any_op, !transform.any_op, !transform.any_op)
131}
132
133// CHECK: transform.sequence
134// CHECK: transform.param.constant "example_string
135transform.sequence failures(propagate) {
136^bb0(%arg1: !transform.any_op):
137  transform.param.constant "example_string" -> !transform.any_param
138}
139