[mlir][Vector] Add transformation + pattern to split vector.transfer_read into full...
authorNicolas Vasilache <ntv@google.com>
Mon, 3 Aug 2020 08:39:18 +0000 (04:39 -0400)
committerNicolas Vasilache <ntv@google.com>
Mon, 3 Aug 2020 08:53:43 +0000 (04:53 -0400)
commit35b65be041127db9fe23d3128a004c888893cbae
tree1c2aad5e3f3517266f36cb4d807d1f9d7aa73f43
parent8aeb212887024a615ca02437cd12fa055bd54b6f
[mlir][Vector] Add transformation + pattern to split vector.transfer_read into full and partial copies.

This revision adds a transformation and a pattern that rewrites a "maybe masked" `vector.transfer_read %view[...], %pad `into a pattern resembling:

```
   %1:3 = scf.if (%inBounds) {
      scf.yield %view : memref<A...>, index, index
    } else {
      %2 = vector.transfer_read %view[...], %pad : memref<A...>, vector<...>
      %3 = vector.type_cast %extra_alloc : memref<...> to
      memref<vector<...>> store %2, %3[] : memref<vector<...>> %4 =
      memref_cast %extra_alloc: memref<B...> to memref<A...> scf.yield %4 :
      memref<A...>, index, index
   }
   %res= vector.transfer_read %1#0[%1#1, %1#2] {masked = [false ... false]}
```
where `extra_alloc` is a top of the function alloca'ed buffer of one vector.

This rewrite makes it possible to realize the "always full tile" abstraction where vector.transfer_read operations are guaranteed to read from a padded full buffer.
The extra work only occurs on the boundary tiles.

Differential Revision: https://reviews.llvm.org/D84631
mlir/include/mlir/Dialect/Vector/VectorTransforms.h
mlir/include/mlir/Interfaces/VectorInterfaces.td
mlir/lib/Dialect/Vector/VectorTransforms.cpp
mlir/test/Dialect/Vector/vector-transfer-full-partial-split.mlir [new file with mode: 0644]
mlir/test/lib/Transforms/TestVectorTransforms.cpp