llvm-project/mlir/test/python/python_test_ops.td
Michal Terepeta 54c9984207 [mlir][Python] Fix generation of accessors for Optional
Previously, in case there was only one `Optional` operand/result within
the list, we would always return `None` from the accessor, e.g., for a
single optional result we would generate:

```
return self.operation.results[0] if len(self.operation.results) > 1 else None
```

But what we really want is to return `None` only if the length of
`results` is smaller than the total number of element groups (i.e.,
the optional operand/result is in fact missing).

This commit also renames a few local variables in the generator to make
the distinction between `isVariadic()` and `isVariableLength()` a bit
more clear.

Reviewed By: ftynse

Differential Revision: https://reviews.llvm.org/D113855
2021-11-18 09:42:57 +01:00

85 lines
2.8 KiB
TableGen

//===-- python_test_ops.td - Python test Op definitions ----*- 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
//
//===----------------------------------------------------------------------===//
#ifndef PYTHON_TEST_OPS
#define PYTHON_TEST_OPS
include "mlir/Bindings/Python/Attributes.td"
include "mlir/IR/OpBase.td"
include "mlir/Interfaces/InferTypeOpInterface.td"
def Python_Test_Dialect : Dialect {
let name = "python_test";
let cppNamespace = "python_test";
}
class TestOp<string mnemonic, list<OpTrait> traits = []>
: Op<Python_Test_Dialect, mnemonic, traits>;
def AttributedOp : TestOp<"attributed_op"> {
let arguments = (ins I32Attr:$mandatory_i32,
OptionalAttr<I32Attr>:$optional_i32,
UnitAttr:$unit);
}
def PropertyOp : TestOp<"property_op"> {
let arguments = (ins I32Attr:$property,
I32:$idx);
}
def DummyOp : TestOp<"dummy_op"> {
}
def InferResultsOp : TestOp<"infer_results_op", [InferTypeOpInterface]> {
let arguments = (ins);
let results = (outs AnyInteger:$single, AnyInteger:$doubled);
let extraClassDeclaration = [{
static ::mlir::LogicalResult inferReturnTypes(
::mlir::MLIRContext *context, ::llvm::Optional<::mlir::Location> location,
::mlir::ValueRange operands, ::mlir::DictionaryAttr attributes,
::mlir::RegionRange regions,
::llvm::SmallVectorImpl<::mlir::Type> &inferredReturnTypes) {
::mlir::Builder b(context);
inferredReturnTypes.push_back(b.getI32Type());
inferredReturnTypes.push_back(b.getI64Type());
return ::mlir::success();
}
}];
}
// If all result types are buildable, the InferTypeOpInterface is implied and is
// autogenerated by C++ ODS.
def InferResultsImpliedOp : TestOp<"infer_results_implied_op"> {
let results = (outs I32:$integer, F64:$flt, Index:$index);
}
def SameOperandAndResultTypeOp : TestOp<"same_operand_and_result_type_op",
[SameOperandsAndResultType]> {
let arguments = (ins Variadic<AnyType>);
let results = (outs AnyType:$one, AnyType:$two);
}
def FirstAttrDeriveTypeAttrOp : TestOp<"first_attr_derive_type_attr_op",
[FirstAttrDerivedResultType]> {
let arguments = (ins AnyType:$input, TypeAttr:$type);
let results = (outs AnyType:$one, AnyType:$two);
}
def FirstAttrDeriveAttrOp : TestOp<"first_attr_derive_attr_op",
[FirstAttrDerivedResultType]> {
let arguments = (ins AnyAttr:$iattr);
let results = (outs AnyType:$one, AnyType:$two, AnyType:$three);
}
def OptionalOperandOp : TestOp<"optional_operand_op"> {
let arguments = (ins Optional<AnyType>:$input);
let results = (outs I32:$result);
}
#endif // PYTHON_TEST_OPS