[all-commits] [llvm/llvm-project] c91d3b: [mlir][vector] Constrain patterns: vector.contract...
Andrzej WarzyĆski via All-commits
all-commits at lists.llvm.org
Fri Oct 6 09:08:53 PDT 2023
Branch: refs/heads/main
Home: https://github.com/llvm/llvm-project
Commit: c91d3b0b08ee133573b4c24f239306a9f1741174
https://github.com/llvm/llvm-project/commit/c91d3b0b08ee133573b4c24f239306a9f1741174
Author: Andrzej Warzynski <andrzej.warzynski at arm.com>
Date: 2023-10-06 (Fri, 06 Oct 2023)
Changed paths:
M mlir/lib/Dialect/Vector/Transforms/LowerVectorContract.cpp
A mlir/test/Dialect/Vector/vector-contract-to-outerproduct-transforms-unsupported.mlir
M mlir/test/Dialect/Vector/vector-contract-to-outerproduct-transforms.mlir
Log Message:
-----------
[mlir][vector] Constrain patterns: vector.contract -> vector.outerproduct
This patch constrains the patterns for converting `vector.contract` to
`vector.outerproduct` so that
* the reduction dimension is _not unrolled_ if the corresponding
dimension is scalable.
This is necessary as the current lowering is incorrect for scalable
dims. Indeed, the following unrolling for `vector.contract` would be
invalid if the corresponding dimension was scalable (K is the size of
the reduction dimension):
```
// K times. This is valid if K _is not_ scalable.
%lhs = vector.extract %LHS[0]
%rhs = vector.extract %RHS[0]
vector.outerproduct %lhs, %rhs
%lhs = vector.extract %LHS[1]
%rhs = vector.extract %RHS[1]
vector.outerproduct %lhs, %rhs
// ...
```
Instead, a `for` loop should be generated:
```
// This would be valid regardless of whether K is scalable or not
scf.for %k = 0 to K step 1
%lhs = vector.extract LHS[%k]
%rhs = vector.extract RHS[%k]
vector.outerproduct %lhs, %rhs
```
However, the lowering of:
* `vector.extract` of vector slices with dynamic indices
is incomplete and hence the implementation proposed above (with
`scf.for`) wouldn't work just yet, i.e. it wouldn't be possible to lower
it further. Instead, this patch disables unrolling in cases when the
reduction dimension is scalable, i.e. where the generated code would be
functionally incorrect.
In order to document unsupported cases, a dedicated test file is added:
* "vector-contract-to-outerproduct-transforms-unsupported.mlir"
This is the first patch in a series of patches that strives to update
these patterns (and to test them) for scalable vectors.
Resolves #68400
More information about the All-commits
mailing list