Always convert i2b into ine (and eliminate i2b opcode)
I noticed these old patterns in opt_algebraic:
# Boolean simplifications
(('i2b16(is_used_by_if)', a), ('ine16', a, 0)),
(('i2b32(is_used_by_if)', a), ('ine32', a, 0)),
(('i2b1(is_used_by_if)', a), ('ine', a, 0)),
And I though, "Hm... I wonder what neat optimized thing we emit for i2b
when it's not used by an if
?" I turns out, the Intel compiler just compares the integer for inequality with zero. D'oh! I looked at another backend and another and another. As far as I can tell, the only backend that does anything special for i2b
is the Broadcom backend.
The optimization done in the Broadcom compiler for i2b
could also be done for x != 0
too, and there's a patch for that. That patch was dropped after discussion in !16801 (closed).
There are quite a few places, especially in opt_algebraic, where x != 0
is treated specially, but there is virtually nothing for i2b
. Rather than duplicate all of that effort, just canonicalize i2b
to x != 0
everywhere. If there is something special that can be done for x != 0
that is never used as a condition, it's still very easy to detect that case.