[Mlir-commits] [mlir] 055fa44 - [mlir][tosa] Disable tosa shape verification between operands/results
Rob Suderman
llvmlistbot at llvm.org
Mon Jul 26 10:08:36 PDT 2021
Author: Rob Suderman
Date: 2021-07-26T10:02:30-07:00
New Revision: 055fa446fd4412c2006e9bc56b31da5afcc5da62
URL: https://github.com/llvm/llvm-project/commit/055fa446fd4412c2006e9bc56b31da5afcc5da62
DIFF: https://github.com/llvm/llvm-project/commit/055fa446fd4412c2006e9bc56b31da5afcc5da62.diff
LOG: [mlir][tosa] Disable tosa shape verification between operands/results
Tosa shape verification prevent shape propagation when coming from a dialect
of known shape. Relax this constraint to allow ingestion / shape propagation
from these other dialects.
Differential Revision: https://reviews.llvm.org/D106610
Added:
Modified:
mlir/include/mlir/Dialect/Tosa/IR/TosaOps.td
mlir/include/mlir/Dialect/Tosa/IR/TosaTypesBase.td
mlir/include/mlir/IR/OpBase.td
Removed:
################################################################################
diff --git a/mlir/include/mlir/Dialect/Tosa/IR/TosaOps.td b/mlir/include/mlir/Dialect/Tosa/IR/TosaOps.td
index 865e17a1b7178..caa9d055a535f 100644
--- a/mlir/include/mlir/Dialect/Tosa/IR/TosaOps.td
+++ b/mlir/include/mlir/Dialect/Tosa/IR/TosaOps.td
@@ -315,7 +315,7 @@ def Tosa_TransposeConv2DOp : Tosa_Op<"transpose_conv2d", [
def Tosa_ClampOp : Tosa_Op<"clamp", [
DeclareOpInterfaceMethods<InferShapedTypeOpInterface,
["inferReturnTypeComponents"]>,
- NoSideEffect, SameOperandsAndResultType]> {
+ NoSideEffect]> {
let summary = "Computes clamp(features, min, max).";
let description = [{
@@ -343,7 +343,7 @@ def Tosa_ClampOp : Tosa_Op<"clamp", [
def Tosa_ReluNOp : Tosa_Op<"reluN", [
DeclareOpInterfaceMethods<InferShapedTypeOpInterface,
["inferReturnTypeComponents"]>,
- NoSideEffect, SameOperandsAndResultType]> {
+ NoSideEffect]> {
let summary = "Computes rectified linear: `max(features, N)`.";
let description = [{
@@ -367,7 +367,7 @@ def Tosa_ReluNOp : Tosa_Op<"reluN", [
def Tosa_SigmoidOp : Tosa_Op<"sigmoid", [
DeclareOpInterfaceMethods<InferShapedTypeOpInterface,
["inferReturnTypeComponents"]>,
- NoSideEffect, SameOperandsAndResultType]> {
+ NoSideEffect]> {
let summary = "Computes elementwise sigmoid of input.";
let description = [{
@@ -393,7 +393,7 @@ def Tosa_SigmoidOp : Tosa_Op<"sigmoid", [
def Tosa_TanhOp : Tosa_Op<"tanh", [
DeclareOpInterfaceMethods<InferShapedTypeOpInterface,
["inferReturnTypeComponents"]>,
- NoSideEffect, SameOperandsAndResultType]> {
+ NoSideEffect]> {
let summary = "Computes elementwise hyperbolic tangent of input";
let description = [{
@@ -857,7 +857,7 @@ def Tosa_TableOp : Tosa_Op<"table", [
def Tosa_AbsOp : Tosa_Op<"abs", [
DeclareOpInterfaceMethods<InferShapedTypeOpInterface,
["inferReturnTypeComponents"]>,
- NoSideEffect, SameOperandsAndResultType]> {
+ NoSideEffect]> {
let summary = "Elementwise abs op";
let description = [{
@@ -901,7 +901,7 @@ def Tosa_BitwiseNotOp : Tosa_Op<"bitwise_not", [
def Tosa_CeilOp : Tosa_Op<"ceil", [
DeclareOpInterfaceMethods<InferShapedTypeOpInterface,
["inferReturnTypeComponents"]>,
- NoSideEffect, SameOperandsAndResultType]> {
+ NoSideEffect]> {
let summary = "Elementwise ceil op";
let description = [{
@@ -923,7 +923,7 @@ def Tosa_CeilOp : Tosa_Op<"ceil", [
def Tosa_ClzOp : Tosa_Op<"clz", [
DeclareOpInterfaceMethods<InferShapedTypeOpInterface,
["inferReturnTypeComponents"]>,
- NoSideEffect, SameOperandsAndResultType]> {
+ NoSideEffect]> {
let summary = "Elementwise count leading zero op";
let description = [{
@@ -945,7 +945,7 @@ def Tosa_ClzOp : Tosa_Op<"clz", [
def Tosa_ExpOp : Tosa_Op<"exp", [
DeclareOpInterfaceMethods<InferShapedTypeOpInterface,
["inferReturnTypeComponents"]>,
- NoSideEffect, SameOperandsAndResultType]> {
+ NoSideEffect]> {
let summary = "Elementwise exp op";
let description = [{
@@ -967,7 +967,7 @@ def Tosa_ExpOp : Tosa_Op<"exp", [
def Tosa_FloorOp : Tosa_Op<"floor", [
DeclareOpInterfaceMethods<InferShapedTypeOpInterface,
["inferReturnTypeComponents"]>,
- NoSideEffect, SameOperandsAndResultType]> {
+ NoSideEffect]> {
let summary = "Elementwise floor op";
let description = [{
@@ -989,7 +989,7 @@ def Tosa_FloorOp : Tosa_Op<"floor", [
def Tosa_LogOp : Tosa_Op<"log", [
DeclareOpInterfaceMethods<InferShapedTypeOpInterface,
["inferReturnTypeComponents"]>,
- NoSideEffect, SameOperandsAndResultType]> {
+ NoSideEffect]> {
let summary = "Elementwise log op";
let description = [{
@@ -1011,7 +1011,7 @@ def Tosa_LogOp : Tosa_Op<"log", [
def Tosa_LogicalNotOp : Tosa_Op<"logical_not", [
DeclareOpInterfaceMethods<InferShapedTypeOpInterface,
["inferReturnTypeComponents"]>,
- NoSideEffect, SameOperandsAndResultType]> {
+ NoSideEffect]> {
let summary = "Returns the truth value of NOT x element-wise.";
let description = [{
@@ -1033,7 +1033,7 @@ def Tosa_LogicalNotOp : Tosa_Op<"logical_not", [
def Tosa_NegateOp : Tosa_Op<"negate", [
DeclareOpInterfaceMethods<InferShapedTypeOpInterface,
["inferReturnTypeComponents"]>,
- NoSideEffect, SameOperandsAndResultType]> {
+ NoSideEffect]> {
let summary = "Elementwise negate op";
let description = [{
@@ -1058,7 +1058,7 @@ def Tosa_NegateOp : Tosa_Op<"negate", [
def Tosa_ReciprocalOp : Tosa_Op<"reciprocal", [
DeclareOpInterfaceMethods<InferShapedTypeOpInterface,
["inferReturnTypeComponents"]>,
- NoSideEffect, SameOperandsAndResultType]> {
+ NoSideEffect]> {
let summary = "Elementwise reciprocal op";
let description = [{
@@ -1081,7 +1081,7 @@ def Tosa_ReciprocalOp : Tosa_Op<"reciprocal", [
def Tosa_RsqrtOp : Tosa_Op<"rsqrt", [
DeclareOpInterfaceMethods<InferShapedTypeOpInterface,
["inferReturnTypeComponents"]>,
- NoSideEffect, SameOperandsAndResultType]> {
+ NoSideEffect]> {
let summary = "Elementwise 1/sqrt op";
let description = [{
@@ -1615,7 +1615,7 @@ def Tosa_ResizeOp : Tosa_Op<"resize", [NoSideEffect]> {
//===----------------------------------------------------------------------===//
// 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
index 08324a15a07b5..484628109b6f2 100644
--- a/mlir/include/mlir/Dialect/Tosa/IR/TosaTypesBase.td
+++ b/mlir/include/mlir/Dialect/Tosa/IR/TosaTypesBase.td
@@ -113,20 +113,29 @@ class Tosa_TensorOfOrNone<list<Type> allowedTypes, string description = ""> :
// 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
index 0d2ff17870019..c457cab3fd40d 100644
--- a/mlir/include/mlir/IR/OpBase.td
+++ b/mlir/include/mlir/IR/OpBase.td
@@ -215,6 +215,10 @@ def IsMemRefTypePred : CPred<"$_self.isa<::mlir::MemRefType>()">;
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 @@ class RankedTensorOf<list<Type> allowedTypes> :
def AnyTensor : TensorOf<[AnyType]>;
+// Unranked Memref type
+class UnrankedTensorOf<list<Type> allowedTypes> :
+ ShapedContainerType<allowedTypes,
+ IsUnrankedTensorTypePred,
+ "unranked.tensor", "::mlir::UnrankedTensorType">;
+
def AnyRankedTensor : RankedTensorOf<[AnyType]>;
// TODO: Have an easy way to add another constraint to a type.
More information about the Mlir-commits
mailing list