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 ®istry) {
325d064c480SAlex Zinenko registry.addExtensions<TestTransformDialectExtension>();
326d064c480SAlex Zinenko }
327