| //===- TestTilingInterfaceTransformOps.td -----------------*- tablegen -*-===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef TEST_TILINGINTERFACE_TRANSFORM_OPS |
| #define TEST_TILINGINTERFACE_TRANSFORM_OPS |
| |
| include "mlir/Dialect/SCF/IR/DeviceMappingInterface.td" |
| include "mlir/Dialect/Transform/IR/TransformDialect.td" |
| include "mlir/Dialect/Transform/Interfaces/TransformInterfaces.td" |
| include "mlir/Dialect/Transform/IR/TransformTypes.td" |
| include "mlir/Interfaces/SideEffectInterfaces.td" |
| include "mlir/IR/OpBase.td" |
| |
| // Those operations in this file are meant for testing the tiling interface |
| // transformations using scf operations. Over time these testing options |
| // might be useful transformations in their own right. Move these over |
| // as transform ops in the main repo (also find a proper place for them) |
| |
| def TestFuseAndYieldOp : Op<Transform_Dialect, "test.fuse_and_yield", |
| [FunctionalStyleTransformOpTrait, MemoryEffectsOpInterface, |
| DeclareOpInterfaceMethods<TransformOpInterface>, |
| ReportTrackingListenerFailuresOpTrait]> { |
| let description = [{ |
| Tiles the operations pointed to by the target handle, fuses their |
| producers greedily using the options provided as attributes. |
| It also yields some of the fused producers for testing. |
| |
| On success returns the tiled operations as well as generated loops. Emits |
| a definite failure if tiling fails. |
| }]; |
| |
| let arguments = |
| (ins TransformHandleTypeInterface:$target, |
| DefaultValuedAttr<I64ArrayAttr, "{}">:$tile_sizes, |
| DefaultValuedAttr<I64ArrayAttr, "{}">:$tile_interchange, |
| DefaultValuedAttr<BoolAttr, "false">:$use_forall); |
| let results = (outs TransformHandleTypeInterface:$transfomed, |
| Variadic<TransformHandleTypeInterface>:$loops); |
| |
| let assemblyFormat = [{ |
| $target ($tile_sizes^)? (`interchange` $tile_interchange^)? |
| (`use_forall` $use_forall^)? attr-dict |
| `:` functional-type(operands, results) |
| }]; |
| } |
| |
| def TestFuseConsumerOp : Op<Transform_Dialect, "test.fuse_consumer", |
| [DeclareOpInterfaceMethods<TransformOpInterface>, |
| DeclareOpInterfaceMethods<MemoryEffectsOpInterface>, |
| ReportTrackingListenerFailuresOpTrait]> { |
| let description = [{ |
| Fuses the consumer of the operation pointed to by the target handle |
| using the options provided as attributes. |
| }]; |
| |
| let arguments = |
| (ins TransformHandleTypeInterface:$target); |
| let results = (outs TransformHandleTypeInterface:$consumer, |
| TransformHandleTypeInterface:$fused_consumer); |
| |
| let assemblyFormat = [{ |
| $target attr-dict `:` functional-type(operands, results) |
| }]; |
| } |
| |
| def TestTileUsingForallOp : Op<Transform_Dialect, "test.tile_using_forall", |
| [DeclareOpInterfaceMethods<TransformOpInterface>, |
| DeclareOpInterfaceMethods<MemoryEffectsOpInterface>, |
| ReportTrackingListenerFailuresOpTrait]> { |
| let description = [{ |
| Test operation use to test tiling using TilingInterface and scf.forall for |
| the loop constructs. This is similar to |
| `transform.structured.tile_using_for`. Use of this operation is an |
| intermediate state and will be replaced in due course with either |
| `transform.structured.tile_using_for` or |
| `transform.structured.tile_using_forall`. |
| |
| On success returns the tiled operations as well as generated loops. Emits |
| a definite failure if tiling fails. |
| }]; |
| |
| let arguments = (ins TransformHandleTypeInterface:$target, |
| DefaultValuedAttr<I64ArrayAttr, "{}">:$tile_sizes, |
| DefaultValuedOptionalAttr<I64ArrayAttr, "{}">:$interchange, |
| OptionalAttr<DeviceMappingArrayAttr>:$mapping); |
| let results = (outs TransformHandleTypeInterface:$tiled_op, |
| Variadic<TransformHandleTypeInterface>:$loops); |
| |
| let assemblyFormat = [{ |
| $target ($tile_sizes^)? (`interchange` `=` $interchange^)? |
| (`mapping` `=` $mapping^)? |
| attr-dict `:` functional-type(operands, results) |
| }]; |
| } |
| |
| def TestFuseUsingForallOp : Op<Transform_Dialect, "test.fuse_using_forall", |
| [DeclareOpInterfaceMethods<TransformOpInterface>, |
| DeclareOpInterfaceMethods<MemoryEffectsOpInterface>, |
| ReportTrackingListenerFailuresOpTrait]> { |
| let description = [{ |
| Test operation to tile the operation pointed to by the target handle and |
| fuses their producers greedily using the options provided as attributes. |
| This operation uses scf.forall for the loop construct. |
| }]; |
| let arguments = (ins TransformHandleTypeInterface:$root_op, |
| DefaultValuedAttr<I64ArrayAttr, "{}">:$tile_sizes, |
| DefaultValuedOptionalAttr<I64ArrayAttr, "{}">:$interchange, |
| OptionalAttr<DeviceMappingArrayAttr>:$mapping); |
| let results = (outs TransformHandleTypeInterface:$tiled_ops, |
| Variadic<TransformHandleTypeInterface>:$loops); |
| |
| let assemblyFormat = [{ |
| $root_op ($tile_sizes^)? (`interchange` $interchange^)? |
| (`mapping` `=` $mapping^)? |
| attr-dict `:` functional-type(operands, results) |
| }]; |
| } |
| |
| #endif // TEST_TILINGINTERFACE_TRANSFORM_OPS |