//===- TestTransformDialectExtension.td --------------------*- tablegen -*-===// // // 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 // //===----------------------------------------------------------------------===// // // This file declares the operations that are injected into the Transform // dialect through the extension mechanism, as a test. // //===----------------------------------------------------------------------===// #ifndef MLIR_TESTTRANSFORMDIALECTEXTENSION_TD #define MLIR_TESTTRANSFORMDIALECTEXTENSION_TD include "mlir/Interfaces/SideEffectInterfaces.td" include "mlir/IR/AttrTypeBase.td" include "mlir/IR/OpBase.td" include "mlir/Dialect/Transform/Interfaces/MatchInterfaces.td" include "mlir/Dialect/Transform/IR/TransformDialect.td" include "mlir/Dialect/Transform/Interfaces/TransformInterfaces.td" include "mlir/Dialect/PDL/IR/PDLTypes.td" def TestTransformTestDialectHandleType : TypeDef]> { let description = [{Handle pointing to an op from the Test dialect.}]; let mnemonic = "test_dialect_op"; let assemblyFormat = ""; } def TestTransformTestDialectParamType : TypeDef]> { let description = [{ Parameter associated with an i32 attribute for testing purposes. }]; let mnemonic = "test_dialect_param"; let assemblyFormat = ""; } def TestProduceSelfHandleOrForwardOperandOp : Op, DeclareOpInterfaceMethods]> { let arguments = (ins Optional:$operand); let results = (outs TransformHandleTypeInterface:$res); let assemblyFormat = "($operand^)? attr-dict `:` functional-type($operand, $res)"; let cppNamespace = "::mlir::test"; } def TestProduceValueHandleToSelfOperand : Op, DeclareOpInterfaceMethods]> { let arguments = (ins TransformHandleTypeInterface:$in); let results = (outs TransformValueHandleTypeInterface:$out); let assemblyFormat = "$in attr-dict `:` functional-type(operands, results)"; let cppNamespace = "::mlir::test"; } def TestProduceValueHandleToResult : Op]> { let arguments = (ins TransformHandleTypeInterface:$in, I64Attr:$number); let results = (outs TransformValueHandleTypeInterface:$out); let assemblyFormat = "$in `,` $number attr-dict `:` functional-type(operands, results)"; let cppNamespace = "::mlir::test"; let extraClassDeclaration = [{ ::mlir::DiagnosedSilenceableFailure applyToOne( ::mlir::transform::TransformRewriter &rewriter, ::mlir::Operation *target, ::mlir::transform::ApplyToEachResultList &results, ::mlir::transform::TransformState &state); }]; } def TestProduceValueHandleToArgumentOfParentBlock : Op]> { let arguments = (ins TransformHandleTypeInterface:$in, I64Attr:$number); let results = (outs TransformValueHandleTypeInterface:$out); let assemblyFormat = "$in `,` $number attr-dict `:` functional-type(operands, results)"; let cppNamespace = "::mlir::test"; let extraClassDeclaration = [{ ::mlir::DiagnosedSilenceableFailure applyToOne( ::mlir::transform::TransformRewriter &rewriter, ::mlir::Operation *target, ::mlir::transform::ApplyToEachResultList &results, ::mlir::transform::TransformState &state); }]; } def TestConsumeOperand : Op, DeclareOpInterfaceMethods]> { let arguments = (ins Transform_AnyHandleOrParamType:$operand, Optional:$second_operand, UnitAttr:$allow_repeated_handles); let assemblyFormat = "$operand (`,` $second_operand^)? attr-dict `:` type($operand)" "(`,` type($second_operand)^)?"; let cppNamespace = "::mlir::test"; } def TestConsumeOperandEach : Op { let arguments = (ins TransformHandleTypeInterface:$target); let assemblyFormat = "$target attr-dict `:` type($target)"; let cppNamespace = "::mlir::test"; let extraClassDeclaration = [{ ::mlir::DiagnosedSilenceableFailure applyToOne( ::mlir::transform::TransformRewriter &rewriter, ::mlir::Operation *target, ::mlir::transform::ApplyToEachResultList &results, ::mlir::transform::TransformState &state) { return ::mlir::DiagnosedSilenceableFailure::success(); } }]; } def TestConsumeOperandOfOpKindOrFail : Op, DeclareOpInterfaceMethods]> { let arguments = (ins TransformHandleTypeInterface:$operand, StrAttr:$op_kind); let assemblyFormat = "$operand `,` $op_kind attr-dict `:` type($operand)"; let cppNamespace = "::mlir::test"; } def TestSucceedIfOperandOfOpKind : Op]> { let arguments = (ins TransformHandleTypeInterface:$operand_handle, StrAttr:$op_kind); let assemblyFormat = "$operand_handle `,` $op_kind attr-dict `:` type($operand_handle)"; let extraClassDeclaration = SingleOpMatcher.extraDeclaration; let cppNamespace = "::mlir::test"; } def TestAddTestExtensionOp : Op, NoMemoryEffect]> { let arguments = (ins StrAttr:$message); let assemblyFormat = "$message attr-dict"; let cppNamespace = "::mlir::test"; } def TestCheckIfTestExtensionPresentOp : Op, DeclareOpInterfaceMethods]> { let arguments = (ins TransformHandleTypeInterface:$operand); let assemblyFormat = "$operand attr-dict `:` type($operand)"; let cppNamespace = "::mlir::test"; } def TestRemapOperandPayloadToSelfOp : Op, DeclareOpInterfaceMethods]> { let arguments = (ins TransformHandleTypeInterface:$operand); let results = (outs Optional:$out); let assemblyFormat = "$operand attr-dict `:` functional-type($operand, $out)"; let cppNamespace = "::mlir::test"; } def TestRemoveTestExtensionOp : Op, NoMemoryEffect]> { let assemblyFormat = "attr-dict"; let cppNamespace = "::mlir::test"; } def TestReversePayloadOpsOp : Op]> { let arguments = (ins TransformHandleTypeInterface:$target); let results = (outs TransformHandleTypeInterface:$result); let assemblyFormat = "$target attr-dict `:` functional-type(operands, results)"; let cppNamespace = "::mlir::test"; } def TestTransformOpWithRegions : Op, DeclareOpInterfaceMethods]> { let regions = (region AnyRegion:$first, AnyRegion:$second); let assemblyFormat = "attr-dict-with-keyword regions"; let cppNamespace = "::mlir::test"; } def TestBranchingTransformOpTerminator : Op, DeclareOpInterfaceMethods]> { let successors = (successor VariadicSuccessor:$succ); let cppNamespace = "::mlir::test"; } def TestEmitRemarkAndEraseOperandOp : Op, DeclareOpInterfaceMethods, FunctionalStyleTransformOpTrait]> { let arguments = (ins TransformHandleTypeInterface:$target, StrAttr:$remark, UnitAttr:$fail_after_erase); let assemblyFormat = "$target `,` $remark attr-dict `:` type($target)"; let cppNamespace = "::mlir::test"; } def TestWrongNumberOfResultsOp : Op { let arguments = (ins TransformHandleTypeInterface:$target); let results = (outs TransformHandleTypeInterface:$a, TransformHandleTypeInterface:$b, TransformHandleTypeInterface:$c); let assemblyFormat = "$target attr-dict `:` functional-type(operands, results)"; let cppNamespace = "::mlir::test"; let extraClassDeclaration = [{ ::mlir::DiagnosedSilenceableFailure applyToOne( ::mlir::transform::TransformRewriter &rewriter, ::mlir::Operation * target, ::mlir::transform::ApplyToEachResultList &results, ::mlir::transform::TransformState &state); }]; } def TestWrongNumberOfMultiResultsOp : Op { let arguments = (ins TransformHandleTypeInterface:$target); let results = (outs TransformHandleTypeInterface:$result); let assemblyFormat = "$target attr-dict `:` functional-type($target, $result)"; let cppNamespace = "::mlir::test"; let extraClassDeclaration = [{ ::mlir::DiagnosedSilenceableFailure applyToOne( ::mlir::transform::TransformRewriter &rewriter, ::mlir::Operation * target, ::mlir::transform::ApplyToEachResultList &results, ::mlir::transform::TransformState &state); }]; } def TestCorrectNumberOfMultiResultsOp : Op { let arguments = (ins TransformHandleTypeInterface:$target); let results = (outs TransformHandleTypeInterface:$result1, TransformHandleTypeInterface:$result2); let assemblyFormat = "$target attr-dict `:` functional-type(operands, results)"; let cppNamespace = "::mlir::test"; let extraClassDeclaration = [{ ::mlir::DiagnosedSilenceableFailure applyToOne( ::mlir::transform::TransformRewriter &rewriter, ::mlir::Operation * target, ::mlir::transform::ApplyToEachResultList &results, ::mlir::transform::TransformState &state); }]; } def TestMixedNullAndNonNullResultsOp : Op { let arguments = (ins TransformHandleTypeInterface:$target); let results = (outs TransformHandleTypeInterface:$null, TransformHandleTypeInterface:$non_null); let assemblyFormat = "$target attr-dict `:` functional-type(operands, results)"; let cppNamespace = "::mlir::test"; let extraClassDeclaration = [{ ::mlir::DiagnosedSilenceableFailure applyToOne( ::mlir::transform::TransformRewriter &rewriter, ::mlir::Operation * target, ::mlir::transform::ApplyToEachResultList &results, ::mlir::transform::TransformState &state); }]; } def TestMixedSuccessAndSilenceableOp : Op { let arguments = (ins TransformHandleTypeInterface:$target); let results = (outs); let assemblyFormat = "$target attr-dict `:` type($target)"; let cppNamespace = "::mlir::test"; let extraClassDeclaration = [{ ::mlir::DiagnosedSilenceableFailure applyToOne( ::mlir::transform::TransformRewriter &rewriter, ::mlir::Operation * target, ::mlir::transform::ApplyToEachResultList &results, ::mlir::transform::TransformState &state); }]; } def TestCopyPayloadOp : Op, DeclareOpInterfaceMethods]> { let arguments = (ins TransformHandleTypeInterface:$handle); let results = (outs TransformHandleTypeInterface:$copy); let cppNamespace = "::mlir::test"; let assemblyFormat = "$handle attr-dict `:` functional-type(operands, results)"; } def TestReportNumberOfTrackedHandlesNestedUnder : Op, DeclareOpInterfaceMethods]> { let arguments = (ins TransformHandleTypeInterface:$target); let assemblyFormat = "$target attr-dict `:` type($target)"; let cppNamespace = "::mlir::test"; } def TestAddToParamOp : Op]> { let arguments = (ins Optional:$param, I32Attr:$addendum); let results = (outs TestTransformTestDialectParamType:$result); let assemblyFormat = "($param^ `,`)? $addendum attr-dict"; let cppNamespace = "::mlir::test"; } def TestProduceParamWithNumberOfTestOps : Op]> { let arguments = (ins TransformHandleTypeInterface:$handle); let results = (outs TestTransformTestDialectParamType:$result); let assemblyFormat = "$handle attr-dict `:` type($handle)"; let cppNamespace = "::mlir::test"; } def TestProduceParamOp : Op]> { let arguments = (ins AnyAttr:$attr); let results = (outs TransformParamTypeInterface:$result); let assemblyFormat = "`(` $attr `)` attr-dict `:` type($result)"; let cppNamespace = "::mlir::test"; } def TestProduceTransformParamOrForwardOperandOp : Op, TransformEachOpTrait, TransformOpInterface]> { let arguments = (ins TransformHandleTypeInterface:$in, UnitAttr:$first_result_is_param, UnitAttr:$first_result_is_null, UnitAttr:$second_result_is_handle); let results = (outs AnyType:$out, TransformParamTypeInterface:$param); let assemblyFormat = "$in attr-dict `:` functional-type(operands, results)"; let cppNamespace = "::mlir::test"; let extraClassDeclaration = [{ ::mlir::DiagnosedSilenceableFailure applyToOne( ::mlir::transform::TransformRewriter &rewriter, ::mlir::Operation *target, ::mlir::transform::ApplyToEachResultList &results, ::mlir::transform::TransformState &state); }]; } def TestProduceNullPayloadOp : Op, DeclareOpInterfaceMethods]> { let results = (outs TransformHandleTypeInterface:$out); let assemblyFormat = "attr-dict `:` type($out)"; let cppNamespace = "::mlir::test"; } def TestProduceEmptyPayloadOp : Op, MemoryEffectsOpInterface, FunctionalStyleTransformOpTrait]> { let results = (outs TransformHandleTypeInterface:$out); let assemblyFormat = "attr-dict `:` type($out)"; let cppNamespace = "::mlir::test"; } def TestProduceNullParamOp : Op, DeclareOpInterfaceMethods]> { let results = (outs TransformParamTypeInterface:$out); let assemblyFormat = "attr-dict `:` type($out)"; let cppNamespace = "::mlir::test"; } def TestProduceNullValueOp : Op, DeclareOpInterfaceMethods]> { let results = (outs TransformValueHandleTypeInterface:$out); let assemblyFormat = "attr-dict `:` type($out)"; let cppNamespace = "::mlir::test"; } def TestRequiredMemoryEffectsOp : Op, DeclareOpInterfaceMethods]> { let arguments = (ins TransformHandleTypeInterface:$in, UnitAttr:$has_operand_effect, UnitAttr:$has_result_effect, UnitAttr:$modifies_payload); let results = (outs TransformHandleTypeInterface:$out); let assemblyFormat = "$in attr-dict `:` functional-type(operands, results)"; let cppNamespace = "::mlir::test"; } // This op is used as a payload op. It must be a registered op, so that it can // be created with "RewriterBase::replaceOpWithNewOp" (needed for a test case). // Since only TransformOpInterface can be injected into the transform dialect, // this op implements the interface, even though it is not used as a transform // op. def TestDummyPayloadOp : Op, TransformOpInterface]> { let arguments = (ins Variadic:$args, UnitAttr:$fail_to_verify); let results = (outs Variadic:$outs); let assemblyFormat = "$args attr-dict `:` functional-type(operands, results)"; let cppNamespace = "::mlir::test"; let hasVerifier = 1; let extraClassDeclaration = [{ DiagnosedSilenceableFailure apply(transform::TransformRewriter &rewriter, transform::TransformResults &results, transform::TransformState &state) { llvm_unreachable("op should not be used as a transform"); return DiagnosedSilenceableFailure::definiteFailure(); } }]; } def TestTrackedRewriteOp : Op, DeclareOpInterfaceMethods]> { let arguments = (ins TransformHandleTypeInterface:$in); let results = (outs); let assemblyFormat = "$in attr-dict `:` functional-type(operands, results)"; let cppNamespace = "::mlir::test"; } def ApplyTestPatternsOp : Op]> { let arguments = (ins); let results = (outs); let assemblyFormat = "attr-dict"; let cppNamespace = "::mlir::test"; } def ApplyTestConversionPatternsOp : Op]> { let arguments = (ins); let results = (outs); let assemblyFormat = "attr-dict"; let cppNamespace = "::mlir::test"; } def TestTypeConverterOp : Op]> { let arguments = (ins); let results = (outs); let assemblyFormat = "attr-dict"; let cppNamespace = "::mlir::test"; } def TestReEnterRegionOp : Op, DeclareOpInterfaceMethods]> { let arguments = (ins Variadic:$args); let regions = (region SizedRegion<1>:$body); let assemblyFormat = "($args^ `:` type($args))? attr-dict-with-keyword regions"; let cppNamespace = "::mlir::test"; let hasVerifier = 1; } def TestNotifyPayloadOpReplacedOp : Op, DeclareOpInterfaceMethods]> { let arguments = (ins TransformHandleTypeInterface:$original, TransformHandleTypeInterface:$replacement); let results = (outs); let assemblyFormat = "$original `,` $replacement attr-dict `:` functional-type(operands, results)"; let cppNamespace = "::mlir::test"; } def TestProduceInvalidIR : Op, TransformOpInterface, TransformEachOpTrait]> { let arguments = (ins TransformHandleTypeInterface:$target); let results = (outs); let assemblyFormat = "$target attr-dict `:` type($target)"; let cppNamespace = "::mlir::test"; let extraClassDeclaration = [{ ::mlir::DiagnosedSilenceableFailure applyToOne( ::mlir::transform::TransformRewriter &rewriter, ::mlir::Operation *target, ::mlir::transform::ApplyToEachResultList &results, ::mlir::transform::TransformState &state); }]; } def TestInitializerExtensionOp : Op, NoMemoryEffect]> { let arguments = (ins StrAttr:$type); let assemblyFormat = "$type attr-dict"; let cppNamespace = "::mlir::test"; } #endif // MLIR_TESTTRANSFORMDIALECTEXTENSION_TD