xref: /llvm-project/mlir/lib/Dialect/Transform/PDLExtension/PDLExtension.cpp (revision 84cc1865ef9202af39404ff4524a9b13df80cfc1)
194d608d4SAlex Zinenko //===- PDLExtension.cpp - PDL extension for the Transform dialect ---------===//
294d608d4SAlex Zinenko //
394d608d4SAlex Zinenko // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
494d608d4SAlex Zinenko // See https://llvm.org/LICENSE.txt for license information.
594d608d4SAlex Zinenko // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
694d608d4SAlex Zinenko //
794d608d4SAlex Zinenko //===----------------------------------------------------------------------===//
894d608d4SAlex Zinenko 
994d608d4SAlex Zinenko #include "mlir/Dialect/Transform/PDLExtension/PDLExtension.h"
1094d608d4SAlex Zinenko #include "mlir/Dialect/PDL/IR/PDL.h"
1194d608d4SAlex Zinenko #include "mlir/Dialect/PDL/IR/PDLTypes.h"
1294d608d4SAlex Zinenko #include "mlir/Dialect/PDLInterp/IR/PDLInterp.h"
1394d608d4SAlex Zinenko #include "mlir/Dialect/Transform/IR/TransformDialect.h"
1494d608d4SAlex Zinenko #include "mlir/Dialect/Transform/PDLExtension/PDLExtensionOps.h"
1594d608d4SAlex Zinenko #include "mlir/IR/DialectRegistry.h"
1694d608d4SAlex Zinenko 
1794d608d4SAlex Zinenko using namespace mlir;
1894d608d4SAlex Zinenko 
1994d608d4SAlex Zinenko namespace {
2094d608d4SAlex Zinenko /// Implementation of the TransformHandleTypeInterface for the PDL
2194d608d4SAlex Zinenko /// OperationType. Accepts any payload operation.
2294d608d4SAlex Zinenko struct PDLOperationTypeTransformHandleTypeInterfaceImpl
2394d608d4SAlex Zinenko     : public transform::TransformHandleTypeInterface::ExternalModel<
2494d608d4SAlex Zinenko           PDLOperationTypeTransformHandleTypeInterfaceImpl,
2594d608d4SAlex Zinenko           pdl::OperationType> {
2694d608d4SAlex Zinenko 
2794d608d4SAlex Zinenko   /// Accept any operation.
2894d608d4SAlex Zinenko   DiagnosedSilenceableFailure
2994d608d4SAlex Zinenko   checkPayload(Type type, Location loc, ArrayRef<Operation *> payload) const {
3094d608d4SAlex Zinenko     return DiagnosedSilenceableFailure::success();
3194d608d4SAlex Zinenko   }
3294d608d4SAlex Zinenko };
3394d608d4SAlex Zinenko } // namespace
3494d608d4SAlex Zinenko 
3594d608d4SAlex Zinenko namespace {
3694d608d4SAlex Zinenko /// PDL extension of the Transform dialect. This provides transform operations
3794d608d4SAlex Zinenko /// that connect to PDL matching as well as interfaces for PDL types to be used
3894d608d4SAlex Zinenko /// with Transform dialect operations.
3994d608d4SAlex Zinenko class PDLExtension : public transform::TransformDialectExtension<PDLExtension> {
4094d608d4SAlex Zinenko public:
41*84cc1865SNikhil Kalra   MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(PDLExtension)
42*84cc1865SNikhil Kalra 
4394d608d4SAlex Zinenko   void init() {
4494d608d4SAlex Zinenko     registerTransformOps<
4594d608d4SAlex Zinenko #define GET_OP_LIST
4694d608d4SAlex Zinenko #include "mlir/Dialect/Transform/PDLExtension/PDLExtensionOps.cpp.inc"
4794d608d4SAlex Zinenko         >();
4894d608d4SAlex Zinenko 
4994d608d4SAlex Zinenko     addDialectDataInitializer<transform::PDLMatchHooks>(
5094d608d4SAlex Zinenko         [](transform::PDLMatchHooks &) {});
5194d608d4SAlex Zinenko 
5294d608d4SAlex Zinenko     // Declare PDL as dependent so we can attach an interface to its type in the
5394d608d4SAlex Zinenko     // later step.
5494d608d4SAlex Zinenko     declareDependentDialect<pdl::PDLDialect>();
5594d608d4SAlex Zinenko 
5694d608d4SAlex Zinenko     // PDLInterp is only relevant if we actually apply the transform IR so
5794d608d4SAlex Zinenko     // declare it as generated.
5894d608d4SAlex Zinenko     declareGeneratedDialect<pdl_interp::PDLInterpDialect>();
5994d608d4SAlex Zinenko 
6094d608d4SAlex Zinenko     // Make PDL OperationType usable as a transform dialect type.
6194d608d4SAlex Zinenko     addCustomInitializationStep([](MLIRContext *context) {
6294d608d4SAlex Zinenko       pdl::OperationType::attachInterface<
6394d608d4SAlex Zinenko           PDLOperationTypeTransformHandleTypeInterfaceImpl>(*context);
6494d608d4SAlex Zinenko     });
6594d608d4SAlex Zinenko   }
6694d608d4SAlex Zinenko };
6794d608d4SAlex Zinenko } // namespace
6894d608d4SAlex Zinenko 
6994d608d4SAlex Zinenko void mlir::transform::registerPDLExtension(DialectRegistry &dialectRegistry) {
7094d608d4SAlex Zinenko   dialectRegistry.addExtensions<PDLExtension>();
7194d608d4SAlex Zinenko }
72