// RUN: mlir-tblgen -gen-op-decls -I %S/../../include %s -o=%t // This file contains tests for the specification of the declarative op format. include "mlir/IR/OpBase.td" include "mlir/Interfaces/InferTypeOpInterface.td" def TestDialect : Dialect { let name = "test"; } class TestFormat_Op traits = []> : Op { let assemblyFormat = fmt; } //===----------------------------------------------------------------------===// // Directives //===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===// // attr-dict // CHECK-NOT: error def DirectiveAttrDictValidA : TestFormat_Op<[{ attr-dict }]>; def DirectiveAttrDictValidB : TestFormat_Op<[{ attr-dict-with-keyword }]>; //===----------------------------------------------------------------------===// // custom // CHECK-NOT: error def DirectiveCustomValidA : TestFormat_Op<[{ custom($operand) attr-dict }]>, Arguments<(ins Optional:$operand)>; def DirectiveCustomValidB : TestFormat_Op<[{ custom($operand, type($operand), type($result)) attr-dict }]>, Arguments<(ins I64:$operand)>, Results<(outs I64:$result)>; def DirectiveCustomValidC : TestFormat_Op<[{ custom($attr) attr-dict }]>, Arguments<(ins I64Attr:$attr)>; def DirectiveCustomValidD : TestFormat_Op<[{ (`(` custom($operand)^ `)`)? attr-dict }]>, Arguments<(ins Optional:$operand)>; def DirectiveCustomValidE : TestFormat_Op<[{ custom(prop-dict) attr-dict }]>, Arguments<(ins UnitAttr:$flag)>; //===----------------------------------------------------------------------===// // functional-type // CHECK-NOT: error def DirectiveFunctionalTypeValid : TestFormat_Op<[{ functional-type(operands, results) attr-dict }]>; //===----------------------------------------------------------------------===// // operands // CHECK-NOT: error: def DirectiveOperandsValid : TestFormat_Op<[{ operands attr-dict }]>; //===----------------------------------------------------------------------===// // regions // CHECK-NOT: error: def DirectiveRegionsValid : TestFormat_Op<[{ regions attr-dict }]>; //===----------------------------------------------------------------------===// // results // CHECK-NOT: error: def DirectiveResultsInvalidA : TestFormat_Op<[{ type(results) attr-dict }]>; //===----------------------------------------------------------------------===// // successors // CHECK-NOT: error: def DirectiveSuccessorsInvalidA : TestFormat_Op<[{ successors attr-dict }]>; //===----------------------------------------------------------------------===// // type // CHECK-NOT: error: def DirectiveTypeValid : TestFormat_Op<[{ type(operands) attr-dict }]>; //===----------------------------------------------------------------------===// // Literals //===----------------------------------------------------------------------===// // CHECK-NOT: error def LiteralValid : TestFormat_Op<[{ `_` `:` `,` `=` `<` `>` `(` `)` `[` `]` `?` `+` `*` ` ` `` `->` `\n` `abc$._` attr-dict }]>; //===----------------------------------------------------------------------===// // OIList Element //===----------------------------------------------------------------------===// // CHECK-NOT: error def OIListTrivial : TestFormat_Op<[{ oilist(`keyword` `(` `)` | `otherkeyword` `(` `)`) attr-dict }]>; def OIListSimple : TestFormat_Op<[{ oilist( `keyword` $arg0 `:` type($arg0) | `otherkeyword` $arg1 `:` type($arg1) | `thirdkeyword` $arg2 `:` type($arg2) ) attr-dict }], [AttrSizedOperandSegments]>, Arguments<(ins Optional:$arg0, Optional:$arg1, Optional:$arg2)>; def OIListVariadic : TestFormat_Op<[{ oilist( `keyword` `(` $args0 `:` type($args0) `)` | `otherkeyword` `(` $args1 `:` type($args1) `)` | `thirdkeyword` `(` $args2 `:` type($args2) `)`) attr-dict }], [AttrSizedOperandSegments]>, Arguments<(ins Variadic:$args0, Variadic:$args1, Variadic:$args2)>; def OIListCustom : TestFormat_Op<[{ oilist( `private` `(` $arg0 `:` type($arg0) `)` | `nowait` | `reduction` custom($arg1, type($arg1))) attr-dict }], [AttrSizedOperandSegments]>, Arguments<(ins Optional:$arg0, Optional:$arg1)>; //===----------------------------------------------------------------------===// // Optional Groups //===----------------------------------------------------------------------===// // CHECK-NOT: error def OptionalValidA : TestFormat_Op<[{ (` ` `` $arg^)? attr-dict }]>, Arguments<(ins Optional:$arg)>; //===----------------------------------------------------------------------===// // Strings //===----------------------------------------------------------------------===// // CHECK-NOT: error def StringInvalidA : TestFormat_Op<[{ custom("foo") attr-dict }]>; //===----------------------------------------------------------------------===// // Variables //===----------------------------------------------------------------------===// // CHECK-NOT: error: def VariableValidA : TestFormat_Op<[{ $attr `:` attr-dict }]>, Arguments<(ins OptionalAttr:$attr)>; def VariableValidB : TestFormat_Op<[{ (`foo` $attr^)? `:` attr-dict }]>, Arguments<(ins OptionalAttr:$attr)>; //===----------------------------------------------------------------------===// // Coverage Checks //===----------------------------------------------------------------------===// // CHECK-NOT: error def ZCoverageValidA : TestFormat_Op<[{ $operand type($operand) type($result) attr-dict }]>, Arguments<(ins AnyMemRef:$operand)>, Results<(outs AnyMemRef:$result)>; def ZCoverageValidB : TestFormat_Op<[{ $operand type(operands) type(results) attr-dict }]>, Arguments<(ins AnyMemRef:$operand)>, Results<(outs AnyMemRef:$result)>; def ZCoverageValidC : TestFormat_Op<[{ operands functional-type(operands, results) attr-dict }]>, Arguments<(ins AnyMemRef:$operand)>, Results<(outs AnyMemRef:$result)>; // Check that we can infer type equalities from certain traits. def ZCoverageValidD : TestFormat_Op<[{ operands type($result) attr-dict }], [SameOperandsAndResultType]>, Arguments<(ins AnyMemRef)>, Results<(outs AnyMemRef:$result)>; def ZCoverageValidE : TestFormat_Op<[{ $operand type($operand) attr-dict }], [SameOperandsAndResultType]>, Arguments<(ins AnyMemRef:$operand)>, Results<(outs AnyMemRef)>; def ZCoverageValidF : TestFormat_Op<[{ operands type($other) attr-dict }], [SameTypeOperands]>, Arguments<(ins AnyMemRef:$operand, AnyMemRef:$other)>; def ZCoverageValidG : TestFormat_Op<[{ operands type($other) attr-dict }], [AllTypesMatch<["operand", "other"]>]>, Arguments<(ins AnyMemRef:$operand, AnyMemRef:$other)>; def ZCoverageValidH : TestFormat_Op<[{ operands type($result) attr-dict }], [AllTypesMatch<["operand", "result"]>]>, Arguments<(ins AnyMemRef:$operand)>, Results<(outs AnyMemRef:$result)>; def ZCoverageValidI : TestFormat_Op<[{ operands type(operands) attr-dict }], [InferTypeOpInterface]>, Arguments<(ins Variadic:$inputs)>, Results<(outs I64:$result)>;