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
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.