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