Tries to perform
(lshr (add (zext X), (zext Y)), K) -> (icmp ult (add X, Y), X) where - The add's operands are zexts from a K-bits integer to a bigger type. - The add is only used by the shr, or by iK (or narrower) truncates. - The lshr type has more than 2 bits (other types are boolean math). - K > 1
This seems to be a pattern that just comes from OpenCL front-ends, so adding DAG/GISel combines doesn't seem to be worth the complexity.
Original patch D107552 by @abinavpp - adapted to use (a + b < a) instead of uaddo following discussion on the review.
See this issue https://github.com/RadeonOpenCompute/ROCm/issues/488