[all-commits] [llvm/llvm-project] 1a4263: [mlir][Vector] Add linalg.copy-based pattern for s...

Nicolas Vasilache via All-commits all-commits at lists.llvm.org
Tue Aug 4 05:56:10 PDT 2020


  Branch: refs/heads/master
  Home:   https://github.com/llvm/llvm-project
  Commit: 1a4263d394c1a93757613bde4b1c2cf8d6a7bbb9
      https://github.com/llvm/llvm-project/commit/1a4263d394c1a93757613bde4b1c2cf8d6a7bbb9
  Author: Nicolas Vasilache <ntv at google.com>
  Date:   2020-08-04 (Tue, 04 Aug 2020)

  Changed paths:
    M mlir/include/mlir/Dialect/Vector/VectorOps.h
    M mlir/include/mlir/Dialect/Vector/VectorTransforms.h
    M mlir/lib/Dialect/Vector/CMakeLists.txt
    M mlir/lib/Dialect/Vector/VectorTransforms.cpp
    M mlir/test/Dialect/Vector/vector-transfer-full-partial-split.mlir
    M mlir/test/lib/Transforms/TestVectorTransforms.cpp

  Log Message:
  -----------
  [mlir][Vector] Add linalg.copy-based pattern for splitting 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 = linalg.fill(%extra_alloc, %pad)
      %3 = subview %view [...][...][...]
      linalg.copy(%3, %alloc)
      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.




More information about the All-commits mailing list