xref: /llvm-project/mlir/test/lib/Interfaces/TilingInterface/TestTilingInterfaceTransformOps.td (revision 9bc3102bea80f422f4f3b788186f6e1c636e0fba)
1aa2a96a2SMaheshRavishankar//===- TestTilingInterfaceTransformOps.td -----------------*- tablegen -*-===//
2aa2a96a2SMaheshRavishankar//
3aa2a96a2SMaheshRavishankar// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4aa2a96a2SMaheshRavishankar// See https://llvm.org/LICENSE.txt for license information.
5aa2a96a2SMaheshRavishankar// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6aa2a96a2SMaheshRavishankar//
7aa2a96a2SMaheshRavishankar//===----------------------------------------------------------------------===//
8aa2a96a2SMaheshRavishankar
9aa2a96a2SMaheshRavishankar#ifndef TEST_TILINGINTERFACE_TRANSFORM_OPS
10aa2a96a2SMaheshRavishankar#define TEST_TILINGINTERFACE_TRANSFORM_OPS
11aa2a96a2SMaheshRavishankar
12aa2a96a2SMaheshRavishankarinclude "mlir/Dialect/SCF/IR/DeviceMappingInterface.td"
13aa2a96a2SMaheshRavishankarinclude "mlir/Dialect/Transform/IR/TransformDialect.td"
145a9bdd85SOleksandr "Alex" Zinenkoinclude "mlir/Dialect/Transform/Interfaces/TransformInterfaces.td"
15aa2a96a2SMaheshRavishankarinclude "mlir/Dialect/Transform/IR/TransformTypes.td"
16aa2a96a2SMaheshRavishankarinclude "mlir/Interfaces/SideEffectInterfaces.td"
17aa2a96a2SMaheshRavishankarinclude "mlir/IR/OpBase.td"
18aa2a96a2SMaheshRavishankar
19aa2a96a2SMaheshRavishankar// Those operations in this file are meant for testing the tiling interface
20aa2a96a2SMaheshRavishankar// transformations using scf operations. Over time these testing options
21aa2a96a2SMaheshRavishankar// might be useful transformations in their own right. Move these over
22aa2a96a2SMaheshRavishankar// as transform ops in the main repo (also find a proper place for them)
23aa2a96a2SMaheshRavishankar
24aa2a96a2SMaheshRavishankardef TestFuseAndYieldOp : Op<Transform_Dialect, "test.fuse_and_yield",
25aa2a96a2SMaheshRavishankar  [FunctionalStyleTransformOpTrait, MemoryEffectsOpInterface,
26aa2a96a2SMaheshRavishankar   DeclareOpInterfaceMethods<TransformOpInterface>,
27aa2a96a2SMaheshRavishankar   ReportTrackingListenerFailuresOpTrait]> {
28aa2a96a2SMaheshRavishankar  let description = [{
29aa2a96a2SMaheshRavishankar    Tiles the operations pointed to by the target handle, fuses their
30aa2a96a2SMaheshRavishankar    producers greedily using the options provided as attributes.
31aa2a96a2SMaheshRavishankar    It also yields some of the fused producers for testing.
32aa2a96a2SMaheshRavishankar
33aa2a96a2SMaheshRavishankar    On success returns the tiled operations as well as generated loops. Emits
34aa2a96a2SMaheshRavishankar    a definite failure if tiling fails.
35aa2a96a2SMaheshRavishankar  }];
36aa2a96a2SMaheshRavishankar
37aa2a96a2SMaheshRavishankar  let arguments =
38aa2a96a2SMaheshRavishankar    (ins TransformHandleTypeInterface:$target,
39aa2a96a2SMaheshRavishankar        DefaultValuedAttr<I64ArrayAttr, "{}">:$tile_sizes,
4076ead96cSMaheshRavishankar        DefaultValuedAttr<I64ArrayAttr, "{}">:$tile_interchange,
4176ead96cSMaheshRavishankar        DefaultValuedAttr<BoolAttr, "false">:$use_forall);
42aa2a96a2SMaheshRavishankar  let results = (outs TransformHandleTypeInterface:$transfomed,
43aa2a96a2SMaheshRavishankar      Variadic<TransformHandleTypeInterface>:$loops);
44aa2a96a2SMaheshRavishankar
45aa2a96a2SMaheshRavishankar  let assemblyFormat = [{
46aa2a96a2SMaheshRavishankar    $target ($tile_sizes^)? (`interchange` $tile_interchange^)?
4776ead96cSMaheshRavishankar    (`use_forall` $use_forall^)? attr-dict
4876ead96cSMaheshRavishankar    `:` functional-type(operands, results)
49aa2a96a2SMaheshRavishankar  }];
50aa2a96a2SMaheshRavishankar}
51aa2a96a2SMaheshRavishankar
522b2ce50fSAbhishek Varmadef TestFuseConsumerOp : Op<Transform_Dialect, "test.fuse_consumer",
532b2ce50fSAbhishek Varma       [DeclareOpInterfaceMethods<TransformOpInterface>,
542b2ce50fSAbhishek Varma        DeclareOpInterfaceMethods<MemoryEffectsOpInterface>,
552b2ce50fSAbhishek Varma        ReportTrackingListenerFailuresOpTrait]> {
562b2ce50fSAbhishek Varma  let description = [{
572b2ce50fSAbhishek Varma    Fuses the consumer of the operation pointed to by the target handle
582b2ce50fSAbhishek Varma    using the options provided as attributes.
592b2ce50fSAbhishek Varma  }];
602b2ce50fSAbhishek Varma
612b2ce50fSAbhishek Varma  let arguments =
62*9bc3102bSYun-Fly    (ins TransformHandleTypeInterface:$target,
63*9bc3102bSYun-Fly        DefaultValuedAttr<I32Attr, "1">:$num_consumer_to_fuse);
642b2ce50fSAbhishek Varma  let results = (outs TransformHandleTypeInterface:$consumer,
652b2ce50fSAbhishek Varma                      TransformHandleTypeInterface:$fused_consumer);
662b2ce50fSAbhishek Varma
672b2ce50fSAbhishek Varma  let assemblyFormat = [{
68*9bc3102bSYun-Fly    $target (`num_consumer_to_fuse` `=` $num_consumer_to_fuse^)?
69*9bc3102bSYun-Fly    attr-dict `:` functional-type(operands, results)
702b2ce50fSAbhishek Varma  }];
712b2ce50fSAbhishek Varma}
722b2ce50fSAbhishek Varma
73aa2a96a2SMaheshRavishankardef TestTileUsingForallOp : Op<Transform_Dialect, "test.tile_using_forall",
74aa2a96a2SMaheshRavishankar       [DeclareOpInterfaceMethods<TransformOpInterface>,
75aa2a96a2SMaheshRavishankar        DeclareOpInterfaceMethods<MemoryEffectsOpInterface>,
76aa2a96a2SMaheshRavishankar        ReportTrackingListenerFailuresOpTrait]> {
77aa2a96a2SMaheshRavishankar  let description = [{
78aa2a96a2SMaheshRavishankar    Test operation use to test tiling using TilingInterface and scf.forall for
79aa2a96a2SMaheshRavishankar    the loop constructs. This is similar to
80aa2a96a2SMaheshRavishankar    `transform.structured.tile_using_for`. Use of this operation is an
81aa2a96a2SMaheshRavishankar    intermediate state and will be replaced in due course with either
82aa2a96a2SMaheshRavishankar    `transform.structured.tile_using_for` or
83aa2a96a2SMaheshRavishankar    `transform.structured.tile_using_forall`.
84aa2a96a2SMaheshRavishankar
85aa2a96a2SMaheshRavishankar    On success returns the tiled operations as well as generated loops. Emits
86aa2a96a2SMaheshRavishankar    a definite failure if tiling fails.
87aa2a96a2SMaheshRavishankar  }];
88aa2a96a2SMaheshRavishankar
89aa2a96a2SMaheshRavishankar  let arguments = (ins TransformHandleTypeInterface:$target,
90aa2a96a2SMaheshRavishankar                   DefaultValuedAttr<I64ArrayAttr, "{}">:$tile_sizes,
91aa2a96a2SMaheshRavishankar                   DefaultValuedOptionalAttr<I64ArrayAttr, "{}">:$interchange,
92aa2a96a2SMaheshRavishankar                   OptionalAttr<DeviceMappingArrayAttr>:$mapping);
93aa2a96a2SMaheshRavishankar  let results = (outs TransformHandleTypeInterface:$tiled_op,
94aa2a96a2SMaheshRavishankar                      Variadic<TransformHandleTypeInterface>:$loops);
95aa2a96a2SMaheshRavishankar
96aa2a96a2SMaheshRavishankar  let assemblyFormat = [{
9776ead96cSMaheshRavishankar    $target ($tile_sizes^)? (`interchange` `=` $interchange^)?
9876ead96cSMaheshRavishankar    (`mapping` `=` $mapping^)?
99aa2a96a2SMaheshRavishankar    attr-dict `:` functional-type(operands, results)
100aa2a96a2SMaheshRavishankar  }];
101aa2a96a2SMaheshRavishankar}
102aa2a96a2SMaheshRavishankar
10376ead96cSMaheshRavishankardef TestFuseUsingForallOp : Op<Transform_Dialect, "test.fuse_using_forall",
10476ead96cSMaheshRavishankar    [DeclareOpInterfaceMethods<TransformOpInterface>,
10576ead96cSMaheshRavishankar     DeclareOpInterfaceMethods<MemoryEffectsOpInterface>,
10676ead96cSMaheshRavishankar     ReportTrackingListenerFailuresOpTrait]> {
10776ead96cSMaheshRavishankar  let description = [{
10876ead96cSMaheshRavishankar    Test operation to tile the operation pointed to by the target handle and
10976ead96cSMaheshRavishankar    fuses their producers greedily using the options provided as attributes.
11076ead96cSMaheshRavishankar    This operation uses scf.forall for the loop construct.
11176ead96cSMaheshRavishankar  }];
11276ead96cSMaheshRavishankar  let arguments = (ins TransformHandleTypeInterface:$root_op,
11376ead96cSMaheshRavishankar                   DefaultValuedAttr<I64ArrayAttr, "{}">:$tile_sizes,
11476ead96cSMaheshRavishankar                   DefaultValuedOptionalAttr<I64ArrayAttr, "{}">:$interchange,
11576ead96cSMaheshRavishankar                   OptionalAttr<DeviceMappingArrayAttr>:$mapping);
11676ead96cSMaheshRavishankar  let results = (outs TransformHandleTypeInterface:$tiled_ops,
11776ead96cSMaheshRavishankar                      Variadic<TransformHandleTypeInterface>:$loops);
11876ead96cSMaheshRavishankar
11976ead96cSMaheshRavishankar  let assemblyFormat = [{
12076ead96cSMaheshRavishankar    $root_op ($tile_sizes^)? (`interchange` $interchange^)?
12176ead96cSMaheshRavishankar    (`mapping` `=` $mapping^)?
12276ead96cSMaheshRavishankar    attr-dict `:` functional-type(operands, results)
12376ead96cSMaheshRavishankar  }];
12476ead96cSMaheshRavishankar}
125aa2a96a2SMaheshRavishankar
126aa2a96a2SMaheshRavishankar#endif // TEST_TILINGINTERFACE_TRANSFORM_OPS
127