Skip to content

Commit

Permalink
Allow IndexType inside tensors.
Browse files Browse the repository at this point in the history
It's common in many dialects to use tensors to themselves hold tensor shapes (for example, the shape is itself the result of some non-trivial calculation). Currently, such dialects have to use `tensor<?xi64>` or worse (like allowing either i32 or i64 tensors to represent shapes). `tensor<?xindex>` is the natural type to represent this, but is currently disallowed. This patch allows it.

Differential Revision: https://reviews.llvm.org/D76726
  • Loading branch information
silvasean committed Mar 26, 2020
1 parent 47e7bdb commit 3dceb6d
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 20 deletions.
35 changes: 20 additions & 15 deletions mlir/docs/Rationale.md
Original file line number Diff line number Diff line change
Expand Up @@ -202,28 +202,33 @@ and described in
interest
[starts here](https://www.google.com/url?q=https://youtu.be/Ntj8ab-5cvE?t%3D596&sa=D&ust=1529450150971000&usg=AFQjCNFQHEWL7m8q3eO-1DiKw9zqC2v24Q).

### Index type disallowed in vector/tensor/memref types

Index types are not allowed as elements of `vector`, `tensor` or `memref` type.
Index types are intended to be used for platform-specific "size" values and may
appear in subscripts, sizes of aggregate types and affine expressions. They are
also tightly coupled with `affine.apply` and affine.load/store operations;
having `index` type is a necessary precondition of a value to be acceptable by
these operations. While it may be useful to have `memref<?xindex>` to express
indirect accesses, e.g. sparse matrix manipulations or lookup tables, it creates
problems MLIR is not ready to address yet. MLIR needs to internally store
constants of aggregate types and emit code operating on values of those types,
which are subject to target-specific size and alignment constraints. Since MLIR
does not have a target description mechanism at the moment, it cannot reliably
emit such code. Moreover, some platforms may not support vectors of type
equivalent to `index`.
### Index type disallowed in vector/memref types

Index types are not allowed as elements of `vector` and `memref` types. Index
types are intended to be used for platform-specific "size" values and may appear
in subscripts, sizes of aggregate types and affine expressions. They are also
tightly coupled with `affine.apply` and affine.load/store operations; having
`index` type is a necessary precondition of a value to be acceptable by these
operations. While it may be useful to have `memref<?xindex>` to express indirect
accesses, e.g. sparse matrix manipulations or lookup tables, it creates problems
MLIR is not ready to address yet. MLIR needs to internally store constants of
aggregate types and emit code operating on values of those types, which are
subject to target-specific size and alignment constraints. Since MLIR does not
have a target description mechanism at the moment, it cannot reliably emit such
code. Moreover, some platforms may not support vectors of type equivalent to
`index`.

Indirect access use cases can be alternatively supported by providing and
`index_cast` instruction that allows for conversion between `index` and
fixed-width integer types, at the SSA value level. It has an additional benefit
of supporting smaller integer types, e.g. `i8` or `i16`, for small indices
instead of (presumably larger) `index` type.

Index types are allowed as element types of `tensor` types. The `tensor` type
specifically abstracts the target-specific aspects that intersect with the
code-generation-related/lowering-related concerns explained above. In fact, the
`tensor` type even allows dialect-specific types as element types.

### Bit width of a non-primitive types and `index` is undefined

The bit width of a compound type is not defined by MLIR, it may be defined by a
Expand Down
2 changes: 1 addition & 1 deletion mlir/include/mlir/IR/StandardTypes.h
Original file line number Diff line number Diff line change
Expand Up @@ -330,7 +330,7 @@ class TensorType : public ShapedType {
// element type within that dialect.
return type.isa<ComplexType>() || type.isa<FloatType>() ||
type.isa<IntegerType>() || type.isa<OpaqueType>() ||
type.isa<VectorType>() ||
type.isa<VectorType>() || type.isa<IndexType>() ||
(type.getKind() > Type::Kind::LAST_STANDARD_TYPE);
}

Expand Down
4 changes: 0 additions & 4 deletions mlir/test/IR/invalid.mlir
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,6 @@ func @indexvector(vector<4 x index>) -> () // expected-error {{vector elements m

func @indexmemref(memref<? x index>) -> () // expected-error {{invalid memref element type}}

// -----

func @indextensor(tensor<4 x index>) -> () // expected-error {{invalid tensor element type}}

// -----
// Test no map in memref type.
func @memrefs(memref<2x4xi8, >) // expected-error {{expected list element}}
Expand Down

0 comments on commit 3dceb6d

Please sign in to comment.