xref: /llvm-project/mlir/test/python/dialects/transform_structured_ext.py (revision 579ced4f8266b273d15b2801067a828151a222ef)
13f71765aSAlex Zinenko# RUN: %PYTHON %s | FileCheck %s
23f71765aSAlex Zinenko
3f167dc4fSIngo Müllerimport functools
4f167dc4fSIngo Müllerfrom typing import Callable
5f167dc4fSIngo Müller
63f71765aSAlex Zinenkofrom mlir.ir import *
73f71765aSAlex Zinenkofrom mlir.dialects import transform
83f71765aSAlex Zinenkofrom mlir.dialects import pdl
93f71765aSAlex Zinenkofrom mlir.dialects.transform import structured
1094d608d4SAlex Zinenkofrom mlir.dialects.transform import pdl as transform_pdl
11f2f65eddSsrcarrollfrom mlir.dialects.transform.extras import constant_param
123f71765aSAlex Zinenko
133f71765aSAlex Zinenko
143f71765aSAlex Zinenkodef run(f):
153f71765aSAlex Zinenko    with Context(), Location.unknown():
163f71765aSAlex Zinenko        module = Module.create()
173f71765aSAlex Zinenko        with InsertionPoint(module.body):
183f71765aSAlex Zinenko            print("\nTEST:", f.__name__)
193f71765aSAlex Zinenko            f()
20030e315eSIngo Müller        module.operation.verify()
213f71765aSAlex Zinenko        print(module)
223f71765aSAlex Zinenko    return f
233f71765aSAlex Zinenko
243f71765aSAlex Zinenko
25f167dc4fSIngo Müllerdef create_sequence(func: Callable) -> Callable:
26f167dc4fSIngo Müller    @functools.wraps(func)
27f167dc4fSIngo Müller    def decorated() -> None:
282d3dcd4aSIngo Müller        sequence = transform.SequenceOp(
29f167dc4fSIngo Müller            transform.FailurePropagationMode.Propagate,
30f167dc4fSIngo Müller            [],
31f167dc4fSIngo Müller            transform.AnyOpType.get(),
322d3dcd4aSIngo Müller        )
332d3dcd4aSIngo Müller        with InsertionPoint(sequence.body):
34f167dc4fSIngo Müller            func(sequence.bodyTarget)
352d3dcd4aSIngo Müller            transform.YieldOp()
36f167dc4fSIngo Müller
37f167dc4fSIngo Müller    return decorated
38f167dc4fSIngo Müller
39f167dc4fSIngo Müller
40f167dc4fSIngo Müller@run
41f167dc4fSIngo Müller@create_sequence
42f167dc4fSIngo Müllerdef testBufferizeToAllocationOpCompact(target):
43f167dc4fSIngo Müller    structured.BufferizeToAllocationOp(target)
442d3dcd4aSIngo Müller    # CHECK-LABEL: TEST: testBufferizeToAllocationOpCompact
452d3dcd4aSIngo Müller    # CHECK: transform.sequence
462d3dcd4aSIngo Müller    # CHECK: transform.structured.bufferize_to_allocation
472d3dcd4aSIngo Müller
482d3dcd4aSIngo Müller
492d3dcd4aSIngo Müller@run
50f167dc4fSIngo Müller@create_sequence
51f167dc4fSIngo Müllerdef testBufferizeToAllocationOpArgs(target):
522d3dcd4aSIngo Müller    structured.BufferizeToAllocationOp(
53f167dc4fSIngo Müller        target,
542d3dcd4aSIngo Müller        memory_space=3,
552d3dcd4aSIngo Müller        memcpy_op="memref.copy",
562d3dcd4aSIngo Müller        alloc_op="memref.alloca",
572d3dcd4aSIngo Müller        bufferize_destination_only=True,
582d3dcd4aSIngo Müller    )
592d3dcd4aSIngo Müller    # CHECK-LABEL: TEST: testBufferizeToAllocationOpArgs
602d3dcd4aSIngo Müller    # CHECK: transform.sequence
612d3dcd4aSIngo Müller    # CHECK: transform.structured.bufferize_to_allocation
622d3dcd4aSIngo Müller    # CHECK-SAME: alloc_op = "memref.alloca"
632d3dcd4aSIngo Müller    # CHECK-SAME: bufferize_destination_only
642d3dcd4aSIngo Müller    # CHECK-SAME: memcpy_op = "memref.copy"
652d3dcd4aSIngo Müller    # CHECK-SAME: memory_space = 3
662d3dcd4aSIngo Müller
672d3dcd4aSIngo Müller
682d3dcd4aSIngo Müller@run
69f167dc4fSIngo Müller@create_sequence
70f167dc4fSIngo Müllerdef testDecompose(target):
71f167dc4fSIngo Müller    structured.DecomposeOp(target)
72ce2e198bSAlex Zinenko    # CHECK-LABEL: TEST: testDecompose
73ce2e198bSAlex Zinenko    # CHECK: transform.sequence
74ce2e198bSAlex Zinenko    # CHECK: transform.structured.decompose
75ce2e198bSAlex Zinenko
76ce2e198bSAlex Zinenko
77ce2e198bSAlex Zinenko@run
78f167dc4fSIngo Müller@create_sequence
79f167dc4fSIngo Müllerdef testFuseIntoContainingOpTypes(target):
80f167dc4fSIngo Müller    fused = structured.MatchOp.match_op_names(target, ["test.dummy"])
81f167dc4fSIngo Müller    containing = structured.MatchOp.match_op_names(target, ["test.dummy"])
82cca053c1SIngo Müller    structured.FuseIntoContainingOp(
83cca053c1SIngo Müller        transform.OperationType.get("test.dummy"),
84cca053c1SIngo Müller        transform.OperationType.get("test.dummy"),
85cca053c1SIngo Müller        fused,
86cca053c1SIngo Müller        containing,
87cca053c1SIngo Müller    )
88cca053c1SIngo Müller    # CHECK-LABEL: TEST: testFuseIntoContainingOpTypes
89cca053c1SIngo Müller    # CHECK: = transform.structured.fuse_into_containing_op
90cca053c1SIngo Müller    # CHECK-SAME: (!transform.any_op, !transform.any_op) -> (!transform.op<"test.dummy">, !transform.op<"test.dummy">)
91cca053c1SIngo Müller
92cca053c1SIngo Müller
93cca053c1SIngo Müller@run
94f167dc4fSIngo Müller@create_sequence
95f167dc4fSIngo Müllerdef testFuseIntoContainingOpCompact(target):
96f167dc4fSIngo Müller    fused = structured.MatchOp.match_op_names(target, ["test.dummy"])
97f167dc4fSIngo Müller    containing = structured.MatchOp.match_op_names(target, ["test.dummy"])
98cca053c1SIngo Müller    structured.FuseIntoContainingOp(fused, containing)
99cca053c1SIngo Müller    # CHECK-LABEL: TEST: testFuseIntoContainingOpCompact
100cca053c1SIngo Müller    # CHECK: = transform.structured.fuse_into_containing_op
101cca053c1SIngo Müller    # CHECK-SAME: (!transform.any_op, !transform.any_op) -> (!transform.any_op, !transform.any_op)
102cca053c1SIngo Müller
103cca053c1SIngo Müller
104cca053c1SIngo Müller@run
105f167dc4fSIngo Müller@create_sequence
106*579ced4fSHugo Trachinodef testFuseOpCompact(target):
107*579ced4fSHugo Trachino    structured.FuseOp(
108*579ced4fSHugo Trachino        target, tile_sizes=[4, 8], tile_interchange=[0, 1], apply_cleanup=True
109*579ced4fSHugo Trachino    )
110*579ced4fSHugo Trachino    # CHECK-LABEL: TEST: testFuseOpCompact
111*579ced4fSHugo Trachino    # CHECK: transform.sequence
112*579ced4fSHugo Trachino    # CHECK: %{{.+}}, %{{.+}}:2 = transform.structured.fuse %{{.*}}[4, 8]
113*579ced4fSHugo Trachino    # CHECK-SAME: interchange [0, 1] apply_cleanup = true
114*579ced4fSHugo Trachino    # CHECK-SAME: (!transform.any_op) -> (!transform.any_op, !transform.any_op, !transform.any_op)
115*579ced4fSHugo Trachino
116*579ced4fSHugo Trachino
117*579ced4fSHugo Trachino@run
118*579ced4fSHugo Trachino@create_sequence
119*579ced4fSHugo Trachinodef testFuseOpNoArg(target):
120*579ced4fSHugo Trachino    structured.FuseOp(target)
121*579ced4fSHugo Trachino    # CHECK-LABEL: TEST: testFuseOpNoArg
122*579ced4fSHugo Trachino    # CHECK: transform.sequence
123*579ced4fSHugo Trachino    # CHECK: %{{.+}} = transform.structured.fuse %{{.*}} :
124*579ced4fSHugo Trachino    # CHECK-SAME: (!transform.any_op) -> !transform.any_op
125*579ced4fSHugo Trachino
126*579ced4fSHugo Trachino
127*579ced4fSHugo Trachino@run
128*579ced4fSHugo Trachino@create_sequence
129*579ced4fSHugo Trachinodef testFuseOpAttributes(target):
130*579ced4fSHugo Trachino    attr = DenseI64ArrayAttr.get([4, 8])
131*579ced4fSHugo Trachino    ichange = DenseI64ArrayAttr.get([0, 1])
132*579ced4fSHugo Trachino    structured.FuseOp(target, tile_sizes=attr, tile_interchange=ichange)
133*579ced4fSHugo Trachino    # CHECK-LABEL: TEST: testFuseOpAttributes
134*579ced4fSHugo Trachino    # CHECK: transform.sequence
135*579ced4fSHugo Trachino    # CHECK: %{{.+}}, %{{.+}}:2 = transform.structured.fuse %{{.*}}[4, 8]
136*579ced4fSHugo Trachino    # CHECK-SAME: interchange [0, 1]
137*579ced4fSHugo Trachino    # CHECK-SAME: (!transform.any_op) -> (!transform.any_op, !transform.any_op, !transform.any_op)
138*579ced4fSHugo Trachino
139*579ced4fSHugo Trachino
140*579ced4fSHugo Trachino@run
141*579ced4fSHugo Trachino@create_sequence
142f167dc4fSIngo Müllerdef testGeneralize(target):
143f167dc4fSIngo Müller    structured.GeneralizeOp(target)
144ce2e198bSAlex Zinenko    # CHECK-LABEL: TEST: testGeneralize
145ce2e198bSAlex Zinenko    # CHECK: transform.sequence
146ce2e198bSAlex Zinenko    # CHECK: transform.structured.generalize
147ce2e198bSAlex Zinenko
148ce2e198bSAlex Zinenko
149ce2e198bSAlex Zinenko@run
150f167dc4fSIngo Müller@create_sequence
151f167dc4fSIngo Müllerdef testInterchange(target):
152f167dc4fSIngo Müller    structured.InterchangeOp(target, iterator_interchange=[1, 0])
1533f71765aSAlex Zinenko    # CHECK-LABEL: TEST: testInterchange
1543f71765aSAlex Zinenko    # CHECK: transform.sequence
1553f71765aSAlex Zinenko    # CHECK: transform.structured.interchange
1563f71765aSAlex Zinenko    # CHECK: iterator_interchange = [1, 0]
1573f71765aSAlex Zinenko
1583f71765aSAlex Zinenko
1593f71765aSAlex Zinenko@run
160f167dc4fSIngo Müller@create_sequence
161f167dc4fSIngo Müllerdef testMapCopyToThreadsOpCompact(target):
162a7fdb90bSIngo Müller    structured.MapCopyToThreadsOp(
163f167dc4fSIngo Müller        target, total_num_threads=32, desired_bit_alignment=128
164a7fdb90bSIngo Müller    )
165a7fdb90bSIngo Müller    # CHECK-LABEL: TEST: testMapCopyToThreadsOpCompact
166a7fdb90bSIngo Müller    # CHECK: = transform.structured.gpu.map_copy_to_threads
167a7fdb90bSIngo Müller    # CHECK-SAME: total_num_threads = 32
168a7fdb90bSIngo Müller    # CHECK-SAME: desired_bit_alignment = 128
169a7fdb90bSIngo Müller    # CHECK-SAME:  (!transform.any_op) -> (!transform.any_op, !transform.any_op)
170a7fdb90bSIngo Müller
171a7fdb90bSIngo Müller
172a7fdb90bSIngo Müller@run
173f167dc4fSIngo Müller@create_sequence
174f167dc4fSIngo Müllerdef testMapCopyToThreadsOpTypes(target):
175a7fdb90bSIngo Müller    structured.MapCopyToThreadsOp(
176a7fdb90bSIngo Müller        transform.OperationType.get("test.opA"),
177a7fdb90bSIngo Müller        transform.OperationType.get("test.opB"),
178f167dc4fSIngo Müller        target,
179a7fdb90bSIngo Müller        total_num_threads=32,
180a7fdb90bSIngo Müller        desired_bit_alignment=128,
181a7fdb90bSIngo Müller    )
182a7fdb90bSIngo Müller    # CHECK-LABEL: TEST: testMapCopyToThreadsOpTypes
183a7fdb90bSIngo Müller    # CHECK: = transform.structured.gpu.map_copy_to_threads
184a7fdb90bSIngo Müller    # CHECK-SAME: total_num_threads = 32
185a7fdb90bSIngo Müller    # CHECK-SAME: desired_bit_alignment = 128
186a7fdb90bSIngo Müller    # CHECK-SAME:  (!transform.any_op) -> (!transform.op<"test.opA">, !transform.op<"test.opB">)
187a7fdb90bSIngo Müller
188a7fdb90bSIngo Müller
189a7fdb90bSIngo Müller@run
190f167dc4fSIngo Müller@create_sequence
191f167dc4fSIngo Müllerdef testMatchOpNamesString(target):
192f167dc4fSIngo Müller    structured.MatchOp.match_op_names(target, "test.dummy")
1938fd207fdSIngo Müller    # CHECK-LABEL: TEST: testMatchOpNamesString
1948fd207fdSIngo Müller    # CHECK: transform.structured.match ops
1958fd207fdSIngo Müller    # CHECK-SAME: ["test.dummy"]
1968fd207fdSIngo Müller    # CHECK-SAME: (!transform.any_op) -> !transform.any_op
1978fd207fdSIngo Müller
1988fd207fdSIngo Müller
1998fd207fdSIngo Müller@run
200f167dc4fSIngo Müller@create_sequence
201f167dc4fSIngo Müllerdef testMatchOpNamesList(target):
202f167dc4fSIngo Müller    structured.MatchOp.match_op_names(target, ["test.dummy"])
2038fd207fdSIngo Müller    # CHECK-LABEL: TEST: testMatchOpNamesList
2041dccdf7fSIngo Müller    # CHECK: transform.structured.match ops
2051dccdf7fSIngo Müller    # CHECK-SAME: ["test.dummy"]
2061dccdf7fSIngo Müller    # CHECK-SAME: (!transform.any_op) -> !transform.any_op
2071dccdf7fSIngo Müller
2081dccdf7fSIngo Müller
2091dccdf7fSIngo Müller@run
210f167dc4fSIngo Müller@create_sequence
21169bc1cbbSIngo Müllerdef testVectorizeNoArgs(target):
21269bc1cbbSIngo Müller    structured.VectorizeOp(target)
21369bc1cbbSIngo Müller    # CHECK-LABEL: TEST: testVectorizeNoArgs
21486ddbdd3SIngo Müller    # CHECK: transform.sequence
21569bc1cbbSIngo Müller    # CHECK: transform.structured.vectorize
21686ddbdd3SIngo Müller    # CHECK-NOT:     vector_sizes
21786ddbdd3SIngo Müller
21886ddbdd3SIngo Müller
2196464a016SIngo Müller@run
2206464a016SIngo Müller@create_sequence
22169bc1cbbSIngo Müllerdef testVectorizeStatic(target):
22269bc1cbbSIngo Müller    structured.VectorizeOp(target, [16, 4])
22369bc1cbbSIngo Müller    # CHECK-LABEL: TEST: testVectorizeStatic
224dac19b45SIngo Müller    # CHECK: transform.sequence
22569bc1cbbSIngo Müller    # CHECK: transform.structured.vectorize
226dac19b45SIngo Müller    # CHECK-SAME:     vector_sizes [16, 4]
227dac19b45SIngo Müller
228dac19b45SIngo Müller
229dac19b45SIngo Müller@run
230f167dc4fSIngo Müller@create_sequence
23169bc1cbbSIngo Müllerdef testVectorizeArray(target):
232dac19b45SIngo Müller    sizes = Attribute.parse("[16, 4]")
23369bc1cbbSIngo Müller    structured.VectorizeOp(target, sizes)
23469bc1cbbSIngo Müller    # CHECK-LABEL: TEST: testVectorizeArray
235dac19b45SIngo Müller    # CHECK: transform.sequence
23669bc1cbbSIngo Müller    # CHECK: transform.structured.vectorize
237dac19b45SIngo Müller    # CHECK-SAME:     vector_sizes [16, 4]
238dac19b45SIngo Müller
239dac19b45SIngo Müller
240dac19b45SIngo Müller@run
241f167dc4fSIngo Müller@create_sequence
24269bc1cbbSIngo Müllerdef testVectorizeMixed(target):
243f167dc4fSIngo Müller    sz1 = structured.MatchOp.match_op_names(target, ["arith.constant"])
244dac19b45SIngo Müller    sz2 = Attribute.parse("4")
24569bc1cbbSIngo Müller    structured.VectorizeOp(target, [sz1, sz2])
24669bc1cbbSIngo Müller    # CHECK-LABEL: TEST: testVectorizeMixed
247dac19b45SIngo Müller    # CHECK: transform.sequence
248dac19b45SIngo Müller    # CHECK: %[[V0:.*]] = transform.structured.match
24969bc1cbbSIngo Müller    # CHECK: transform.structured.vectorize
250b79db396Ssrcarroll    # CHECK-SAME:     vector_sizes [%[[V0]], 4]
251b79db396Ssrcarroll
252b79db396Ssrcarroll
253b79db396Ssrcarroll@run
254b79db396Ssrcarroll@create_sequence
255b79db396Ssrcarrolldef testVectorizeEmpty(target):
256b79db396Ssrcarroll    structured.VectorizeOp(target, [])
257b79db396Ssrcarroll    # CHECK-LABEL: TEST: testVectorizeEmpty
258b79db396Ssrcarroll    # CHECK: transform.sequence
259b79db396Ssrcarroll    # CHECK: transform.structured.vectorize
260b79db396Ssrcarroll    # CHECK-NOT:     vector_sizes
261dac19b45SIngo Müller
262dac19b45SIngo Müller
263dac19b45SIngo Müller@run
264f167dc4fSIngo Müller@create_sequence
26569bc1cbbSIngo Müllerdef testVectorizeScalable(target):
266f167dc4fSIngo Müller    sz1 = structured.MatchOp.match_op_names(target, ["arith.constant"])
267dac19b45SIngo Müller    sz2 = Attribute.parse("4")
26869bc1cbbSIngo Müller    structured.VectorizeOp(target, [16, [sz1], [sz2], [8]])
26969bc1cbbSIngo Müller    # CHECK-LABEL: TEST: testVectorizeScalable
270dac19b45SIngo Müller    # CHECK: transform.sequence
271dac19b45SIngo Müller    # CHECK-DAG: %[[V0:.*]] = transform.structured.match
27269bc1cbbSIngo Müller    # CHECK-DAG: transform.structured.vectorize
273b79db396Ssrcarroll    # CHECK-SAME:     vector_sizes [16, [%[[V0]]], [4], [8]]
274dac19b45SIngo Müller
275dac19b45SIngo Müller
276dac19b45SIngo Müller@run
277f167dc4fSIngo Müller@create_sequence
27869bc1cbbSIngo Müllerdef testVectorizeArgs(target):
27969bc1cbbSIngo Müller    structured.VectorizeOp(target, [16, 4], vectorize_nd_extract=True)
28069bc1cbbSIngo Müller    # CHECK-LABEL: TEST: testVectorizeArgs
281dac19b45SIngo Müller    # CHECK: transform.sequence
28269bc1cbbSIngo Müller    # CHECK: transform.structured.vectorize
283dac19b45SIngo Müller    # CHECK-SAME: vectorize_nd_extract
284dac19b45SIngo Müller
285dac19b45SIngo Müller
286dac19b45SIngo Müller@run
287f167dc4fSIngo Müller@create_sequence
288f167dc4fSIngo Müllerdef testMatchOpNamesTyped(target):
2891dccdf7fSIngo Müller    structured.MatchOp.match_op_names(
2901dccdf7fSIngo Müller        transform.OperationType.get("test.dummy"),
291f167dc4fSIngo Müller        target,
2921dccdf7fSIngo Müller        ["test.dummy"],
2931dccdf7fSIngo Müller    )
2941dccdf7fSIngo Müller    # CHECK-LABEL: TEST: testMatchOpNamesTyped
2951dccdf7fSIngo Müller    # CHECK: transform.structured.match ops
2961dccdf7fSIngo Müller    # CHECK-SAME: ["test.dummy"]
2971dccdf7fSIngo Müller    # CHECK-SAME: (!transform.any_op) -> !transform.op<"test.dummy">
2981dccdf7fSIngo Müller
2991dccdf7fSIngo Müller
3001dccdf7fSIngo Müller@run
301f167dc4fSIngo Müller@create_sequence
302f167dc4fSIngo Müllerdef testMultitileSizesCompact(target):
303f9008e63STobias Hieta    structured.MultiTileSizesOp(
304f167dc4fSIngo Müller        transform.AnyOpType.get(), target, dimension=1, target_size=42
305f9008e63STobias Hieta    )
3063963b4d0SAlex Zinenko    # CHECK-LABEL: TEST: testMultitileSizes
3073963b4d0SAlex Zinenko    # CHECK: transform.sequence
30833278321SIngo Müller    # CHECK-NOT: divisor
30933278321SIngo Müller    # CHECK: transform.structured.multitile_sizes
31033278321SIngo Müller    # CHECK-NOT: divisor
31133278321SIngo Müller    # CHECK-DAG: dimension = 1
31233278321SIngo Müller    # CHECK-NOT: divisor
31333278321SIngo Müller    # CHECK-DAG: target_size = 42
31433278321SIngo Müller    # CHECK-NOT: divisor
31533278321SIngo Müller
31633278321SIngo Müller
31733278321SIngo Müller@run
318f167dc4fSIngo Müller@create_sequence
319f167dc4fSIngo Müllerdef testMultitileSizesAllArgs(target):
32033278321SIngo Müller    structured.MultiTileSizesOp(
321f167dc4fSIngo Müller        transform.AnyOpType.get(),
322f167dc4fSIngo Müller        target,
32333278321SIngo Müller        dimension=1,
32433278321SIngo Müller        target_size=42,
32533278321SIngo Müller        divisor=2,
32633278321SIngo Müller    )
32733278321SIngo Müller    # CHECK-LABEL: TEST: testMultitileSizes
32833278321SIngo Müller    # CHECK: transform.sequence
3293963b4d0SAlex Zinenko    # CHECK: transform.structured.multitile_sizes
3303963b4d0SAlex Zinenko    # CHECK-DAG: dimension = 1
33133278321SIngo Müller    # CHECK-DAG: divisor = 2
3323963b4d0SAlex Zinenko    # CHECK-DAG: target_size = 42
3333963b4d0SAlex Zinenko
3343963b4d0SAlex Zinenko
3353963b4d0SAlex Zinenko@run
336f167dc4fSIngo Müller@create_sequence
337f167dc4fSIngo Müllerdef testPadOpNoArgs(target):
338f167dc4fSIngo Müller    structured.PadOp(target)
3399442b441SIngo Müller    # CHECK-LABEL: TEST: testPadOpNoArgs
3409442b441SIngo Müller    # CHECK: transform.sequence
3419442b441SIngo Müller    # CHECK: transform.structured.pad
3429442b441SIngo Müller    # CHECK-NOT: copy_back_op
343a758bcdbSAndrzej Warzyński    # CHECK-NOT: nofold_flags
3449442b441SIngo Müller    # CHECK-NOT: pad_to_multiple_of
3459442b441SIngo Müller    # CHECK-NOT: padding_dimensions
3469442b441SIngo Müller    # CHECK-NOT: padding_values
3479442b441SIngo Müller    # CHECK-NOT: transpose_paddings
3489442b441SIngo Müller
3499442b441SIngo Müller
3509442b441SIngo Müller@run
351f167dc4fSIngo Müller@create_sequence
352f167dc4fSIngo Müllerdef testPadOpArgs(target):
3533f71765aSAlex Zinenko    structured.PadOp(
354f167dc4fSIngo Müller        target,
355f2f65eddSsrcarroll        pad_to_multiple_of=[128],
3569442b441SIngo Müller        padding_values=[FloatAttr.get_f32(42.0), StringAttr.get("0")],
35757c090b2SIngo Müller        padding_dimensions=Attribute.parse("[1]"),
358a758bcdbSAndrzej Warzyński        nofold_flags=[0],
35957c090b2SIngo Müller        transpose_paddings=[[1, Attribute.parse("0")], Attribute.parse("[0, 1]")],
36057c090b2SIngo Müller        copy_back_op="linalg.copy",
361f9008e63STobias Hieta    )
3629442b441SIngo Müller    # CHECK-LABEL: TEST: testPadOpArgs
3633f71765aSAlex Zinenko    # CHECK: transform.sequence
3643f71765aSAlex Zinenko    # CHECK: transform.structured.pad
365f2f65eddSsrcarroll    # CHECK-DAG: pad_to_multiple_of [128]
36657c090b2SIngo Müller    # CHECK-DAG: copy_back_op = "linalg.copy"
367a758bcdbSAndrzej Warzyński    # CHECK-DAG: nofold_flags = [0]
3683f71765aSAlex Zinenko    # CHECK-DAG: padding_dimensions = [1]
3696ff7ef43SIngo Müller    # CHECK-DAG: padding_values = [4.200000e+01 : f32, "0"]
37057c090b2SIngo Müller    # CHECK-DAG: transpose_paddings = {{\[}}[1, 0], [0, 1]]
3713f71765aSAlex Zinenko
372f9008e63STobias Hieta
3733f71765aSAlex Zinenko@run
374f167dc4fSIngo Müller@create_sequence
375f2f65eddSsrcarrolldef testPadOpArgsParam(target):
376f2f65eddSsrcarroll    structured.PadOp(
377f2f65eddSsrcarroll        target,
378f2f65eddSsrcarroll        pad_to_multiple_of=[constant_param(128), Attribute.parse("2"), 10],
379f2f65eddSsrcarroll        padding_dimensions=Attribute.parse("[0, 1, 2]"),
380f2f65eddSsrcarroll    )
381f2f65eddSsrcarroll    # CHECK-LABEL: TEST: testPadOpArgsParam
382f2f65eddSsrcarroll    # CHECK: transform.sequence
383f2f65eddSsrcarroll    # CHECK-DAG: %[[P:.*]] = transform.param.constant 128
384f2f65eddSsrcarroll    # CHECK: transform.structured.pad
385f2f65eddSsrcarroll    # CHECK-DAG: pad_to_multiple_of [%[[P]], 2, 10]
386f2f65eddSsrcarroll    # CHECK-DAG: padding_dimensions = [0, 1, 2]
387f2f65eddSsrcarroll
388f2f65eddSsrcarroll
389f2f65eddSsrcarroll@run
390f2f65eddSsrcarroll@create_sequence
391f167dc4fSIngo Müllerdef testScalarize(target):
392f167dc4fSIngo Müller    structured.ScalarizeOp(target)
3933f71765aSAlex Zinenko    # CHECK-LABEL: TEST: testScalarize
3943f71765aSAlex Zinenko    # CHECK: transform.structured.scalarize
3953f71765aSAlex Zinenko
3963f71765aSAlex Zinenko
3973f71765aSAlex Zinenko@run
398f167dc4fSIngo Müller@create_sequence
399f167dc4fSIngo Müllerdef testSplit(target):
400618f231aSJinyun (Joey) Ye    handle = structured.SplitOp(target, dimension=1, chunk_sizes=42)
401618f231aSJinyun (Joey) Ye    split = transform.SplitHandleOp(
402618f231aSJinyun (Joey) Ye        [transform.AnyOpType.get(), transform.AnyOpType.get()], handle
403618f231aSJinyun (Joey) Ye    )
404a9efcbf4Smuneebkhan85    structured.SplitOp(split.results[0], dimension=3, chunk_sizes=split.results[1])
405ff6e5508SAlex Zinenko    # CHECK-LABEL: TEST: testSplit
406618f231aSJinyun (Joey) Ye    # CHECK: %[[G:.+]] = transform.structured.split %{{.*}} after 42 {dimension = 1
407618f231aSJinyun (Joey) Ye    # CHECK: %[[F:.+]]:2 = split_handle %[[G]]
408618f231aSJinyun (Joey) Ye    # CHECK: transform.structured.split %[[F]]#0 after %[[F]]#1 {dimension = 3
409ff6e5508SAlex Zinenko
410f9008e63STobias Hieta
411ff6e5508SAlex Zinenko@run
412f167dc4fSIngo Müller@create_sequence
413f167dc4fSIngo Müllerdef testTileCompact(target):
41496ff0255SOleksandr "Alex" Zinenko    structured.TileUsingForOp(target, sizes=[4, 8], interchange=[0, 1])
4153f71765aSAlex Zinenko    # CHECK-LABEL: TEST: testTileCompact
4163f71765aSAlex Zinenko    # CHECK: transform.sequence
41796ff0255SOleksandr "Alex" Zinenko    # CHECK: %{{.+}}, %{{.+}}:2 = transform.structured.tile_using_for %{{.*}}[4, 8]
4184e4a4c05SAlex Zinenko    # CHECK: interchange = [0, 1]
4193f71765aSAlex Zinenko
420f9008e63STobias Hieta
4213f71765aSAlex Zinenko@run
422f167dc4fSIngo Müller@create_sequence
423f167dc4fSIngo Müllerdef testTileAttributes(target):
424a9733b8aSLorenzo Chelini    attr = DenseI64ArrayAttr.get([4, 8])
425a9733b8aSLorenzo Chelini    ichange = DenseI64ArrayAttr.get([0, 1])
42696ff0255SOleksandr "Alex" Zinenko    structured.TileUsingForOp(target, sizes=attr, interchange=ichange)
4273f71765aSAlex Zinenko    # CHECK-LABEL: TEST: testTileAttributes
4283f71765aSAlex Zinenko    # CHECK: transform.sequence
42996ff0255SOleksandr "Alex" Zinenko    # CHECK: %{{.+}}, %{{.+}}:2 = transform.structured.tile_using_for %{{.*}}[4, 8]
4304e4a4c05SAlex Zinenko    # CHECK: interchange = [0, 1]
4313f71765aSAlex Zinenko
432f9008e63STobias Hieta
4333f71765aSAlex Zinenko@run
434f167dc4fSIngo Müller@create_sequence
435f167dc4fSIngo Müllerdef testTileZero(target):
43696ff0255SOleksandr "Alex" Zinenko    structured.TileUsingForOp(target, sizes=[4, 0, 2, 0], interchange=[0, 1, 2, 3])
4373f71765aSAlex Zinenko    # CHECK-LABEL: TEST: testTileZero
4383f71765aSAlex Zinenko    # CHECK: transform.sequence
43996ff0255SOleksandr "Alex" Zinenko    # CHECK: %{{.+}}, %{{.+}}:2 = transform.structured.tile_using_for %{{.*}}[4, 0, 2, 0]
4404e4a4c05SAlex Zinenko    # CHECK: interchange = [0, 1, 2, 3]
4414e4a4c05SAlex Zinenko
442f9008e63STobias Hieta
4434e4a4c05SAlex Zinenko@run
4444e4a4c05SAlex Zinenkodef testTileDynamic():
44594d608d4SAlex Zinenko    with_pdl = transform_pdl.WithPDLPatternsOp(pdl.OperationType.get())
4464e4a4c05SAlex Zinenko    with InsertionPoint(with_pdl.body):
447f9008e63STobias Hieta        sequence = transform.SequenceOp(
44892233062Smax            transform.FailurePropagationMode.Propagate, [], with_pdl.bodyTarget
449f9008e63STobias Hieta        )
4504e4a4c05SAlex Zinenko        with InsertionPoint(sequence.body):
451f9008e63STobias Hieta            m1 = transform_pdl.PDLMatchOp(
452f9008e63STobias Hieta                pdl.OperationType.get(), sequence.bodyTarget, "first"
453f9008e63STobias Hieta            )
454f9008e63STobias Hieta            m2 = transform_pdl.PDLMatchOp(
455f9008e63STobias Hieta                pdl.OperationType.get(), sequence.bodyTarget, "second"
456f9008e63STobias Hieta            )
45796ff0255SOleksandr "Alex" Zinenko            structured.TileUsingForOp(sequence.bodyTarget, sizes=[m1, 3, m2, 0])
4584e4a4c05SAlex Zinenko            transform.YieldOp()
4594e4a4c05SAlex Zinenko    # CHECK-LABEL: TEST: testTileDynamic
4604e4a4c05SAlex Zinenko    # CHECK: %[[FIRST:.+]] = pdl_match
4614e4a4c05SAlex Zinenko    # CHECK: %[[SECOND:.+]] = pdl_match
46296ff0255SOleksandr "Alex" Zinenko    # CHECK: %{{.+}}, %{{.+}}:3 = transform.structured.tile_using_for %{{.*}}[%[[FIRST]], 3, %[[SECOND]], 0]
4633f71765aSAlex Zinenko
4643f71765aSAlex Zinenko
4653f71765aSAlex Zinenko@run
466f167dc4fSIngo Müller@create_sequence
467f167dc4fSIngo Müllerdef testTileExplicitLoopTypeSingle(target):
46896ff0255SOleksandr "Alex" Zinenko    structured.TileUsingForOp(
46996ff0255SOleksandr "Alex" Zinenko        transform.OperationType.get("scf.for"), target, sizes=[2, 3, 4]
47096ff0255SOleksandr "Alex" Zinenko    )
47188c5027bSAlex Zinenko    # CHECK-LABEL: TEST: testTileExplicitLoopTypeSingle
47296ff0255SOleksandr "Alex" Zinenko    # CHECK: = transform.structured.tile_using_for %{{.*}} : (!{{.*}}) ->
47388c5027bSAlex Zinenko    # CHECK-COUNT-3: !transform.op<"scf.for">
47488c5027bSAlex Zinenko
47588c5027bSAlex Zinenko
47688c5027bSAlex Zinenko@run
477f167dc4fSIngo Müller@create_sequence
478f167dc4fSIngo Müllerdef testTileExplicitLoopTypeAll(target):
47988c5027bSAlex Zinenko    types = [
48088c5027bSAlex Zinenko        transform.OperationType.get(x)
481eb2f946eSAlexander Belyaev        for x in ["scf.for", "scf.parallel", "scf.forall"]
48288c5027bSAlex Zinenko    ]
48396ff0255SOleksandr "Alex" Zinenko    structured.TileUsingForOp(types, target, sizes=[2, 3, 4])
48488c5027bSAlex Zinenko    # CHECK-LABEL: TEST: testTileExplicitLoopTypeAll
48588c5027bSAlex Zinenko    # CHECK: = transform.structured.tile
48688c5027bSAlex Zinenko    # CHECK-SAME: (!transform.any_op) -> (!transform.any_op, !transform.op<"scf.for">,
487eb2f946eSAlexander Belyaev    # CHECK-SAME: !transform.op<"scf.parallel">, !transform.op<"scf.forall">
48888c5027bSAlex Zinenko
489f9008e63STobias Hieta
49088c5027bSAlex Zinenko@run
491f167dc4fSIngo Müller@create_sequence
492f167dc4fSIngo Müllerdef testTileScalable(target):
49396ff0255SOleksandr "Alex" Zinenko    structured.TileUsingForOp(
494f167dc4fSIngo Müller        target,
495ea4a5127SIngo Müller        sizes=[4, [2]],
496ea4a5127SIngo Müller    )
497ea4a5127SIngo Müller    # CHECK-LABEL: TEST: testTileScalable
498ea4a5127SIngo Müller    # CHECK: transform.sequence
49996ff0255SOleksandr "Alex" Zinenko    # CHECK: %{{.+}}, %{{.+}}:2 = transform.structured.tile_using_for %{{.*}}[4, [2]]
500ea4a5127SIngo Müller
501ea4a5127SIngo Müller
502ea4a5127SIngo Müller@run
503f167dc4fSIngo Müller@create_sequence
504f167dc4fSIngo Müllerdef testTileToForallCompact(target):
505f167dc4fSIngo Müller    matmul = transform.CastOp(transform.OperationType.get("linalg.matmul"), target)
50696ff0255SOleksandr "Alex" Zinenko    structured.TileUsingForallOp(matmul, num_threads=[2, 3, 4])
507be6e9df1SIngo Müller    # CHECK-LABEL: TEST: testTileToForallCompact
50896ff0255SOleksandr "Alex" Zinenko    # CHECK: = transform.structured.tile_using_forall
509f54dc7b3SBenjamin Maxwell    # CHECK-SAME: num_threads [2, 3, 4]
510be6e9df1SIngo Müller    # CHECK-SAME: (!transform.op<"linalg.matmul">) -> (!transform.any_op, !transform.any_op)
511be6e9df1SIngo Müller
512be6e9df1SIngo Müller
513be6e9df1SIngo Müller@run
514f167dc4fSIngo Müller@create_sequence
515f167dc4fSIngo Müllerdef testTileToForallLoopsAndTileOpTypes(target):
51696ff0255SOleksandr "Alex" Zinenko    structured.TileUsingForallOp(
517be6e9df1SIngo Müller        transform.OperationType.get("scf.forall"),  # loops_type
518be6e9df1SIngo Müller        transform.OperationType.get("linalg.matmul"),  # tiled_op_type
519f167dc4fSIngo Müller        target,
520be6e9df1SIngo Müller        num_threads=[2, 3, 4],
521be6e9df1SIngo Müller    )
522be6e9df1SIngo Müller    # CHECK-LABEL: TEST: testTileToForallLoopsAndTileOpTypes
52396ff0255SOleksandr "Alex" Zinenko    # CHECK: = transform.structured.tile_using_forall
524f54dc7b3SBenjamin Maxwell    # CHECK-SAME: num_threads [2, 3, 4]
525be6e9df1SIngo Müller    # CHECK-SAME: (!transform.any_op) -> (!transform.op<"scf.forall">, !transform.op<"linalg.matmul">)
526be6e9df1SIngo Müller
527be6e9df1SIngo Müller
528be6e9df1SIngo Müller@run
529f167dc4fSIngo Müller@create_sequence
530f167dc4fSIngo Müllerdef testTileToForallTileSizes(target):
53196ff0255SOleksandr "Alex" Zinenko    structured.TileUsingForallOp(target, tile_sizes=[2, 3, 4])
532be6e9df1SIngo Müller    # CHECK-LABEL: TEST: testTileToForallTileSizes
53396ff0255SOleksandr "Alex" Zinenko    # CHECK: = transform.structured.tile_using_forall
534f54dc7b3SBenjamin Maxwell    # CHECK-SAME: tile_sizes [2, 3, 4]
535be6e9df1SIngo Müller
536be6e9df1SIngo Müller
537be6e9df1SIngo Müller@run
538f167dc4fSIngo Müller@create_sequence
539f167dc4fSIngo Müllerdef testTileToForallMixedDynamic(target):
540f167dc4fSIngo Müller    n = structured.MatchOp.match_op_names(target, ["test.dummy"])
54196ff0255SOleksandr "Alex" Zinenko    structured.TileUsingForallOp(target, num_threads=[n, 3, 4])
542be6e9df1SIngo Müller    # CHECK-LABEL: TEST: testTileToForallMixedDynamic
54396ff0255SOleksandr "Alex" Zinenko    # CHECK: = transform.structured.tile_using_forall
5442c1c6767Ssrcarroll    # CHECK-SAME: num_threads [%{{.*}}, 3, 4] : (!transform.any_op, !transform.any_op)
545be6e9df1SIngo Müller
546be6e9df1SIngo Müller
547be6e9df1SIngo Müller@run
548f167dc4fSIngo Müller@create_sequence
549f167dc4fSIngo Müllerdef testTileToForallPackedDynamic(target):
550f167dc4fSIngo Müller    n = structured.MatchOp.match_op_names(target, ["test.dummy"])
55196ff0255SOleksandr "Alex" Zinenko    structured.TileUsingForallOp(target, num_threads=n)
552a48d8c23SIngo Müller    # CHECK-LABEL: TEST: testTileToForallPackedDynamic
55396ff0255SOleksandr "Alex" Zinenko    # CHECK: = transform.structured.tile_using_forall
5542c1c6767Ssrcarroll    # CHECK-SAME: num_threads *(%0) : (!transform.any_op, !transform.any_op)
555be6e9df1SIngo Müller
556be6e9df1SIngo Müller
557be6e9df1SIngo Müller@run
558f167dc4fSIngo Müller@create_sequence
559f167dc4fSIngo Müllerdef testTileToForallMapping(target):
560be6e9df1SIngo Müller    mapping = Attribute.parse("[ #gpu.thread<y>, #gpu.thread<x> ]")
56196ff0255SOleksandr "Alex" Zinenko    structured.TileUsingForallOp(target, num_threads=[2, 3], mapping=mapping)
562be6e9df1SIngo Müller    # CHECK-LABEL: TEST: testTileToForallMapping
56396ff0255SOleksandr "Alex" Zinenko    # CHECK: = transform.structured.tile_using_forall
564be6e9df1SIngo Müller    # CHECK-SAME: mapping = [#gpu.thread<y>, #gpu.thread<x>]
565be6e9df1SIngo Müller
566be6e9df1SIngo Müller
567be6e9df1SIngo Müller@run
568f167dc4fSIngo Müller@create_sequence
56969bc1cbbSIngo Müllerdef testVectorizeChildrenAndApplyPatternsAllAttrs(target):
57069bc1cbbSIngo Müller    structured.VectorizeChildrenAndApplyPatternsOp(
571f167dc4fSIngo Müller        target,
572a470df3fSIngo Müller        disable_multi_reduction_to_contract_patterns=True,
573a470df3fSIngo Müller        disable_transfer_permutation_map_lowering_patterns=True,
574a470df3fSIngo Müller        vectorize_nd_extract=True,
575a470df3fSIngo Müller        vectorize_padding=True,
576a470df3fSIngo Müller    )
57769bc1cbbSIngo Müller    # CHECK-LABEL: TEST: testVectorizeChildrenAndApplyPatternsAllAttrs
5783f71765aSAlex Zinenko    # CHECK: transform.sequence
579015cd84dSNicolas Vasilache    # CHECK: = transform.structured.vectorize
580a470df3fSIngo Müller    # CHECK-SAME: disable_multi_reduction_to_contract_patterns
581a470df3fSIngo Müller    # CHECK-SAME: disable_transfer_permutation_map_lowering_patterns
582a470df3fSIngo Müller    # CHECK-SAME: vectorize_nd_extract
583a470df3fSIngo Müller    # CHECK-SAME: vectorize_padding
584a470df3fSIngo Müller
585a470df3fSIngo Müller
586a470df3fSIngo Müller@run
587f167dc4fSIngo Müller@create_sequence
58869bc1cbbSIngo Müllerdef testVectorizeChildrenAndApplyPatternsNoAttrs(target):
58969bc1cbbSIngo Müller    structured.VectorizeChildrenAndApplyPatternsOp(
590f167dc4fSIngo Müller        target,
591a470df3fSIngo Müller        disable_multi_reduction_to_contract_patterns=False,
592a470df3fSIngo Müller        disable_transfer_permutation_map_lowering_patterns=False,
593a470df3fSIngo Müller        vectorize_nd_extract=False,
594a470df3fSIngo Müller        vectorize_padding=False,
595a470df3fSIngo Müller    )
59669bc1cbbSIngo Müller    # CHECK-LABEL: TEST: testVectorizeChildrenAndApplyPatternsNoAttrs
597a470df3fSIngo Müller    # CHECK: transform.sequence
598a470df3fSIngo Müller    # CHECK: = transform.structured.vectorize
599a470df3fSIngo Müller    # CHECK-NOT: disable_multi_reduction_to_contract_patterns
600a470df3fSIngo Müller    # CHECK-NOT: disable_transfer_permutation_map_lowering_patterns
601a470df3fSIngo Müller    # CHECK-NOT: vectorize_nd_extract
602a470df3fSIngo Müller    # CHECK-NOT: vectorize_padding
60392233062Smax
60492233062Smax
60592233062Smax@run
606f167dc4fSIngo Müller@create_sequence
607f167dc4fSIngo Müllerdef testMatchInterfaceEnum(target):
60892233062Smax    names = ArrayAttr.get([StringAttr.get("test.dummy")])
60992233062Smax    result_type = transform.AnyOpType.get()
61092233062Smax    fused = structured.MatchOp.__base__(
61192233062Smax        result_type,
612f167dc4fSIngo Müller        target,
61392233062Smax        ops=names,
61492233062Smax        interface=structured.MatchInterfaceEnum.LinalgOp,
61592233062Smax    )
61692233062Smax    # CHECK-LABEL: TEST: testMatchInterfaceEnum
61792233062Smax    # CHECK: transform.sequence
61892233062Smax    # CHECK: = transform.structured.match
61992233062Smax    # CHECK: interface{LinalgOp}
62092233062Smax
62192233062Smax
62292233062Smax@run
623f167dc4fSIngo Müller@create_sequence
624f167dc4fSIngo Müllerdef testMatchInterfaceEnumReplaceAttributeBuilder(target):
62592233062Smax    @register_attribute_builder("MatchInterfaceEnum", replace=True)
62692233062Smax    def match_interface_enum(x, context):
62792233062Smax        if x == "LinalgOp":
62892233062Smax            y = 0
62992233062Smax        elif x == "TilingInterface":
63092233062Smax            y = 1
63192233062Smax        return IntegerAttr.get(IntegerType.get_signless(32, context=context), y)
63292233062Smax
63392233062Smax    names = ArrayAttr.get([StringAttr.get("test.dummy")])
63492233062Smax    result_type = transform.AnyOpType.get()
63592233062Smax    fused = structured.MatchOp.__base__(
63692233062Smax        result_type,
637f167dc4fSIngo Müller        target,
63892233062Smax        ops=names,
63992233062Smax        interface="TilingInterface",
64092233062Smax    )
64192233062Smax    # CHECK-LABEL: TEST: testMatchInterfaceEnumReplaceAttributeBuilder
64292233062Smax    # CHECK: transform.sequence
64392233062Smax    # CHECK: = transform.structured.match
64492233062Smax    # CHECK: interface{TilingInterface}
645