132 lines · plain
1// RUN: mlir-tblgen -gen-op-defs -I %S/../../include %s | FileCheck %s2 3include "mlir/IR/OpBase.td"4 5def TestDialect : Dialect {6 let name = "test";7}8class TestFormat_Op<string fmt, list<Trait> traits = []>9 : Op<TestDialect, "format_op", traits> {10 let assemblyFormat = fmt;11}12 13//===----------------------------------------------------------------------===//14// Directives15//===----------------------------------------------------------------------===//16 17//===----------------------------------------------------------------------===//18// custom19//===----------------------------------------------------------------------===//20 21// CHECK-LABEL: CustomStringLiteralA::parse22// CHECK: parseFoo({{.*}}, parser.getBuilder().getI1Type())23// CHECK-LABEL: CustomStringLiteralA::print24// CHECK: printFoo({{.*}}, ::mlir::Builder(getContext()).getI1Type())25def CustomStringLiteralA : TestFormat_Op<[{26 custom<Foo>("$_builder.getI1Type()") attr-dict27}]>;28 29// CHECK-LABEL: CustomStringLiteralB::parse30// CHECK: parseFoo({{.*}}, IndexType::get(parser.getContext()))31// CHECK-LABEL: CustomStringLiteralB::print32// CHECK: printFoo({{.*}}, IndexType::get(getContext()))33def CustomStringLiteralB : TestFormat_Op<[{34 custom<Foo>("IndexType::get($_ctxt)") attr-dict35}]>;36 37// CHECK-LABEL: CustomStringLiteralC::parse38// CHECK: parseFoo({{.*}}, parser.getBuilder().getStringAttr("foo"))39// CHECK-LABEL: CustomStringLiteralC::print40// CHECK: printFoo({{.*}}, ::mlir::Builder(getContext()).getStringAttr("foo"))41def CustomStringLiteralC : TestFormat_Op<[{42 custom<Foo>("$_builder.getStringAttr(\"foo\")") attr-dict43}]>;44 45// CHECK-LABEL: CustomStringLiteralD::parse46// CHECK: parseFoo({{.*}}, result)47// CHECK-LABEL: CustomStringLiteralD::print48// CHECK: printFoo({{.*}}, getProperties())49def CustomStringLiteralD : TestFormat_Op<[{50 custom<Foo>(prop-dict) attr-dict51}]>;52 53//===----------------------------------------------------------------------===//54// Optional Groups55//===----------------------------------------------------------------------===//56 57// CHECK-LABEL: OptionalGroupA::parse58// CHECK: if (::mlir::succeeded(parser.parseOptionalQuestion())59// CHECK-NEXT: else60// CHECK: parser.parseOptionalOperand61// CHECK-LABEL: OptionalGroupA::print62// CHECK: if (!getA())63// CHECK-NEXT: odsPrinter << ' ' << "?";64// CHECK-NEXT: else65// CHECK: odsPrinter << value;66def OptionalGroupA : TestFormat_Op<[{67 (`?`) : ($a^)? attr-dict68}]>, Arguments<(ins Optional<I1>:$a)>;69 70// CHECK-LABEL: OptionalGroupB::parse71// CHECK: if (::mlir::succeeded(parser.parseOptionalKeyword("foo")))72// CHECK-NEXT: else73// CHECK-NEXT: result.getOrAddProperties<OptionalGroupB::Properties>().a = parser.getBuilder().getUnitAttr()74// CHECK: parser.parseKeyword("bar")75// CHECK-LABEL: OptionalGroupB::print76// CHECK: if (!(getAAttr() && getAAttr() != ((false) ? ::mlir::OpBuilder((*this)->getContext()).getUnitAttr() : nullptr)))77// CHECK-NEXT: odsPrinter << ' ' << "foo"78// CHECK-NEXT: else79// CHECK-NEXT: odsPrinter << ' ' << "bar"80def OptionalGroupB : TestFormat_Op<[{81 (`foo`) : (`bar` $a^)? attr-dict82}]>, Arguments<(ins UnitAttr:$a)>;83 84// Optional group anchored on a default-valued attribute:85// CHECK-LABEL: OptionalGroupC::parse86 87// CHECK: if (getAAttr() != ::mlir::OpBuilder((*this)->getContext()).getStringAttr("default")) {88// CHECK-NEXT: odsPrinter << ' ';89// CHECK-NEXT: odsPrinter.printAttributeWithoutType(getAAttr());90// CHECK-NEXT: }91def OptionalGroupC : TestFormat_Op<[{92 ($a^)? attr-dict93}]>, Arguments<(ins DefaultValuedStrAttr<StrAttr, "default">:$a)>;94 95// CHECK-LABEL: OptionalGroupD::parse96// CHECK: if (auto optResult = [&]() -> ::mlir::OptionalParseResult {97// CHECK: auto odsResult = parseCustom(parser, aOperand, bOperand);98// CHECK: if (!odsResult.has_value()) return {};99// CHECK: if (::mlir::failed(*odsResult)) return ::mlir::failure();100// CHECK: return ::mlir::success();101// CHECK: }(); optResult.has_value() && ::mlir::failed(*optResult)) {102// CHECK: return ::mlir::failure();103// CHECK: } else if (optResult.has_value()) {104 105// CHECK-LABEL: OptionalGroupD::print106// CHECK-NEXT: if (((getA()) || (getB()))) {107// CHECK-NEXT: odsPrinter << ' ';108// CHECK-NEXT: printCustom109def OptionalGroupD : TestFormat_Op<[{110 (custom<Custom>($a, $b)^)? attr-dict111}], [AttrSizedOperandSegments]>, Arguments<(ins Optional<I64>:$a, Optional<I64>:$b)>;112 113// CHECK-LABEL: RegionRef::parse114// CHECK: auto odsResult = parseCustom(parser, *bodyRegion);115// CHECK-LABEL: RegionRef::print116// CHECK: printCustom(_odsPrinter, *this, getBody());117def RegionRef : TestFormat_Op<[{118 $body custom<Custom>(ref($body)) attr-dict119}]> {120 let regions = (region AnyRegion:$body);121}122 123// CHECK-LABEL: SuccessorRef::parse124// CHECK: auto odsResult = parseCustom(parser, successorSuccessor);125// CHECK-LABEL: SuccessorRef::print126// CHECK: printCustom(_odsPrinter, *this, getSuccessor());127def SuccessorRef : TestFormat_Op<[{128 $successor custom<Custom>(ref($successor)) attr-dict129}]> {130 let successors = (successor AnySuccessor:$successor);131}132