1//===-- python_test_ops.td - Python test Op definitions ----*- tablegen -*-===// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8 9#ifndef PYTHON_TEST_OPS 10#define PYTHON_TEST_OPS 11 12include "mlir/IR/AttrTypeBase.td" 13include "mlir/IR/OpBase.td" 14include "mlir/Interfaces/InferTypeOpInterface.td" 15 16def Python_Test_Dialect : Dialect { 17 let name = "python_test"; 18 let cppNamespace = "python_test"; 19 20 let useDefaultTypePrinterParser = 1; 21 let useDefaultAttributePrinterParser = 1; 22} 23 24class TestType<string name, string typeMnemonic> 25 : TypeDef<Python_Test_Dialect, name> { 26 let mnemonic = typeMnemonic; 27} 28 29class TestAttr<string name, string attrMnemonic> 30 : AttrDef<Python_Test_Dialect, name> { 31 let mnemonic = attrMnemonic; 32} 33 34class TestOp<string mnemonic, list<Trait> traits = []> 35 : Op<Python_Test_Dialect, mnemonic, traits> { 36 let assemblyFormat = "operands attr-dict functional-type(operands, results)"; 37} 38 39//===----------------------------------------------------------------------===// 40// Type definitions. 41//===----------------------------------------------------------------------===// 42 43def TestType : TestType<"TestType", "test_type">; 44 45//===----------------------------------------------------------------------===// 46// Attribute definitions. 47//===----------------------------------------------------------------------===// 48 49def TestAttr : TestAttr<"TestAttr", "test_attr">; 50 51//===----------------------------------------------------------------------===// 52// Operation definitions. 53//===----------------------------------------------------------------------===// 54 55def AttributedOp : TestOp<"attributed_op"> { 56 let arguments = (ins I32Attr:$mandatory_i32, 57 OptionalAttr<I32Attr>:$optional_i32, 58 UnitAttr:$unit); 59} 60 61def CustomAttributedOp : TestOp<"custom_attributed_op"> { 62 let arguments = (ins TestAttr:$test_attr); 63} 64 65def AttributesOp : TestOp<"attributes_op"> { 66 let arguments = (ins 67 AffineMapArrayAttr:$x_affinemaparr, 68 AffineMapAttr:$x_affinemap, 69 ArrayAttr:$x_arr, 70 BoolArrayAttr:$x_boolarr, 71 BoolAttr:$x_bool, 72 DenseBoolArrayAttr:$x_dboolarr, 73 DenseF32ArrayAttr:$x_df32arr, 74 DenseF64ArrayAttr:$x_df64arr, 75 DenseI16ArrayAttr:$x_df16arr, 76 DenseI32ArrayAttr:$x_di32arr, 77 DenseI64ArrayAttr:$x_di64arr, 78 DenseI8ArrayAttr:$x_di8arr, 79 DictArrayAttr:$x_dictarr, 80 DictionaryAttr:$x_dict, 81 F32ArrayAttr:$x_f32arr, 82 F32Attr:$x_f32, 83 F64ArrayAttr:$x_f64arr, 84 F64Attr:$x_f64, 85 F64ElementsAttr:$x_f64elems, 86 FlatSymbolRefArrayAttr:$x_flatsymrefarr, 87 FlatSymbolRefAttr:$x_flatsymref, 88 I16Attr:$x_i16, 89 I1Attr:$x_i1, 90 I32ArrayAttr:$x_i32arr, 91 I32Attr:$x_i32, 92 I32ElementsAttr:$x_i32elems, 93 I64ArrayAttr:$x_i64arr, 94 I64Attr:$x_i64, 95 I64ElementsAttr:$x_i64elems, 96 I64SmallVectorArrayAttr:$x_i64svecarr, 97 I8Attr:$x_i8, 98 IndexAttr:$x_idx, 99 IndexElementsAttr:$x_idxelems, 100 IndexListArrayAttr:$x_idxlistarr, 101 SI16Attr:$x_si16, 102 SI1Attr:$x_si1, 103 SI32Attr:$x_si32, 104 SI64Attr:$x_si64, 105 SI8Attr:$x_si8, 106 StrArrayAttr:$x_strarr, 107 StrAttr:$x_str, 108 SymbolNameAttr:$x_sym, 109 SymbolRefArrayAttr:$x_symrefarr, 110 SymbolRefAttr:$x_symref, 111 TypeArrayAttr:$x_typearr, 112 TypeAttr:$x_type, 113 UI16Attr:$x_ui16, 114 UI1Attr:$x_ui1, 115 UI32Attr:$x_ui32, 116 UI64Attr:$x_ui64, 117 UI8Attr:$x_ui8, 118 UnitAttr:$x_unit 119 ); 120} 121 122def PropertyOp : TestOp<"property_op"> { 123 let arguments = (ins I32Attr:$property, 124 I32:$idx); 125} 126 127def DummyOp : TestOp<"dummy_op"> { 128} 129 130def InferResultsOp : TestOp<"infer_results_op", [InferTypeOpInterface]> { 131 let arguments = (ins); 132 let results = (outs AnyInteger:$single, AnyInteger:$doubled); 133 134 let extraClassDeclaration = [{ 135 static ::llvm::LogicalResult inferReturnTypes( 136 ::mlir::MLIRContext *context, ::std::optional<::mlir::Location> location, 137 ::mlir::ValueRange operands, ::mlir::DictionaryAttr attributes, 138 ::mlir::OpaqueProperties, 139 ::mlir::RegionRange regions, 140 ::llvm::SmallVectorImpl<::mlir::Type> &inferredReturnTypes) { 141 ::mlir::Builder b(context); 142 inferredReturnTypes.push_back(b.getI32Type()); 143 inferredReturnTypes.push_back(b.getI64Type()); 144 return ::mlir::success(); 145 } 146 }]; 147} 148 149def I32OrF32 : TypeConstraint<Or<[I32.predicate, F32.predicate]>, 150 "i32 or f32">; 151 152def InferResultsVariadicInputsOp : TestOp<"infer_results_variadic_inputs_op", 153 [InferTypeOpInterface, AttrSizedOperandSegments]> { 154 let arguments = (ins Optional<I64>:$single, Optional<I64>:$doubled); 155 let results = (outs I32OrF32:$res); 156 157 let extraClassDeclaration = [{ 158 static ::llvm::LogicalResult inferReturnTypes( 159 ::mlir::MLIRContext *context, ::std::optional<::mlir::Location> location, 160 ::mlir::ValueRange operands, ::mlir::DictionaryAttr attributes, 161 ::mlir::OpaqueProperties, 162 ::mlir::RegionRange regions, 163 ::llvm::SmallVectorImpl<::mlir::Type> &inferredReturnTypes) { 164 ::mlir::Builder b(context); 165 if (operands.size() == 1) 166 inferredReturnTypes.push_back(b.getI32Type()); 167 else if (operands.size() == 2) 168 inferredReturnTypes.push_back(b.getF32Type()); 169 return ::mlir::success(); 170 } 171 }]; 172} 173 174// If all result types are buildable, the InferTypeOpInterface is implied and is 175// autogenerated by C++ ODS. 176def InferResultsImpliedOp : TestOp<"infer_results_implied_op"> { 177 let results = (outs I32:$integer, F64:$flt, Index:$index); 178} 179 180def InferShapedTypeComponentsOp : TestOp<"infer_shaped_type_components_op", 181 [DeclareOpInterfaceMethods<InferShapedTypeOpInterface, 182 ["inferReturnTypeComponents"]>]> { 183 let arguments = (ins AnyTensor:$operand); 184 let results = (outs AnyTensor:$result); 185 186 let extraClassDefinition = [{ 187 ::llvm::LogicalResult $cppClass::inferReturnTypeComponents( 188 ::mlir::MLIRContext *context, ::std::optional<::mlir::Location> location, 189 ::mlir::ValueShapeRange operands, ::mlir::DictionaryAttr attributes, 190 ::mlir::OpaqueProperties properties, ::mlir::RegionRange regions, 191 ::llvm::SmallVectorImpl< 192 ::mlir::ShapedTypeComponents>& inferredShapedTypeComponents) { 193 $cppClass::Adaptor adaptor(operands, attributes, properties, regions); 194 auto operandType = 195 ::llvm::cast<::mlir::ShapedType>(adaptor.getOperand().getType()); 196 if (operandType.hasRank()) { 197 inferredShapedTypeComponents.emplace_back(operandType.getShape(), 198 operandType.getElementType()); 199 } else { 200 inferredShapedTypeComponents.emplace_back(operandType.getElementType()); 201 } 202 return ::mlir::success(); 203 } 204 }]; 205} 206 207def SameOperandAndResultTypeOp : TestOp<"same_operand_and_result_type_op", 208 [SameOperandsAndResultType]> { 209 let arguments = (ins Variadic<AnyType>); 210 let results = (outs AnyType:$one, AnyType:$two); 211} 212 213def FirstAttrDeriveTypeAttrOp : TestOp<"first_attr_derive_type_attr_op", 214 [FirstAttrDerivedResultType]> { 215 let arguments = (ins AnyType:$input, TypeAttr:$type); 216 let results = (outs AnyType:$one, AnyType:$two); 217} 218 219def FirstAttrDeriveAttrOp : TestOp<"first_attr_derive_attr_op", 220 [FirstAttrDerivedResultType]> { 221 let arguments = (ins AnyAttr:$iattr); 222 let results = (outs AnyType:$one, AnyType:$two, AnyType:$three); 223} 224 225def OptionalOperandOp : TestOp<"optional_operand_op"> { 226 let arguments = (ins Optional<AnyType>:$input); 227 let results = (outs I32:$result); 228} 229 230def SameVariadicOperandSizeOp : TestOp<"same_variadic_operand", 231 [SameVariadicOperandSize]> { 232 let arguments = (ins Variadic<AnyType>:$variadic1, AnyType:$non_variadic, 233 Variadic<AnyType>:$variadic2); 234} 235 236// Check different arrangements of variadic groups 237def SameVariadicResultSizeOpVFV : TestOp<"same_variadic_result_vfv", 238 [SameVariadicResultSize]> { 239 let results = (outs Variadic<AnyType>:$variadic1, AnyType:$non_variadic, 240 Variadic<AnyType>:$variadic2); 241} 242 243def SameVariadicResultSizeOpVVV : TestOp<"same_variadic_result_vvv", 244 [SameVariadicResultSize]> { 245 let results = (outs Variadic<AnyType>:$variadic1, Variadic<AnyType>:$variadic2, 246 Variadic<AnyType>:$variadic3); 247} 248 249def SameVariadicResultSizeOpFFV : TestOp<"same_variadic_result_ffv", 250 [SameVariadicResultSize]> { 251 let results = (outs AnyType:$non_variadic1, AnyType:$non_variadic2, 252 Variadic<AnyType>:$variadic); 253} 254 255def SameVariadicResultSizeOpVVF : TestOp<"same_variadic_result_vvf", 256 [SameVariadicResultSize]> { 257 let results = (outs Variadic<AnyType>:$variadic1, Variadic<AnyType>:$variadic2, 258 AnyType:$non_variadic); 259} 260 261def SameVariadicResultSizeOpFVFVF : TestOp<"same_variadic_result_fvfvf", 262 [SameVariadicResultSize]> { 263 let results = (outs AnyType:$non_variadic1, Variadic<AnyType>:$variadic1, 264 AnyType:$non_variadic2, Variadic<AnyType>:$variadic2, 265 AnyType:$non_variadic3); 266} 267 268#endif // PYTHON_TEST_OPS 269