[mlir][tensor] Add transform to make tensor.pad loop-independent
authorMatthias Springer <springerm@google.com>
Fri, 28 Apr 2023 01:34:03 +0000 (10:34 +0900)
committerMatthias Springer <springerm@google.com>
Fri, 28 Apr 2023 02:46:32 +0000 (11:46 +0900)
commit77124386feb615343afef2740396de1baceb1336
tree3866cb5e9c496a4df79e7aaed34ee7cc76af5b18
parentfbf42f1fe2b541ea039ea576f57040eec2ff9480
[mlir][tensor] Add transform to make tensor.pad loop-independent

Add a transform to make `tensor.pad` and `tensor.empty` ops independent of SCF loop IVs. Such ops can then be hoisted.

E.g.:
```
scf.for %iv = %lb to %ub step %step {
  %high = affine.apply affine_map<(d0)[s0] -> (s0 - d0)> (%i)[%ub]
  %p = tensor.pad %t low[5] high[%high] ...
  ...
}
```
Is transformed to:
```
%high_new = affine.apply affine_map<()[s0, s1] -> (-s0 + s1)> ()[%lb, %ub]
%p_hoistable = tensor.pad %t low[5] high[%high_new]
%dim = tensor.dim %t, %c0
%size = affine.apply affine_map<(d0)[s0, s1] -> (-d0 + s0 + s1 + 5)>(%iv)[%ub, %dim]
%slice = tensor.extract_slice %p_hoistable [0] [%size] [1]
```

Differential Revision: https://reviews.llvm.org/D143910
16 files changed:
mlir/include/mlir/Dialect/Affine/Transforms/Transforms.h
mlir/include/mlir/Dialect/Tensor/CMakeLists.txt
mlir/include/mlir/Dialect/Tensor/TransformOps/CMakeLists.txt [new file with mode: 0644]
mlir/include/mlir/Dialect/Tensor/TransformOps/TensorTransformOps.h
mlir/include/mlir/Dialect/Tensor/TransformOps/TensorTransformOps.td [new file with mode: 0644]
mlir/include/mlir/Dialect/Tensor/Transforms/Transforms.h
mlir/include/mlir/InitAllDialects.h
mlir/include/mlir/Interfaces/ValueBoundsOpInterface.h
mlir/lib/Dialect/Affine/Transforms/ReifyValueBounds.cpp
mlir/lib/Dialect/Tensor/TransformOps/CMakeLists.txt
mlir/lib/Dialect/Tensor/TransformOps/TensorTransformOps.cpp
mlir/lib/Dialect/Tensor/Transforms/CMakeLists.txt
mlir/lib/Dialect/Tensor/Transforms/IndependenceTransforms.cpp [new file with mode: 0644]
mlir/lib/Interfaces/ValueBoundsOpInterface.cpp
mlir/test/Dialect/Tensor/transform-op-make-loop-independent.mlir [new file with mode: 0644]
utils/bazel/llvm-project-overlay/mlir/BUILD.bazel