https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108639
Jakub Jelinek <jakub at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |amacleod at redhat dot com --- Comment #2 from Jakub Jelinek <jakub at gcc dot gnu.org> --- The problem is in 271 if (relation_equiv_p (rel) && lh == rh) We see # RANGE [irange] int [0, 1] NONZERO 0x1 # iftmp.0_6 = PHI <_10(3), 0(2)> # RANGE [irange] long int [0, 1] NONZERO 0x1 _3 = (long int) iftmp.0_6; # RANGE [irange] unsigned int [0, 1] NONZERO 0x1 _4 = (unsigned int) iftmp.0_6; # RANGE [irange] long int [-INF, +INF] NONZERO 0x3 _5 = _3 << _4; so lhs and rhs indeed have the same range, but unlike most binary operations, shifts/rotates have the same type between lhs and rhs1, but rhs2 can have different type. So, the lh == rh comparison ICEs because the wide_ints have different precision (but same values).