//===-- MyExtension.cpp - Transform dialect tutorial ----------------------===// // // 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. // //===----------------------------------------------------------------------===// #include "MyExtension.h" #include "mlir/Dialect/Func/IR/FuncOps.h" #include "mlir/Dialect/SCF/IR/SCF.h" #include "mlir/Dialect/Transform/IR/TransformDialect.h" #include "mlir/Dialect/Transform/IR/TransformTypes.h" #include "mlir/Dialect/Transform/Interfaces/TransformInterfaces.h" #include "mlir/IR/DialectRegistry.h" #include "mlir/IR/Operation.h" #include "mlir/Interfaces/SideEffectInterfaces.h" #include "mlir/Support/LLVM.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringRef.h" // Define a new transform dialect extension. This uses the CRTP idiom to // identify extensions. class MyExtension : public ::mlir::transform::TransformDialectExtension<MyExtension> { … }; void MyExtension::init() { … } #define GET_OP_CLASSES #include "MyExtension.cpp.inc" static void updateCallee(mlir::func::CallOp call, llvm::StringRef newTarget) { … } // Implementation of our transform dialect operation. // This operation returns a tri-state result that can be one of: // - success when the transformation succeeded; // - definite failure when the transformation failed in such a way that // following transformations are impossible or undesirable, typically it could // have left payload IR in an invalid state; it is expected that a diagnostic // is emitted immediately before returning the definite error; // - silenceable failure when the transformation failed but following // transformations are still applicable, typically this means a precondition // for the transformation is not satisfied and the payload IR has not been // modified. The silenceable failure additionally carries a Diagnostic that // can be emitted to the user. ::mlir::DiagnosedSilenceableFailure mlir::transform::ChangeCallTargetOp::apply( // The rewriter that should be used when modifying IR. ::mlir::transform::TransformRewriter &rewriter, // The list of payload IR entities that will be associated with the // transform IR values defined by this transform operation. In this case, it // can remain empty as there are no results. ::mlir::transform::TransformResults &results, // The transform application state. This object can be used to query the // current associations between transform IR values and payload IR entities. // It can also carry additional user-defined state. ::mlir::transform::TransformState &state) { … } void mlir::transform::ChangeCallTargetOp::getEffects( ::llvm::SmallVectorImpl<::mlir::MemoryEffects::EffectInstance> &effects) { … } void registerMyExtension(::mlir::DialectRegistry ®istry) { … }