Files
clang-p2996/mlir/lib/Dialect/Transform/PDLExtension/PDLExtension.cpp
Alex Zinenko 94d608d410 [mlir] move PDL-related transform ops into an extension
The initial bring-up of the Transform dialect relied on PDL to provide
the default handle type (`!pdl.operation`) and the matching capability.
Both are now provided natively by the Transform dialect removing the
reason to have a hard dependency on the PDL dialect and its interpreter.
Move PDL-related transform operations into a separate extension.

This requires us to introduce a dialect state extension mechanism into
the Transform dialect so it no longer needs to know about PDL constraint
functions that may be injected by extensions similarly to operations and
types. This mechanism will be reused to connect pattern application
drivers and the Transform dialect.

This completes the restructuring of the Transform dialect to remove
overrilance on PDL.

Note to downstreams: flow that are using `!pdl.operation` with Transform
dialect operations will now require `transform::PDLExtension` to be
applied to the transform dialect in order to provide the transform
handle type interface for `!pdl.operation`.

Reviewed By: springerm

Differential Revision: https://reviews.llvm.org/D151104
2023-05-24 12:25:06 +00:00

70 lines
2.5 KiB
C++

//===- PDLExtension.cpp - PDL extension for the Transform dialect ---------===//
//
// 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
//
//===----------------------------------------------------------------------===//
#include "mlir/Dialect/Transform/PDLExtension/PDLExtension.h"
#include "mlir/Dialect/PDL/IR/PDL.h"
#include "mlir/Dialect/PDL/IR/PDLTypes.h"
#include "mlir/Dialect/PDLInterp/IR/PDLInterp.h"
#include "mlir/Dialect/Transform/IR/TransformDialect.h"
#include "mlir/Dialect/Transform/PDLExtension/PDLExtensionOps.h"
#include "mlir/IR/DialectRegistry.h"
using namespace mlir;
namespace {
/// Implementation of the TransformHandleTypeInterface for the PDL
/// OperationType. Accepts any payload operation.
struct PDLOperationTypeTransformHandleTypeInterfaceImpl
: public transform::TransformHandleTypeInterface::ExternalModel<
PDLOperationTypeTransformHandleTypeInterfaceImpl,
pdl::OperationType> {
/// Accept any operation.
DiagnosedSilenceableFailure
checkPayload(Type type, Location loc, ArrayRef<Operation *> payload) const {
return DiagnosedSilenceableFailure::success();
}
};
} // namespace
namespace {
/// PDL extension of the Transform dialect. This provides transform operations
/// that connect to PDL matching as well as interfaces for PDL types to be used
/// with Transform dialect operations.
class PDLExtension : public transform::TransformDialectExtension<PDLExtension> {
public:
void init() {
registerTransformOps<
#define GET_OP_LIST
#include "mlir/Dialect/Transform/PDLExtension/PDLExtensionOps.cpp.inc"
>();
addDialectDataInitializer<transform::PDLMatchHooks>(
[](transform::PDLMatchHooks &) {});
// Declare PDL as dependent so we can attach an interface to its type in the
// later step.
declareDependentDialect<pdl::PDLDialect>();
// PDLInterp is only relevant if we actually apply the transform IR so
// declare it as generated.
declareGeneratedDialect<pdl_interp::PDLInterpDialect>();
// Make PDL OperationType usable as a transform dialect type.
addCustomInitializationStep([](MLIRContext *context) {
pdl::OperationType::attachInterface<
PDLOperationTypeTransformHandleTypeInterfaceImpl>(*context);
});
}
};
} // namespace
void mlir::transform::registerPDLExtension(DialectRegistry &dialectRegistry) {
dialectRegistry.addExtensions<PDLExtension>();
}