| // Copyright 2022 The IREE Authors |
| // |
| // Licensed 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 IREE_COMPILER_DIALECT_FLOW_TRANSFORMEXTENSIONS_FLOWEXTENSIONS |
| #define IREE_COMPILER_DIALECT_FLOW_TRANSFORMEXTENSIONS_FLOWEXTENSIONS |
| |
| include "mlir/Dialect/Transform/IR/TransformDialect.td" |
| include "mlir/Dialect/Transform/Interfaces/TransformInterfaces.td" |
| include "mlir/Interfaces/SideEffectInterfaces.td" |
| include "mlir/IR/OpBase.td" |
| |
| def ForeachThreadToFlowDispatchWorkgroupsOp : Op<Transform_Dialect, "iree.forall_to_flow", |
| [FunctionalStyleTransformOpTrait, |
| DeclareOpInterfaceMethods<MemoryEffectsOpInterface>, |
| TransformEachOpTrait, |
| TransformOpInterface, |
| ReportTrackingListenerFailuresOpTrait]> { |
| let description = [{ |
| Rewrite an scf.forall to Flow::DispatchWorkgroups. |
| |
| #### Return modes |
| |
| This operation ignores non-scf::ForeachThread ops and drops them in the |
| return. |
| |
| If any rewrite fails, the transform definitely fails. |
| |
| If all the operations referred to by the `target` operand generalize |
| properly, the transform succeeds. Otherwise the transform silently fails. |
| |
| The return handle points to only the subset of successfully produced |
| equivalent flow::DispatchWorkgroups operations, which can be empty. |
| |
| This operation consumes the `target` handle and produces the `transformed` |
| handle. |
| }]; |
| |
| let arguments = (ins TransformHandleTypeInterface:$target); |
| let results = (outs TransformHandleTypeInterface:$transformed); |
| |
| let assemblyFormat = "$target attr-dict `:` functional-type(operands, results)"; |
| let cppNamespace = "mlir::iree_compiler::IREE::transform_dialect"; |
| let extraClassDeclaration = [{ |
| ::mlir::DiagnosedSilenceableFailure applyToOne( |
| ::mlir::transform::TransformRewriter &rewriter, |
| ::mlir::scf::ForallOp target, |
| ::mlir::transform::ApplyToEachResultList &results, |
| ::mlir::transform::TransformState &state); |
| }]; |
| } |
| |
| def RegionToWorkgroupsOp : Op<Transform_Dialect, "iree.region_to_workgroups", |
| [FunctionalStyleTransformOpTrait, |
| DeclareOpInterfaceMethods<MemoryEffectsOpInterface>, |
| TransformOpInterface, |
| TransformEachOpTrait, |
| ReportTrackingListenerFailuresOpTrait]> { |
| let description = [{ |
| Convert a flow.dispatch.region op into a flow.dispatch.workgroups op. |
| |
| Region ops can capture any values that are in scope in their body, whereas |
| workgroup ops are isolated from above and all values must be explicitly |
| captured via operands. |
| |
| #### Return modes |
| |
| This operation consumes the `target` handle and produces the `transformed` |
| handle. |
| }]; |
| |
| let arguments = (ins TransformHandleTypeInterface:$target); |
| let results = (outs TransformHandleTypeInterface:$transformed); |
| |
| let assemblyFormat = "$target attr-dict `:` functional-type(operands, results)"; |
| let cppNamespace = "mlir::iree_compiler::IREE::transform_dialect"; |
| let extraClassDeclaration = [{ |
| ::mlir::DiagnosedSilenceableFailure applyToOne( |
| ::mlir::transform::TransformRewriter &rewriter, |
| ::mlir::iree_compiler::IREE::Flow::DispatchRegionOp target, |
| ::mlir::transform::ApplyToEachResultList &results, |
| ::mlir::transform::TransformState &state); |
| }]; |
| } |
| |
| |
| #endif // IREE_COMPILER_DIALECT_FLOW_TRANSFORMEXTENSIONS_FLOWEXTENSIONS |