<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">