brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.4 KiB · cfc1d72 Raw
278 lines · plain
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-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef PYTHON_TEST_OPS10#define PYTHON_TEST_OPS11 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 = (ins67                   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_unit119                   );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 is175// 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 groups237def 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 268def ResultsVariadicOp : TestOp<"results_variadic"> {269  let results = (outs Variadic<AnyType>:$res);270}271 272def VariadicAndNormalRegionOp : TestOp<"variadic_and_normal_region"> {273  let regions = (region AnyRegion:$region, VariadicRegion<AnyRegion>:$variadic);274  let assemblyFormat = "$region $variadic attr-dict";275}276 277#endif // PYTHON_TEST_OPS278