https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94566
Andrew Pinski <pinskia at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |aldyh at gcc dot gnu.org, | |amacleod at redhat dot com --- Comment #12 from Andrew Pinski <pinskia at gcc dot gnu.org> --- Aldy or Andrew, why in conv1 we don't get a range for SR.4_4 = sD.8798._M_valueD.7665; Even though the range we have is [-1,1] according to the __builtin_unreachable()? It seems like we should get that range. Once we do get that the code works. E.g. If we add: signed char *t = (signed char*)&s; signed char tt = *t; if (tt < -1 || tt > 1) __builtin_unreachable(); In the front before the other ifs, we get the code we are expecting. conv2 has a similar issue too, though it has also a different issue of ordering for the comparisons.