//===-- 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 3 of the Transform dialect tutorial. // //===----------------------------------------------------------------------===// #ifndef MY_EXTENSION #define MY_EXTENSION include "MyExtensionTypes.td" include "mlir/Dialect/Transform/IR/TransformDialect.td" include "mlir/Dialect/Transform/IR/TransformInterfaces.td" include "mlir/Dialect/Transform/IR/TransformTypes.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]> { // 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 // Specify the type constraint on the input accepting only `func.call` payload // operations. Transform_ConcreteOpType<"func.call">:$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 `:` qualified(type($call))"; // Declare the function implementing the interface for a single payload operation. let extraClassDeclaration = [{ ::mlir::DiagnosedSilenceableFailure applyToOne( ::mlir::transform::TransformRewriter &rewriter, ::mlir::func::CallOp call, ::mlir::transform::ApplyToEachResultList &results, ::mlir::transform::TransformState &state); }]; } // Define another transform operation. def CallToOp : Op { // Summary and description omitted for brevity. // The argument is the handle to the payload operations. let arguments = (ins CallOpInterfaceHandle:$call); // The result is the handle to the payload operations produced during the // transformation. let results = (outs TransformHandleTypeInterface:$transformed); // Provide nice syntax. let assemblyFormat = "$call attr-dict `:` functional-type(operands, results)"; // Declare the function implementing the interface for a single payload operation. let extraClassDeclaration = [{ ::mlir::DiagnosedSilenceableFailure applyToOne( ::mlir::transform::TransformRewriter &rewriter, ::mlir::CallOpInterface call, ::mlir::transform::ApplyToEachResultList &results, ::mlir::transform::TransformState &state); }]; } #endif // MY_EXTENSION