| //===-- MyExtension.td - Transform dialect tutorial --------*- 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 |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file defines Transform dialect extension operations used in the |
| // Chapter 2 of the Transform dialect tutorial. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef MY_EXTENSION |
| #define MY_EXTENSION |
| |
| include "mlir/Dialect/Transform/IR/TransformDialect.td" |
| include "mlir/Dialect/Transform/Interfaces/TransformInterfaces.td" |
| include "mlir/IR/OpBase.td" |
| include "mlir/Interfaces/SideEffectInterfaces.td" |
| |
| // Define the new operation. By convention, prefix its name with the name of the dialect |
| // extension, "my.". The full operation name will be further prefixed with "transform.". |
| def ChangeCallTargetOp : Op<Transform_Dialect, "my.change_call_target", |
| // Indicate that the operation implements the required TransformOpInterface and |
| // MemoryEffectsOpInterface. |
| [DeclareOpInterfaceMethods<TransformOpInterface>, |
| DeclareOpInterfaceMethods<MemoryEffectsOpInterface>]> { |
| // Provide a brief and a full description. It is recommended that the latter describes |
| // the effects on the operands and how the operation processes various failure modes. |
| let summary = "Changes the callee of a call operation to the specified one"; |
| let description = [{ |
| For each `func.call` payload operation associated with the handle, changes its |
| callee to be the symbol whose name is provided as an attribute to this operation. |
| |
| Generates a silenceable failure if the operand is associated with payload operations |
| that are not `func.call`. |
| Only reads the operand. |
| }]; |
| |
| // The arguments include the handle to the payload operations and the attribute that |
| // specifies the new callee. The handle must implement TransformHandleTypeInterface. |
| // We use a string attribute as the symbol may not exist in the transform IR so the |
| // verification may fail. |
| let arguments = (ins |
| TransformHandleTypeInterface:$call, |
| StrAttr:$new_target); |
| |
| // The results are empty as the transformation does not produce any new payload. |
| let results = (outs); |
| |
| // Provide nice syntax. |
| let assemblyFormat = "$call `,` $new_target attr-dict `:` type($call)"; |
| } |
| |
| #endif // MY_EXTENSION |