<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/140328>140328</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[mlir][arith] Erroneous canonicalization pattern for `arith.addi`
</td>
</tr>
<tr>
<th>Labels</th>
<td>
mlir:arith
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
math-fehr
</td>
</tr>
</table>
<pre>
When running `mlir-opt --canonicalize` (https://godbolt.org/z/6q9ehf7q7), the following program:
```
func.func @foo(%x : i2) -> i2 {
%c-1 = arith.constant -1 : i2
%c-2 = arith.constant -2 : i2
%temp = arith.addi %x, %c-2 overflow<nsw> : i2
%res = arith.addi %temp, %c-1 overflow<nsw> : i2
func.return %res : i2
}
```
gets compiled into the following program:
```
func.func @foo(%arg0: i2) -> i2 {
%c1_i2 = arith.constant 1 : i2
%0 = arith.addi %arg0, %c1_i2 overflow<nsw> : i2
return %0 : i2
}
```
Note that while I use `i2` for the example, there is equivalent issues for any integer sizes (besides 1). Reminder, the allowed values are `-2, -1, 0, 1` for `i2`.
When the input is 1, the first program will return `-2`, while the second program will return `poison`.
I played a bit with the alive-like tool I am working on, and what I'm getting is that [this canonicalization pattern](https://github.com/llvm/llvm-project/blob/f7ef8dcbad9d5ac6cf2a8917d5ce03564fdfd0d8/mlir/lib/Dialect/Arith/IR/ArithCanonicalization.td#L43) is buggy whenever the two input adds have only the `nsw` flag, or if one has the `nsw` flag and the other has the `nsw` and `nuw` flag.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJyklc9u4zYQxp9mfBnYoCjr30EHJ14DAYoe9tJjQYkjiV2aVEjKTvL0BWk72abeAEUBQ4bEmU_D33xDCe_VaIhaKB6g2K_EEibr2qMI03qgya06K1_bPyYy6BZjlBkRSnbUyq3tHHC97oWxRvVCqzeCkiHwegph9pDvgB-AH0YrO6vDxroR-OEN-KF8bmgaqucKeAP8EcNEOFit7TnKz86OThxjPttBya4_thsW02_iBWHLBmuB18CLF4R8h4oDb3AN-TdUHKF6ALZDBF706wwh36NwKkyb3hofhAmYnqa09zh-N45_igt0nH8KFFKq-Pgl7uMqY0_kBm3PkD8af44l_VPCkb-jEIXfRbKvRRIJR2Fx5kPwugrV_hO3kYLH3h5npUmiMsH-P-LCjexr5tmf6i7Nz9DZHQ5J_coh6XxJ4gMC-woBsN3vNhCGSQQ8T0oTPuHiKXpZ8WjbwbpEhV7EcdZ0taUjVB7peVEnockEVN4v5FO0MK8RJo3k0Ku32ANed-SVJI8Z8GaD3-mojCR3M7mIxEniSeioIlwqYM3j-jqL17T17FbQrboNAtulGYwqysxLrASz9-FRzodbG_GstH4Hk-TLJHvZd4z31Fsjf5UwW-Wtia-9kHvCWYtXkiiwUwHPKkzX3agTrbX6QRis1fiEUcu6H9FT1sRXCiPxHJk_Aa-OOFIIcVH5SyegeAiT8vjTGSKCsgZnEQI5A8X-38eJCtPSbXp7BH7Q-nT7W8_O_kV9AH7otO2AH4aKhlr2nZCNLERf9gMXdZNVsuiJ5UW5HeQgmayBH-J5FnVUzNsroS9Cu-hM4Ien77ebx0-VboIEnv-2zeMoKI_dMo6veJ7I0Ikujgpne22ZkNLjJE6E1ujXtAgli6aO_dZijMisQzWgNYST8HdiEtP42EZ_3gmK6_FueU_ZrGSbyyZvxIrarNpW221R8Xo1tcWQlaypOp5lTZGV264TvMuroik6EmXZrFTLGS9YkVUsywteb0jmDQ2Ud1VdV5noYcvoKJTexB7EM36VRqTNtizn9UqLjrRPHxfOE-V8Jy5UefzcuDb1rltGD1umlQ_-QymooNOHKSUWeygeLrnFHr85Zw3Z5dfmuU3Qx_ECJVstTrf_2VCXqQd-uO7q1PK_AwAA__9_JTnc">