You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
[InstCombine] Fold umul.overflow(x, c1) | (x*c1 > c2) to x > c2/c1
The motivation of this pattern is to check whether the product of a
variable and a constant would be mathematically (i.e., as integer
numbers instead of bit vectors) greater than a given constant bound. The
pattern appears to occur when compiling several Rust projects (it seems
to originate from the `smallvec` crate but I have not checked this
further).
Unless `c1` is `0` (which should only occur in non-splat vectors because
it should have been folded away otherwise), we can transform this
pattern into `x > c2/c1` with all operations working on unsigned
integers. Due to undefined behavior when an element of a non-splat
vector is `0`, the transform is only implemented for scalars and splat
vectors.
Alive proof: https://alive2.llvm.org/ce/z/LawTkmCloses#142674
0 commit comments