<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/59399>59399</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [mlir] Simplify `affine.min/max (a)` -> `a`
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            mlir
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          qcolombet
      </td>
    </tr>
</table>

<pre>
    Currently we don't fold/canonicalize `affine.min/max`s that only return their one value, e.g., `%min = affine.min affine_map<()[s0] -> (s0)> ()[%val]`.

This is not a problem after the lowering of `affine` because we properly propagate that one value, but this may prevent other optimizations earlier in the pipeline to follow the def-uses chain of this one value.

To reproduce:
```
func.func @min.oneval(%arg0: index) -> index {
  %min = affine.min affine_map<()[s0] -> (s0)> ()[%arg0]
 return %min: index
}
```

```
mlir-opt -test-constant-fold <input>.mlir
```

Result:
```
func.func @min.oneval(%arg0: index) -> index {
  %min = affine.min affine_map<()[s0] -> (s0)> ()[%arg0]
  return %min: index
}
```

Expected result:
```
func.func @min.oneval(%arg0: index) -> index {
  return %arg0 : index
}
```

Similarly we don't optimize silly patterns like:
```
func.func @min.twovals(%arg0: index) -> index {
  %min = affine.min affine_map<()[s0] -> (s0, s0)> ()[%arg0]
  return %min: index
}
```

Which generates silly code after lowering:
```
func.func @min.twovals(%arg0: index) -> index {
  %0 = arith.cmpi slt, %arg0, %arg0 : index
  %1 = arith.select %0, %arg0, %arg0 : index
  return %1 : index
}
```
Hopefully that gets optimize away later, but if we can avoid it that would be great.

Note: The simplification could probably be generalized to something like "if all expressions of the affine_map are a constant function of the same symbol(s), find the min/max of these expressions and propagate this one" (e.g., by materializing an affine.apply of the relevant expression). Finding the min/max expression may be complicated though.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzUVk2P2zYQ_TX0ZWCBpi17dfAhWcfoqYcmQI_FiBpJbClSJUfedX59QUqO4yIoUrRboIBhURTn6_FxHjFG0zmioyjfi_K0wol7H46_a2_9UBOvat9cj89TCOTYXuGFoPFOqAND620j1Fmj885otOYzgdhLbFvjqBiME-o84KvYywjcI4N39gqBeAoOuCcTwDuCC9qJhHoGKroiPcVeClUOxoHYnuDubhn-MuAots9CPQlVifJ9lKI8wVpsP4BQT1Gm2Xk8fxeqvKAV5UnsZSHkSch38_-n3kQwEZxnQBiDry0NgC1TSOmB9S8UjOvAt_e6xF5CTRqnSAmLMfiRgr3mAXbIdCv1q8LqiYFTsAHTQrqQY_DcUwA_shnMZ2TjXQTCYA0FMBkfGM1I1jgC9gls61_ydEPteooUQfdoXMouO_8S8rFID4HG4JtJk9gukwnh-Zdf28npIv2B2MnBuMI7SpAlBEsMnRTbd2BcQ69CVTPS-Q3E4f3sAeBf3rEctTwt3hfOzDHuycy1HE7fLOqbk4M1Ye1HhjVT5LX2LjI6Xicqg9g-GzdOLLYfirTwL9z-RHGy_L_F8x8A-uF1JM3UQHhzCO5JJgP4W2l-NIOxGB4b1nLYCKKx6cgiMwUXwZrfvv9s8Iu_oI3_4WY-w9tu6c-90T105CggU1zQ0b6hpRneGuFbYyRnhILhvtDDaCBazoKwOLkP_0yGbL75yjySJc3Z6fd6uAO4-V6u_eBHaqeEVm76HXG8kwxf8AoWmcJNA0yb2KjRAV68acDwbPfiJ9tATdAFQn5o3z96TtSET31i7TBa0xqd1QJ0tkqyhbW9ZvO8hUmHmyQZ0Q_EfRKwRHAQSpkW0Fqg1zFQjFlysnrQV1wEDAQIt9YIaV9zvGVlxIEgXofap9McEx3VM7TGNfnzF9lf1kd6CIeueZDKWbeEUonatwtAfYUh4WZSLSl_vB2WAsfRXm-pBLJ0STneIwhVFXA2rklmj_ncF2Udrgm0T4BqTO2Mez91fbFqjtum2la4ouNmf5DlRu7UYdUfdzXuqkbSQSmqSl2VVV0dNgf5RAfdtofNyhyVVGqj5NNmt5NqU6hKa93USjWb9omkFjtJAxpbWHsZCh-6lYlxomNZbatqZbEmG_MtTKmsPkql-1g4puXreuqi2ElrIse7AzZs880tG5Qn-DhT5Pqte1hCGNN27eXSXvYSxV6upmCPPfMY0_lWZ6HOneF-qgvtB6HOKdryWI_B_0qahTrn3KNQ55z-HwEAAP__XpMWUg">