brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.6 KiB · 27c5dc3 Raw
72 lines · cpp
1//===- PDLExtension.cpp - PDL extension for the Transform dialect ---------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "mlir/Dialect/Transform/PDLExtension/PDLExtension.h"10#include "mlir/Dialect/PDL/IR/PDL.h"11#include "mlir/Dialect/PDL/IR/PDLTypes.h"12#include "mlir/Dialect/PDLInterp/IR/PDLInterp.h"13#include "mlir/Dialect/Transform/IR/TransformDialect.h"14#include "mlir/Dialect/Transform/PDLExtension/PDLExtensionOps.h"15#include "mlir/IR/DialectRegistry.h"16 17using namespace mlir;18 19namespace {20/// Implementation of the TransformHandleTypeInterface for the PDL21/// OperationType. Accepts any payload operation.22struct PDLOperationTypeTransformHandleTypeInterfaceImpl23    : public transform::TransformHandleTypeInterface::ExternalModel<24          PDLOperationTypeTransformHandleTypeInterfaceImpl,25          pdl::OperationType> {26 27  /// Accept any operation.28  DiagnosedSilenceableFailure29  checkPayload(Type type, Location loc, ArrayRef<Operation *> payload) const {30    return DiagnosedSilenceableFailure::success();31  }32};33} // namespace34 35namespace {36/// PDL extension of the Transform dialect. This provides transform operations37/// that connect to PDL matching as well as interfaces for PDL types to be used38/// with Transform dialect operations.39class PDLExtension : public transform::TransformDialectExtension<PDLExtension> {40public:41  MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(PDLExtension)42 43  void init() {44    registerTransformOps<45#define GET_OP_LIST46#include "mlir/Dialect/Transform/PDLExtension/PDLExtensionOps.cpp.inc"47        >();48 49    addDialectDataInitializer<transform::PDLMatchHooks>(50        [](transform::PDLMatchHooks &) {});51 52    // Declare PDL as dependent so we can attach an interface to its type in the53    // later step.54    declareDependentDialect<pdl::PDLDialect>();55 56    // PDLInterp is only relevant if we actually apply the transform IR so57    // declare it as generated.58    declareGeneratedDialect<pdl_interp::PDLInterpDialect>();59 60    // Make PDL OperationType usable as a transform dialect type.61    addCustomInitializationStep([](MLIRContext *context) {62      pdl::OperationType::attachInterface<63          PDLOperationTypeTransformHandleTypeInterfaceImpl>(*context);64    });65  }66};67} // namespace68 69void mlir::transform::registerPDLExtension(DialectRegistry &dialectRegistry) {70  dialectRegistry.addExtensions<PDLExtension>();71}72