<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/113021>113021</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[mlir][linalg] Tiling implementation for `linalg.generic` will result in assert/crash if indexing expressions have negative multiplicative coefficients
</td>
</tr>
<tr>
<th>Labels</th>
<td>
mlir
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
christopherbate
</td>
</tr>
</table>
<pre>
Any indexing map that contains negative multiplicative coefficients will crash due to an assertion [here](https://github.com/llvm/llvm-project/blob/main/mlir/lib/Dialect/Linalg/Utils/Utils.cpp#L68). Such maps are sometimes produced to represent reversed iteration over some input dimension.
The condition should be checked much higher up in the call stack (e.g. in `Linalg/Transforms/TilingInterfaceImpl.cpp`); I think there's not much awareness of this limitation.
Here's a test case:
```
#map = affine_map<(d0) -> (d0)>
#map1 = affine_map<(d0) -> (-d0 + 7)>
func.func @test(%arg0: tensor<8xi8>, %arg1: tensor<8xi8>) -> tensor<8xi8> {
%0 = linalg.generic {
indexing_maps = [#map1, #map],
iterator_types = ["parallel"]}
ins(%arg0 : tensor<8xi8>)
outs(%arg1 : tensor<8xi8>) {
^bb0(%in: i8, %out: i8):
linalg.yield %in : i8
} -> tensor<8xi8>
return %0 : tensor<8xi8>
}
module attributes {transform.with_named_sequence} {
transform.named_sequence @__transform_main(%arg1: !transform.any_op {transform.readonly}) {
%0 = transform.structured.match ops{["linalg.generic"]} in %arg1 : (!transform.any_op) -> !transform.any_op
%1:2 = transform.structured.tile_using_for
%0 tile_sizes [2] : (!transform.any_op) -> (!transform.any_op, !transform.any_op)
transform.yield
}
}
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyUVk2PozgQ_TXOpTQITGjIgUOnM9GONLedPUcGCqgdY7P-yHT2168MISE93VKv1DJNqp79XvnZhbCWOoVYsmzPssNGeNdrU9a9Iev02KOphMNNpZtL-awuQKrBV1IdDGIE1wsHtVZOkLKgsBOOzgiDl45GSfX8WmtsW6oJlbPwi6SE2gjbQ-MRnAahQFiLxpFWwLJ9jwZZdmC86J0bLUufGT8yfuzI9b6Kaj0wfpTyvDy-jEb_jbVj_FhJXTF-HASp8JBkQg6F3w4k5Jz0nZSQHePHvxxJuzyjehwZT78_FYzvIvjT132QaEEYBKsHdDSghdHoxtfYBOIGR4MWlQODZzQWGyCHRkxC9BnNhANSo3fQ0IDKklYRiw8sfp7HH30oj2powthee9lAhVD3WP_EBoZAo6euRwN-BFLgAkJICdaJ-icwXmDURSHCnuKbtB9GKNtqMwR9P0iS6r4ph6YVNX4bRjmpfYoZ37F0D9_A9aR-hrkNMp5bUNrNa4tfwqBCa0G3IcuCpIHcpDGCtZQ_FqwAh9ZBLSyGvVulhBXnv_mVp8FELD2AaFtSeBrEyNIXxosmUIMvLP0KyxtLv65hySdwX5oYGN9D_gCfxtarOgoDsG0c-DJeMJ4J08UsfQaHymrD0pfilYoA5S8wh5P3w9dF3waA5ft5QQj4eCItp12KOlRoqF6lLGfrNBkvpIZDOcudGYR_p7PxsswKV89pc3KXEVcwPgojpETJOA-Y_HBbxt7Vwgd6lvm1d_fs5KPsB53Z16qKZwypAKDiWj_t3fK-u3kjaLiW5EIoG5hwcE1cJs0P71f4mmDQeaOWGr_Dcd77pQbrcdCNlwjCOUOVd6GE-d4tByj6Ra4_KTFgc7L4j0dVYyCzEnzPfUwL1jqdbtHTfC0VKx8xntzBQl1Oenxc3KBotJKXQPyxyis_3dOtM7523mATDcLVPejRBsxkh0fb3UwxXR2r3Z0Y_kZrdax-j60pBV38Y1qOJJ68DSZvtbkjr3KmsKV_wyZk-8Dwc5zeD7-8y_bm7Xtk8t3Kam_d8ube-mDcNGXa7NKd2GCZ5HyXJnGcp5u-3FVVhY3g-TbljdhlcbXN00LsRJPHRc3jDZU85tskTnZxmm3TNIrTJH3iSYFZm9cVj9k2xkGQjELDi7TpNmStxzJJ0pgnGykqlLac93lue6F2G1NODbLynWXbWJJ19j6DIyentj8BsgPL9rNFQtXnngE0jBIHVPOFD602oc28cdJTPHd1g9ZLF_w093PGj3Ojp_b-2YCvoWmGRmihF2f81FfDxhtZ_u-vgalEoQFeq3Qu-X8BAAD__3Dxvls">