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