<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/59232>59232</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[InstCombine] missed reducing/canonicalizing add overflow patterns
</td>
</tr>
<tr>
<th>Labels</th>
<td>
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
rotateright
</td>
</tr>
</table>
<pre>
Forking this off from the multiplication examples in issue #59217 -
These are all equivalent, but we don't transform them:
```ir
define i64 @src(i32 %a, i32 %b) {
%a8 = zext i32 %a to i64
%b8 = zext i32 %b to i64
%m8 = add nuw nsw i64 %b8, %a8
%hi64 = lshr i64 %m8, 32
ret i64 %hi64
}
define i64 @tgt(i32 %a, i32 %b) {
%nota = xor i32 %a, -1
%ov = icmp ult i32 %nota, %b
%r = zext i1 %ov to i64
ret i64 %r
}
declare {i32, i1} @llvm.uadd.with.overflow.i32(i32, i32)
define i64 @tgt2(i32 %a, i32 %b) {
%s = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %a, i32 %b)
%ov = extractvalue {i32, i1} %s, 1
%r = zext i1 %ov to i64
ret i64 %r
}
```
https://alive2.llvm.org/ce/z/DX2YCM
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJytVE1v3CAQ_TX4MsrKxh9rH3xIslqph956aI8YY5sWwxbwbppf34Fdt46SVlFVyV_Am-G9Z2Y60_9oj8Z-k3oEP0kHZhhgsGbGkYB5UV6elOTMS6NBPLH5pIQDqUE6twggNC8bmu3hjqQHkt5_moQTwCzeSoH4vsgzU0J7Qh-hWzxcBPRGE7r34C3TbjA27jST_P6a4fas0usl7XWiF4PUAmRVAClSZzmhtcwpEihZSH777ghtgOwfrkEQl2sg-QGexZNfUQy8Cak2qO41qnuNmq8o1veglwtod7kyCvGBRdxug5_iKkYoN9kVOkdoTlecFX5dmn5tR_aHrR8v5fvRv1u-Np5FCk_GwjbkLtugzDliJJ9PgP98BYbgm65ug7Ybr7Jb-EuvNprsHwRxFY4JksW9ooQMIUGdUud5t6DHu4v0086chR2Uuewirl7R4dX81SL6bo9c1MPDkf0XPm_t8NpbdMsy7rEeljdkI4kwyv6by2sBbS2avD-5UGn0iBdT8izoLsozdsQZLvDxjPfhM_3y-DERbVZVTZU3TVEkfZv3Td6wxEuvREvKhw_a-Uczd2g7KQ8wY0sQPZLqF47tJORj2mhsHko-h_4SymZ1D07Me2G1Sxar2pfERrR56XbczDgI9G6vu5M1XwXHs3-M3QcdO2L3yWkytSnLSs5FymvOy7oq6rrMqrzum7KscXpIFOuEcoE2ck1kS1NKs4zWGS0ppTvKClRX13XVpLwqevzvYmZS_bInsW3k0C2jC4dCOu9-LzLn5KiFWPOzxU_GthbrB1XKcfJJpNxGvj8BQLCHCg">