This adds a combine for cases where a (a + b) < a style overflow check is performed, but with a + b being the result of uadd.with.overflow, so the overflow result is also already available and we can just use it. Subsequently GVN/CSE will deduplicate the extracts.
We can run into this situation if you have both a uadd.with.overflow and a manual add + overflow check in the same function (on the same operands), in which case GVN will rewrite the add to the with.overflow result and leave you with this pattern.
The implementation is a bit ugly because I'm handling the various canonicalization edge cases. I'm wondering if we couldn't introduce something like m_ICmpULT() to match both ULT and the UGT commutation as well as the canonicalization edge-cases for constant operands.