1d064c480SAlex Zinenko //===- TestTransformDialectExtension.cpp ----------------------------------===//
2d064c480SAlex Zinenko //
3d064c480SAlex Zinenko // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4d064c480SAlex Zinenko // See https://llvm.org/LICENSE.txt for license information.
5d064c480SAlex Zinenko // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6d064c480SAlex Zinenko //
7d064c480SAlex Zinenko //===----------------------------------------------------------------------===//
8d064c480SAlex Zinenko //
9d064c480SAlex Zinenko // This file defines an extension of the MLIR Transform dialect for testing
10d064c480SAlex Zinenko // purposes.
11d064c480SAlex Zinenko //
12d064c480SAlex Zinenko //===----------------------------------------------------------------------===//
13d064c480SAlex Zinenko 
14d064c480SAlex Zinenko #include "TestTransformDialectExtension.h"
156c57b0deSAlex Zinenko #include "TestTransformStateExtension.h"
16d064c480SAlex Zinenko #include "mlir/Dialect/PDL/IR/PDL.h"
17d064c480SAlex Zinenko #include "mlir/Dialect/Transform/IR/TransformDialect.h"
18d064c480SAlex Zinenko #include "mlir/Dialect/Transform/IR/TransformInterfaces.h"
19d064c480SAlex Zinenko #include "mlir/IR/OpImplementation.h"
20d064c480SAlex Zinenko 
21d064c480SAlex Zinenko using namespace mlir;
22d064c480SAlex Zinenko 
23d064c480SAlex Zinenko namespace {
24d064c480SAlex Zinenko /// Simple transform op defined outside of the dialect. Just emits a remark when
2530f22429SAlex Zinenko /// applied. This op is defined in C++ to test that C++ definitions also work
2630f22429SAlex Zinenko /// for op injection into the Transform dialect.
27d064c480SAlex Zinenko class TestTransformOp
2840a8bd63SAlex Zinenko     : public Op<TestTransformOp, transform::TransformOpInterface::Trait,
2940a8bd63SAlex Zinenko                 MemoryEffectOpInterface::Trait> {
30d064c480SAlex Zinenko public:
31d064c480SAlex Zinenko   MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(TestTransformOp)
32d064c480SAlex Zinenko 
33d064c480SAlex Zinenko   using Op::Op;
34d064c480SAlex Zinenko 
getAttributeNames()35d064c480SAlex Zinenko   static ArrayRef<StringRef> getAttributeNames() { return {}; }
36d064c480SAlex Zinenko 
getOperationName()37d064c480SAlex Zinenko   static constexpr llvm::StringLiteral getOperationName() {
38d064c480SAlex Zinenko     return llvm::StringLiteral("transform.test_transform_op");
39d064c480SAlex Zinenko   }
40d064c480SAlex Zinenko 
apply(transform::TransformResults & results,transform::TransformState & state)411d45282aSAlex Zinenko   DiagnosedSilenceableFailure apply(transform::TransformResults &results,
42d064c480SAlex Zinenko                                     transform::TransformState &state) {
430eb403adSAlex Zinenko     InFlightDiagnostic remark = emitRemark() << "applying transformation";
440eb403adSAlex Zinenko     if (Attribute message = getMessage())
450eb403adSAlex Zinenko       remark << " " << message;
460eb403adSAlex Zinenko 
471d45282aSAlex Zinenko     return DiagnosedSilenceableFailure::success();
48d064c480SAlex Zinenko   }
49d064c480SAlex Zinenko 
getMessage()500eb403adSAlex Zinenko   Attribute getMessage() { return getOperation()->getAttr("message"); }
510eb403adSAlex Zinenko 
parse(OpAsmParser & parser,OperationState & state)52d064c480SAlex Zinenko   static ParseResult parse(OpAsmParser &parser, OperationState &state) {
530eb403adSAlex Zinenko     StringAttr message;
540eb403adSAlex Zinenko     OptionalParseResult result = parser.parseOptionalAttribute(message);
553b7c3a65SKazu Hirata     if (!result.hasValue())
56d064c480SAlex Zinenko       return success();
570eb403adSAlex Zinenko 
583b7c3a65SKazu Hirata     if (result.getValue().succeeded())
590eb403adSAlex Zinenko       state.addAttribute("message", message);
603b7c3a65SKazu Hirata     return result.getValue();
61d064c480SAlex Zinenko   }
62d064c480SAlex Zinenko 
print(OpAsmPrinter & printer)630eb403adSAlex Zinenko   void print(OpAsmPrinter &printer) {
640eb403adSAlex Zinenko     if (getMessage())
650eb403adSAlex Zinenko       printer << " " << getMessage();
660eb403adSAlex Zinenko   }
6740a8bd63SAlex Zinenko 
6840a8bd63SAlex Zinenko   // No side effects.
getEffects(SmallVectorImpl<MemoryEffects::EffectInstance> & effects)6940a8bd63SAlex Zinenko   void getEffects(SmallVectorImpl<MemoryEffects::EffectInstance> &effects) {}
70d064c480SAlex Zinenko };
7130f22429SAlex Zinenko 
7230f22429SAlex Zinenko /// A test op to exercise the verifier of the PossibleTopLevelTransformOpTrait
7330f22429SAlex Zinenko /// in cases where it is attached to ops that do not comply with the trait
7430f22429SAlex Zinenko /// requirements. This op cannot be defined in ODS because ODS generates strict
7530f22429SAlex Zinenko /// verifiers that overalp with those in the trait and run earlier.
7630f22429SAlex Zinenko class TestTransformUnrestrictedOpNoInterface
7730f22429SAlex Zinenko     : public Op<TestTransformUnrestrictedOpNoInterface,
7830f22429SAlex Zinenko                 transform::PossibleTopLevelTransformOpTrait,
7940a8bd63SAlex Zinenko                 transform::TransformOpInterface::Trait,
8040a8bd63SAlex Zinenko                 MemoryEffectOpInterface::Trait> {
8130f22429SAlex Zinenko public:
8230f22429SAlex Zinenko   MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(
8330f22429SAlex Zinenko       TestTransformUnrestrictedOpNoInterface)
8430f22429SAlex Zinenko 
8530f22429SAlex Zinenko   using Op::Op;
8630f22429SAlex Zinenko 
getAttributeNames()8730f22429SAlex Zinenko   static ArrayRef<StringRef> getAttributeNames() { return {}; }
8830f22429SAlex Zinenko 
getOperationName()8930f22429SAlex Zinenko   static constexpr llvm::StringLiteral getOperationName() {
9030f22429SAlex Zinenko     return llvm::StringLiteral(
9130f22429SAlex Zinenko         "transform.test_transform_unrestricted_op_no_interface");
9230f22429SAlex Zinenko   }
9330f22429SAlex Zinenko 
apply(transform::TransformResults & results,transform::TransformState & state)941d45282aSAlex Zinenko   DiagnosedSilenceableFailure apply(transform::TransformResults &results,
9530f22429SAlex Zinenko                                     transform::TransformState &state) {
961d45282aSAlex Zinenko     return DiagnosedSilenceableFailure::success();
9730f22429SAlex Zinenko   }
9840a8bd63SAlex Zinenko 
9940a8bd63SAlex Zinenko   // No side effects.
getEffects(SmallVectorImpl<MemoryEffects::EffectInstance> & effects)10040a8bd63SAlex Zinenko   void getEffects(SmallVectorImpl<MemoryEffects::EffectInstance> &effects) {}
10130f22429SAlex Zinenko };
102d064c480SAlex Zinenko } // namespace
103d064c480SAlex Zinenko 
1041d45282aSAlex Zinenko DiagnosedSilenceableFailure
apply(transform::TransformResults & results,transform::TransformState & state)105e3890b7fSAlex Zinenko mlir::test::TestProduceParamOrForwardOperandOp::apply(
106d064c480SAlex Zinenko     transform::TransformResults &results, transform::TransformState &state) {
107d064c480SAlex Zinenko   if (getOperation()->getNumOperands() != 0) {
1080eb403adSAlex Zinenko     results.set(getResult().cast<OpResult>(),
1090eb403adSAlex Zinenko                 getOperation()->getOperand(0).getDefiningOp());
110d064c480SAlex Zinenko   } else {
111d064c480SAlex Zinenko     results.set(getResult().cast<OpResult>(),
1120eb403adSAlex Zinenko                 reinterpret_cast<Operation *>(*getParameter()));
113d064c480SAlex Zinenko   }
1141d45282aSAlex Zinenko   return DiagnosedSilenceableFailure::success();
115d064c480SAlex Zinenko }
116d064c480SAlex Zinenko 
verify()117d064c480SAlex Zinenko LogicalResult mlir::test::TestProduceParamOrForwardOperandOp::verify() {
118037f0995SKazu Hirata   if (getParameter().has_value() ^ (getNumOperands() != 1))
119d064c480SAlex Zinenko     return emitOpError() << "expects either a parameter or an operand";
120d064c480SAlex Zinenko   return success();
121d064c480SAlex Zinenko }
122d064c480SAlex Zinenko 
1231d45282aSAlex Zinenko DiagnosedSilenceableFailure
apply(transform::TransformResults & results,transform::TransformState & state)1246403e1b1SAlex Zinenko mlir::test::TestConsumeOperand::apply(transform::TransformResults &results,
1256403e1b1SAlex Zinenko                                       transform::TransformState &state) {
1261d45282aSAlex Zinenko   return DiagnosedSilenceableFailure::success();
1276403e1b1SAlex Zinenko }
1286403e1b1SAlex Zinenko 
1291d45282aSAlex Zinenko DiagnosedSilenceableFailure
apply(transform::TransformResults & results,transform::TransformState & state)130e3890b7fSAlex Zinenko mlir::test::TestConsumeOperandIfMatchesParamOrFail::apply(
131d064c480SAlex Zinenko     transform::TransformResults &results, transform::TransformState &state) {
132d064c480SAlex Zinenko   ArrayRef<Operation *> payload = state.getPayloadOps(getOperand());
133d064c480SAlex Zinenko   assert(payload.size() == 1 && "expected a single target op");
134d064c480SAlex Zinenko   auto value = reinterpret_cast<intptr_t>(payload[0]);
1350eb403adSAlex Zinenko   if (static_cast<uint64_t>(value) != getParameter()) {
1361d45282aSAlex Zinenko     return emitSilenceableError()
137e3890b7fSAlex Zinenko            << "op expected the operand to be associated with " << getParameter()
138e3890b7fSAlex Zinenko            << " got " << value;
139d064c480SAlex Zinenko   }
140d064c480SAlex Zinenko 
141d064c480SAlex Zinenko   emitRemark() << "succeeded";
1421d45282aSAlex Zinenko   return DiagnosedSilenceableFailure::success();
143d064c480SAlex Zinenko }
144d064c480SAlex Zinenko 
apply(transform::TransformResults & results,transform::TransformState & state)1451d45282aSAlex Zinenko DiagnosedSilenceableFailure mlir::test::TestPrintRemarkAtOperandOp::apply(
14630f22429SAlex Zinenko     transform::TransformResults &results, transform::TransformState &state) {
14730f22429SAlex Zinenko   ArrayRef<Operation *> payload = state.getPayloadOps(getOperand());
14830f22429SAlex Zinenko   for (Operation *op : payload)
14930f22429SAlex Zinenko     op->emitRemark() << getMessage();
15030f22429SAlex Zinenko 
1511d45282aSAlex Zinenko   return DiagnosedSilenceableFailure::success();
15230f22429SAlex Zinenko }
15330f22429SAlex Zinenko 
1541d45282aSAlex Zinenko DiagnosedSilenceableFailure
apply(transform::TransformResults & results,transform::TransformState & state)1556c57b0deSAlex Zinenko mlir::test::TestAddTestExtensionOp::apply(transform::TransformResults &results,
1566c57b0deSAlex Zinenko                                           transform::TransformState &state) {
1576c57b0deSAlex Zinenko   state.addExtension<TestTransformStateExtension>(getMessageAttr());
1581d45282aSAlex Zinenko   return DiagnosedSilenceableFailure::success();
1596c57b0deSAlex Zinenko }
1606c57b0deSAlex Zinenko 
1611d45282aSAlex Zinenko DiagnosedSilenceableFailure
apply(transform::TransformResults & results,transform::TransformState & state)1621d45282aSAlex Zinenko mlir::test::TestCheckIfTestExtensionPresentOp::apply(
1636c57b0deSAlex Zinenko     transform::TransformResults &results, transform::TransformState &state) {
1646c57b0deSAlex Zinenko   auto *extension = state.getExtension<TestTransformStateExtension>();
1656c57b0deSAlex Zinenko   if (!extension) {
1666c57b0deSAlex Zinenko     emitRemark() << "extension absent";
1671d45282aSAlex Zinenko     return DiagnosedSilenceableFailure::success();
1686c57b0deSAlex Zinenko   }
1696c57b0deSAlex Zinenko 
1706c57b0deSAlex Zinenko   InFlightDiagnostic diag = emitRemark()
1716c57b0deSAlex Zinenko                             << "extension present, " << extension->getMessage();
1726c57b0deSAlex Zinenko   for (Operation *payload : state.getPayloadOps(getOperand())) {
1736c57b0deSAlex Zinenko     diag.attachNote(payload->getLoc()) << "associated payload op";
1746c57b0deSAlex Zinenko     assert(state.getHandleForPayloadOp(payload) == getOperand() &&
1756c57b0deSAlex Zinenko            "inconsistent mapping between transform IR handles and payload IR "
1766c57b0deSAlex Zinenko            "operations");
1776c57b0deSAlex Zinenko   }
1786c57b0deSAlex Zinenko 
1791d45282aSAlex Zinenko   return DiagnosedSilenceableFailure::success();
1806c57b0deSAlex Zinenko }
1816c57b0deSAlex Zinenko 
apply(transform::TransformResults & results,transform::TransformState & state)1821d45282aSAlex Zinenko DiagnosedSilenceableFailure mlir::test::TestRemapOperandPayloadToSelfOp::apply(
1836c57b0deSAlex Zinenko     transform::TransformResults &results, transform::TransformState &state) {
1846c57b0deSAlex Zinenko   auto *extension = state.getExtension<TestTransformStateExtension>();
185e3890b7fSAlex Zinenko   if (!extension) {
186e3890b7fSAlex Zinenko     emitError() << "TestTransformStateExtension missing";
1871d45282aSAlex Zinenko     return DiagnosedSilenceableFailure::definiteFailure();
1886c57b0deSAlex Zinenko   }
1896c57b0deSAlex Zinenko 
190e3890b7fSAlex Zinenko   if (failed(extension->updateMapping(state.getPayloadOps(getOperand()).front(),
191e3890b7fSAlex Zinenko                                       getOperation())))
1921d45282aSAlex Zinenko     return DiagnosedSilenceableFailure::definiteFailure();
1931d45282aSAlex Zinenko   return DiagnosedSilenceableFailure::success();
194e3890b7fSAlex Zinenko }
195e3890b7fSAlex Zinenko 
apply(transform::TransformResults & results,transform::TransformState & state)1961d45282aSAlex Zinenko DiagnosedSilenceableFailure mlir::test::TestRemoveTestExtensionOp::apply(
1976c57b0deSAlex Zinenko     transform::TransformResults &results, transform::TransformState &state) {
1986c57b0deSAlex Zinenko   state.removeExtension<TestTransformStateExtension>();
1991d45282aSAlex Zinenko   return DiagnosedSilenceableFailure::success();
2006c57b0deSAlex Zinenko }
201*a299539aSMatthias Springer 
202*a299539aSMatthias Springer DiagnosedSilenceableFailure
apply(transform::TransformResults & results,transform::TransformState & state)203*a299539aSMatthias Springer mlir::test::TestReversePayloadOpsOp::apply(transform::TransformResults &results,
204*a299539aSMatthias Springer                                            transform::TransformState &state) {
205*a299539aSMatthias Springer   ArrayRef<Operation *> payloadOps = state.getPayloadOps(getTarget());
206*a299539aSMatthias Springer   auto reversedOps = llvm::to_vector(llvm::reverse(payloadOps));
207*a299539aSMatthias Springer   results.set(getResult().cast<OpResult>(), reversedOps);
208*a299539aSMatthias Springer   return DiagnosedSilenceableFailure::success();
209*a299539aSMatthias Springer }
210*a299539aSMatthias Springer 
apply(transform::TransformResults & results,transform::TransformState & state)2111d45282aSAlex Zinenko DiagnosedSilenceableFailure mlir::test::TestTransformOpWithRegions::apply(
21273c3dff1SAlex Zinenko     transform::TransformResults &results, transform::TransformState &state) {
2131d45282aSAlex Zinenko   return DiagnosedSilenceableFailure::success();
21473c3dff1SAlex Zinenko }
21573c3dff1SAlex Zinenko 
getEffects(SmallVectorImpl<MemoryEffects::EffectInstance> & effects)21673c3dff1SAlex Zinenko void mlir::test::TestTransformOpWithRegions::getEffects(
21773c3dff1SAlex Zinenko     SmallVectorImpl<MemoryEffects::EffectInstance> &effects) {}
21873c3dff1SAlex Zinenko 
2191d45282aSAlex Zinenko DiagnosedSilenceableFailure
apply(transform::TransformResults & results,transform::TransformState & state)220e3890b7fSAlex Zinenko mlir::test::TestBranchingTransformOpTerminator::apply(
22173c3dff1SAlex Zinenko     transform::TransformResults &results, transform::TransformState &state) {
2221d45282aSAlex Zinenko   return DiagnosedSilenceableFailure::success();
22373c3dff1SAlex Zinenko }
22473c3dff1SAlex Zinenko 
getEffects(SmallVectorImpl<MemoryEffects::EffectInstance> & effects)22573c3dff1SAlex Zinenko void mlir::test::TestBranchingTransformOpTerminator::getEffects(
22673c3dff1SAlex Zinenko     SmallVectorImpl<MemoryEffects::EffectInstance> &effects) {}
2276c57b0deSAlex Zinenko 
apply(transform::TransformResults & results,transform::TransformState & state)2281d45282aSAlex Zinenko DiagnosedSilenceableFailure mlir::test::TestEmitRemarkAndEraseOperandOp::apply(
229e3890b7fSAlex Zinenko     transform::TransformResults &results, transform::TransformState &state) {
230e3890b7fSAlex Zinenko   emitRemark() << getRemark();
231e3890b7fSAlex Zinenko   for (Operation *op : state.getPayloadOps(getTarget()))
232e3890b7fSAlex Zinenko     op->erase();
233e3890b7fSAlex Zinenko 
234e3890b7fSAlex Zinenko   if (getFailAfterErase())
2351d45282aSAlex Zinenko     return emitSilenceableError() << "silencable error";
2361d45282aSAlex Zinenko   return DiagnosedSilenceableFailure::success();
237e3890b7fSAlex Zinenko }
238e3890b7fSAlex Zinenko 
applyToOne(Operation * target,SmallVectorImpl<Operation * > & results,transform::TransformState & state)23952307109SNicolas Vasilache DiagnosedSilenceableFailure mlir::test::TestWrongNumberOfResultsOp::applyToOne(
24052307109SNicolas Vasilache     Operation *target, SmallVectorImpl<Operation *> &results,
24152307109SNicolas Vasilache     transform::TransformState &state) {
24252307109SNicolas Vasilache   OperationState opState(target->getLoc(), "foo");
24352307109SNicolas Vasilache   results.push_back(OpBuilder(target).create(opState));
24452307109SNicolas Vasilache   return DiagnosedSilenceableFailure::success();
245f439b319SNicolas Vasilache }
246f439b319SNicolas Vasilache 
24752307109SNicolas Vasilache DiagnosedSilenceableFailure
applyToOne(Operation * target,SmallVectorImpl<Operation * > & results,transform::TransformState & state)2484c7225d1SNicolas Vasilache mlir::test::TestWrongNumberOfMultiResultsOp::applyToOne(
24952307109SNicolas Vasilache     Operation *target, SmallVectorImpl<Operation *> &results,
25052307109SNicolas Vasilache     transform::TransformState &state) {
2514c7225d1SNicolas Vasilache   static int count = 0;
25252307109SNicolas Vasilache   if (count++ == 0) {
25352307109SNicolas Vasilache     OperationState opState(target->getLoc(), "foo");
25452307109SNicolas Vasilache     results.push_back(OpBuilder(target).create(opState));
25552307109SNicolas Vasilache   }
25652307109SNicolas Vasilache   return DiagnosedSilenceableFailure::success();
2574c7225d1SNicolas Vasilache }
2584c7225d1SNicolas Vasilache 
25952307109SNicolas Vasilache DiagnosedSilenceableFailure
applyToOne(Operation * target,SmallVectorImpl<Operation * > & results,transform::TransformState & state)2604c7225d1SNicolas Vasilache mlir::test::TestCorrectNumberOfMultiResultsOp::applyToOne(
26152307109SNicolas Vasilache     Operation *target, SmallVectorImpl<Operation *> &results,
26252307109SNicolas Vasilache     transform::TransformState &state) {
26352307109SNicolas Vasilache   OperationState opState(target->getLoc(), "foo");
26452307109SNicolas Vasilache   results.push_back(OpBuilder(target).create(opState));
26552307109SNicolas Vasilache   results.push_back(OpBuilder(target).create(opState));
26652307109SNicolas Vasilache   return DiagnosedSilenceableFailure::success();
26752307109SNicolas Vasilache }
26852307109SNicolas Vasilache 
26952307109SNicolas Vasilache DiagnosedSilenceableFailure
applyToOne(Operation * target,SmallVectorImpl<Operation * > & results,transform::TransformState & state)27052307109SNicolas Vasilache mlir::test::TestMixedNullAndNonNullResultsOp::applyToOne(
27152307109SNicolas Vasilache     Operation *target, SmallVectorImpl<Operation *> &results,
27252307109SNicolas Vasilache     transform::TransformState &state) {
27352307109SNicolas Vasilache   OperationState opState(target->getLoc(), "foo");
27452307109SNicolas Vasilache   results.push_back(nullptr);
27552307109SNicolas Vasilache   results.push_back(OpBuilder(target).create(opState));
27652307109SNicolas Vasilache   return DiagnosedSilenceableFailure::success();
2774c7225d1SNicolas Vasilache }
2784c7225d1SNicolas Vasilache 
27969c8319eSNicolas Vasilache DiagnosedSilenceableFailure
applyToOne(Operation * target,SmallVectorImpl<Operation * > & results,transform::TransformState & state)28069c8319eSNicolas Vasilache mlir::test::TestMixedSuccessAndSilenceableOp::applyToOne(
28169c8319eSNicolas Vasilache     Operation *target, SmallVectorImpl<Operation *> &results,
28269c8319eSNicolas Vasilache     transform::TransformState &state) {
28369c8319eSNicolas Vasilache   if (target->hasAttr("target_me"))
28469c8319eSNicolas Vasilache     return DiagnosedSilenceableFailure::success();
28569c8319eSNicolas Vasilache   return emitDefaultSilenceableFailure(target);
28669c8319eSNicolas Vasilache }
28769c8319eSNicolas Vasilache 
28800d1a1a2SAlex Zinenko DiagnosedSilenceableFailure
apply(transform::TransformResults & results,transform::TransformState & state)28900d1a1a2SAlex Zinenko mlir::test::TestPrintNumberOfAssociatedPayloadIROps::apply(
29000d1a1a2SAlex Zinenko     transform::TransformResults &results, transform::TransformState &state) {
29100d1a1a2SAlex Zinenko   emitRemark() << state.getPayloadOps(getHandle()).size();
29200d1a1a2SAlex Zinenko   return DiagnosedSilenceableFailure::success();
29300d1a1a2SAlex Zinenko }
29400d1a1a2SAlex Zinenko 
getEffects(SmallVectorImpl<MemoryEffects::EffectInstance> & effects)29500d1a1a2SAlex Zinenko void mlir::test::TestPrintNumberOfAssociatedPayloadIROps::getEffects(
29600d1a1a2SAlex Zinenko     SmallVectorImpl<MemoryEffects::EffectInstance> &effects) {
29700d1a1a2SAlex Zinenko   transform::onlyReadsHandle(getHandle(), effects);
29800d1a1a2SAlex Zinenko }
29900d1a1a2SAlex Zinenko 
300d064c480SAlex Zinenko namespace {
301d064c480SAlex Zinenko /// Test extension of the Transform dialect. Registers additional ops and
302d064c480SAlex Zinenko /// declares PDL as dependent dialect since the additional ops are using PDL
303d064c480SAlex Zinenko /// types for operands and results.
304d064c480SAlex Zinenko class TestTransformDialectExtension
305d064c480SAlex Zinenko     : public transform::TransformDialectExtension<
306d064c480SAlex Zinenko           TestTransformDialectExtension> {
307d064c480SAlex Zinenko public:
308333ee218SAlex Zinenko   using Base::Base;
309333ee218SAlex Zinenko 
init()310333ee218SAlex Zinenko   void init() {
311d064c480SAlex Zinenko     declareDependentDialect<pdl::PDLDialect>();
312d064c480SAlex Zinenko     registerTransformOps<TestTransformOp,
31330f22429SAlex Zinenko                          TestTransformUnrestrictedOpNoInterface,
314d064c480SAlex Zinenko #define GET_OP_LIST
315d064c480SAlex Zinenko #include "TestTransformDialectExtension.cpp.inc"
316d064c480SAlex Zinenko                          >();
317d064c480SAlex Zinenko   }
318d064c480SAlex Zinenko };
319d064c480SAlex Zinenko } // namespace
320d064c480SAlex Zinenko 
321d064c480SAlex Zinenko #define GET_OP_CLASSES
322d064c480SAlex Zinenko #include "TestTransformDialectExtension.cpp.inc"
323d064c480SAlex Zinenko 
registerTestTransformDialectExtension(DialectRegistry & registry)324d064c480SAlex Zinenko void ::test::registerTestTransformDialectExtension(DialectRegistry &registry) {
325d064c480SAlex Zinenko   registry.addExtensions<TestTransformDialectExtension>();
326d064c480SAlex Zinenko }
327