diff --git a/mlir/include/mlir/Dialect/Tosa/IR/TosaOps.td b/mlir/include/mlir/Dialect/Tosa/IR/TosaOps.td --- a/mlir/include/mlir/Dialect/Tosa/IR/TosaOps.td +++ b/mlir/include/mlir/Dialect/Tosa/IR/TosaOps.td @@ -315,7 +315,7 @@ def Tosa_ClampOp : Tosa_Op<"clamp", [ DeclareOpInterfaceMethods, - NoSideEffect, SameOperandsAndResultType]> { + NoSideEffect]> { let summary = "Computes clamp(features, min, max)."; let description = [{ @@ -343,7 +343,7 @@ def Tosa_ReluNOp : Tosa_Op<"reluN", [ DeclareOpInterfaceMethods, - NoSideEffect, SameOperandsAndResultType]> { + NoSideEffect]> { let summary = "Computes rectified linear: `max(features, N)`."; let description = [{ @@ -367,7 +367,7 @@ def Tosa_SigmoidOp : Tosa_Op<"sigmoid", [ DeclareOpInterfaceMethods, - NoSideEffect, SameOperandsAndResultType]> { + NoSideEffect]> { let summary = "Computes elementwise sigmoid of input."; let description = [{ @@ -393,7 +393,7 @@ def Tosa_TanhOp : Tosa_Op<"tanh", [ DeclareOpInterfaceMethods, - NoSideEffect, SameOperandsAndResultType]> { + NoSideEffect]> { let summary = "Computes elementwise hyperbolic tangent of input"; let description = [{ @@ -857,7 +857,7 @@ def Tosa_AbsOp : Tosa_Op<"abs", [ DeclareOpInterfaceMethods, - NoSideEffect, SameOperandsAndResultType]> { + NoSideEffect]> { let summary = "Elementwise abs op"; let description = [{ @@ -901,7 +901,7 @@ def Tosa_CeilOp : Tosa_Op<"ceil", [ DeclareOpInterfaceMethods, - NoSideEffect, SameOperandsAndResultType]> { + NoSideEffect]> { let summary = "Elementwise ceil op"; let description = [{ @@ -923,7 +923,7 @@ def Tosa_ClzOp : Tosa_Op<"clz", [ DeclareOpInterfaceMethods, - NoSideEffect, SameOperandsAndResultType]> { + NoSideEffect]> { let summary = "Elementwise count leading zero op"; let description = [{ @@ -945,7 +945,7 @@ def Tosa_ExpOp : Tosa_Op<"exp", [ DeclareOpInterfaceMethods, - NoSideEffect, SameOperandsAndResultType]> { + NoSideEffect]> { let summary = "Elementwise exp op"; let description = [{ @@ -967,7 +967,7 @@ def Tosa_FloorOp : Tosa_Op<"floor", [ DeclareOpInterfaceMethods, - NoSideEffect, SameOperandsAndResultType]> { + NoSideEffect]> { let summary = "Elementwise floor op"; let description = [{ @@ -989,7 +989,7 @@ def Tosa_LogOp : Tosa_Op<"log", [ DeclareOpInterfaceMethods, - NoSideEffect, SameOperandsAndResultType]> { + NoSideEffect]> { let summary = "Elementwise log op"; let description = [{ @@ -1011,7 +1011,7 @@ def Tosa_LogicalNotOp : Tosa_Op<"logical_not", [ DeclareOpInterfaceMethods, - NoSideEffect, SameOperandsAndResultType]> { + NoSideEffect]> { let summary = "Returns the truth value of NOT x element-wise."; let description = [{ @@ -1033,7 +1033,7 @@ def Tosa_NegateOp : Tosa_Op<"negate", [ DeclareOpInterfaceMethods, - NoSideEffect, SameOperandsAndResultType]> { + NoSideEffect]> { let summary = "Elementwise negate op"; let description = [{ @@ -1058,7 +1058,7 @@ def Tosa_ReciprocalOp : Tosa_Op<"reciprocal", [ DeclareOpInterfaceMethods, - NoSideEffect, SameOperandsAndResultType]> { + NoSideEffect]> { let summary = "Elementwise reciprocal op"; let description = [{ @@ -1081,7 +1081,7 @@ def Tosa_RsqrtOp : Tosa_Op<"rsqrt", [ DeclareOpInterfaceMethods, - NoSideEffect, SameOperandsAndResultType]> { + NoSideEffect]> { let summary = "Elementwise 1/sqrt op"; let description = [{ @@ -1615,7 +1615,7 @@ //===----------------------------------------------------------------------===// // Operator: cast //===----------------------------------------------------------------------===// -def Tosa_CastOp: Tosa_Op<"cast", [NoSideEffect, SameOperandsAndResultShape]> { +def Tosa_CastOp: Tosa_Op<"cast", [NoSideEffect]> { let summary = "Cast operation"; diff --git a/mlir/include/mlir/Dialect/Tosa/IR/TosaTypesBase.td b/mlir/include/mlir/Dialect/Tosa/IR/TosaTypesBase.td --- a/mlir/include/mlir/Dialect/Tosa/IR/TosaTypesBase.td +++ b/mlir/include/mlir/Dialect/Tosa/IR/TosaTypesBase.td @@ -113,20 +113,29 @@ // Tensor types with constrained ranks. //===----------------------------------------------------------------------===// -// Must be listed rank. -def Tosa_Tensor1D : 1DTensorOf<[Tosa_AnyNumber]>; -def Tosa_Tensor2D : 2DTensorOf<[Tosa_AnyNumber]>; -def Tosa_Tensor3D : 3DTensorOf<[Tosa_AnyNumber]>; -def Tosa_Tensor4D : 4DTensorOf<[Tosa_AnyNumber]>; -def Tosa_Tensor5D : TensorRankOf<[Tosa_AnyNumber], [5]>; +// We include unranked tensors as a supported type for all possible tosa +// Tensors as unranked does not guarantee invalid. If unranked tensors exist +// they should be shape propagate used Tosa's shape inference pass and verified +// to not include any remaining unranked tensors. +def Tosa_UnrankedTensor : UnrankedTensorOf<[Tosa_AnyNumber]>; + +def Tosa_Tensor1D : AnyTypeOf<[Tosa_UnrankedTensor, 1DTensorOf<[Tosa_AnyNumber]>]>; +def Tosa_Tensor2D : AnyTypeOf<[Tosa_UnrankedTensor, 2DTensorOf<[Tosa_AnyNumber]>]>; +def Tosa_Tensor3D : AnyTypeOf<[Tosa_UnrankedTensor, 3DTensorOf<[Tosa_AnyNumber]>]>; +def Tosa_Tensor4D : AnyTypeOf<[Tosa_UnrankedTensor, 4DTensorOf<[Tosa_AnyNumber]>]>; +def Tosa_Tensor5D : AnyTypeOf<[Tosa_UnrankedTensor, TensorRankOf<[Tosa_AnyNumber], [5]>]>; // Ranked tensors up to given rank. -def Tosa_Tensor1Dto4D : TensorRankOf<[Tosa_AnyNumber], [1,2,3,4]>; -def Tosa_Tensor1Dto6D : TensorRankOf<[Tosa_AnyNumber], [1,2,3,4,5,6]>; +def Tosa_Tensor1Dto4D : AnyTypeOf<[ + Tosa_UnrankedTensor, TensorRankOf<[Tosa_AnyNumber], [1,2,3,4]>]>; +def Tosa_Tensor1Dto6D : AnyTypeOf<[ + Tosa_UnrankedTensor, TensorRankOf<[Tosa_AnyNumber], [1,2,3,4,5,6]>]>; -def Tosa_TensorUpto4D : TensorRankOf<[Tosa_AnyNumber], [0,1,2,3,4]>; +def Tosa_TensorUpto4D : AnyTypeOf<[ + Tosa_UnrankedTensor, TensorRankOf<[Tosa_AnyNumber], [0,1,2,3,4]>]>; -def Tosa_Int32TensorUpto4D : TensorRankOf<[Tosa_Int32], [0,1,2,3,4]>; +def Tosa_Int32TensorUpto4D : AnyTypeOf<[ + Tosa_UnrankedTensor, TensorRankOf<[Tosa_Int32], [0,1,2,3,4]>]>; //===----------------------------------------------------------------------===// // Generic scalar, vector, or tensor of a particular type. diff --git a/mlir/include/mlir/IR/OpBase.td b/mlir/include/mlir/IR/OpBase.td --- a/mlir/include/mlir/IR/OpBase.td +++ b/mlir/include/mlir/IR/OpBase.td @@ -215,6 +215,10 @@ def IsUnrankedMemRefTypePred : CPred<"$_self.isa<::mlir::UnrankedMemRefType>()">; +// Whether a type is an UnrankedTensorType +def IsUnrankedTensorTypePred + : CPred<"$_self.isa<::mlir::UnrankedTensorType>()">; + // Whether a type is a BaseMemRefType def IsBaseMemRefTypePred : CPred<"$_self.isa<::mlir::BaseMemRefType>()">; @@ -624,6 +628,12 @@ def AnyTensor : TensorOf<[AnyType]>; +// Unranked Memref type +class UnrankedTensorOf allowedTypes> : + ShapedContainerType; + def AnyRankedTensor : RankedTensorOf<[AnyType]>; // TODO: Have an easy way to add another constraint to a type.