MLIR  20.0.0git
PDLExtension.cpp
Go to the documentation of this file.
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-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
16 
17 using namespace mlir;
18 
19 namespace {
20 /// Implementation of the TransformHandleTypeInterface for the PDL
21 /// OperationType. Accepts any payload operation.
22 struct PDLOperationTypeTransformHandleTypeInterfaceImpl
23  : public transform::TransformHandleTypeInterface::ExternalModel<
24  PDLOperationTypeTransformHandleTypeInterfaceImpl,
25  pdl::OperationType> {
26 
27  /// Accept any operation.
29  checkPayload(Type type, Location loc, ArrayRef<Operation *> payload) const {
31  }
32 };
33 } // namespace
34 
35 namespace {
36 /// PDL extension of the Transform dialect. This provides transform operations
37 /// that connect to PDL matching as well as interfaces for PDL types to be used
38 /// with Transform dialect operations.
39 class PDLExtension : public transform::TransformDialectExtension<PDLExtension> {
40 public:
42 
43  void init() {
44  registerTransformOps<
45 #define GET_OP_LIST
46 #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 the
53  // later step.
54  declareDependentDialect<pdl::PDLDialect>();
55 
56  // PDLInterp is only relevant if we actually apply the transform IR so
57  // 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 } // namespace
68 
70  dialectRegistry.addExtensions<PDLExtension>();
71 }
#define MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(CLASS_NAME)
Definition: TypeID.h:274
The result of a transform IR operation application.
static DiagnosedSilenceableFailure success()
Constructs a DiagnosedSilenceableFailure in the success state.
The DialectRegistry maps a dialect namespace to a constructor for the matching dialect.
void addExtensions()
Add the given extensions to the registry.
This class defines the main interface for locations in MLIR and acts as a non-nullable wrapper around...
Definition: Location.h:66
MLIRContext is the top-level object for a collection of MLIR operations.
Definition: MLIRContext.h:60
Instances of the Type class are uniqued, have an immutable identifier and an optional mutable compone...
Definition: Types.h:74
PDL constraint callbacks that can be used by the PDL extension of the Transform dialect.
Base class for extensions of the Transform dialect that supports injecting operations into the Transf...
void registerPDLExtension(DialectRegistry &dialectRegistry)
Registers the PDL extension of the Transform dialect in the given registry.
Include the generated interface declarations.