ValueTracking is used for more thorough analysis of operands. Based on
the analysis, either run-time checks can be simplified (e.g. check only
one operand instead of two) or the transformation can be avoided. For
example, it is quite often the case that a divisor is promoted from a
shorter type and run-time checks for it are redundant.
With additional compile-time analysis of values, two special
cases naturally arise and are addressed by the patch:
- Both operands are known to be short enough. Then, the long division can be simply replaced with a short one without CFG modification.
- If a division is unsigned and the dividend is known to be short enough then the long division is not needed any more. Because if the divisor is too big for short division then the quotient is obviously zero (and the remainder is equal to the dividend). Actually, the division is not needed when (divisor > dividend).
Please define what these mean. (The notion of "long" and "short" are important to this patch, but we don't define them anywhere.)