HomePhabricator

[mlir][Vector] Add linalg.copy-based pattern for splitting vector.transfer_read…

Authored by nicolasvasilache on Aug 3 2020, 2:34 AM.

Description

[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.

Details

Committed
nicolasvasilacheAug 4 2020, 5:46 AM
Parents
rG04e45ae1c6d2: [InstSimplify] fold nested min/max intrinsics with constant operands
Branches
Unknown
Tags
Unknown