<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/60808>60808</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[mlir] `shape.dim` verifier checks for UB instead of propagating the error or being truly UB
</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>
The description of `shape.dim` reads:
```
If the index is error or out-of-bound then it returns an invalid size if the return type carries error information else the behavior is undefined.
```
However, in practice the verifier will reject this kind of construct as invalid, which as @joker-eph pointed out in https://github.com/llvm/llvm-project/issues/60295 is an anti-pattern as it makes the compiler non-composable.
In other words, unlike what the description says, there's no error propagation happening in the type or UB being generated.
I didn't fix that as part of https://github.com/llvm/llvm-project/commit/4bc2357c3de268b2b50ad0ff9c2c040329b75375 because I didn't know how to carry the error as part of the return type.
I'd need some guidance on that.
To reproduce:
Run `mlir-opt -canonicalize` on:
```
func.func @dim(%arg : tensor<1x?xf32>) -> index {
%c2 = arith.constant 2 : index
%add = arith.addi %c2, %c2 : index
%dim = shape.dim %arg, %add : tensor<1x?xf32>, index -> index
return %dim : index
}
```
Result:
```
error: 'shape.dim' op index is out of range
%dim = shape.dim %arg, %add : tensor<1x?xf32>, index -> index
^
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy8VV2PozgQ_DXOSysRMQHCQx7mK7p5Xe3-AGM30Btoc7aZzOyvP9lkMtndm5NOJ90IMQHsclW7q6y8p44RD6K4F8XjSs2ht-7wp7aDHRsMq8aat8PXHsGg146mQJbBtiDKzPdqwo2hUZQZOFTGi_xOZI8iuxNldrnS43MLoUcgNvgK5AGdsw7iNYe1bdeNndnEIQwUwGGYHXtQDMQvaiADnn4g0IKyfIbwNiFo5RzhOyBxa92oEkUcPKbhDfbqheJXDzMbbInRbP6W5nL_w57xBZ2QD0AMk1M6kF6wXtBRS-jgTMMADr-jDhB68nAiNrEs2rIPbtYBlH9nH5HOPek-vhO77Ls9oVvj1MNkiQOaWIa4Vh_ClGooj0IeOwr93Gy0HYU8DsPL-7_15GxcWMgjeT-jF_JYZrIuokLFoDjQelIhoOPEIsCoTuiTAm3HiQZ0wJbX8cF61Qy4uS3AM4MNfVRpnfGR_cwDnRDOvQoJ5bYXvHpLY-IMFLLywPayH5Ozk-qW_ejVNCETd1FoxEj7Zx18u4cG4_sOGZ0KH5uzkAFDhoWsArT0CiFSUB4m5UKs978umbbjSPHHrtEyLyqdG5TlvpFNkSmTtW2tpc52WS7rpiryqoAGtZo9wg2TE9sz9PYMwaYWfEuKFtE35H7p1ouuZyErA4xowNsRoZvJKNYIlpO8n-R_teBwctbMGq_u-jJz9N84kFvbKcBaK7ZMWg30A6MZLX_mxHZmvYm32IjRunIvZKFcByK_g4DsrRP5w_ZV5MfXNpcifxKyhrXIny72FdX9AgUgZKEliPwRlKPQb1LzKw4gE1oafzNWGXMzWBlDC0Lsnneo32cZGtOsa9rAQvgyawH9lPrDhfWHgHfoy8ZcV_hpZVE9_kNCfEE_D-GzEqc2iHjRDNeIlBXY6SMBo-NtC05xh_-D2MufKJ5-obwyh9zUea1WeNiWVVnsyl1erPpDW-C-rncmN_stNrpWbVVvpZH1fitN2egVHWQm80xuy-1WZnmxMfXWqLqU9V5uyyLTYpfhqGjYRAdurOtWKa4OZbbP9qtBNTj4dOxIGTtZSBkPIHdIhm3mzotdNpAP_gMgUBjSUZUmFI-_nULXgNY96pOHdgkYYh9QpYC-ZhJ3N6a17hJCwc3DG3y7X81uOPyXPN5n-78CAAD__5H5TXk">