https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110582
--- Comment #3 from Andrew Pinski <pinskia at gcc dot gnu.org> --- (In reply to Richard Biener from comment #2) > It works with -fno-tree-loop-optimize but the difference from loop opts is > just So changing it to what -ftree-loop-optimize, it still passes with -fno-tree-loop-optimize (which is even odder): ``` int a, b; int main() { char c = a = 0; unsigned char t = 253; for (; t != 0; t --){ int d = 2; d ^= 2 && a; b = a == 0 ? d : d / a; a = b; } for (; (1 + 95 << 24) + b + 1 + 686658714L + b - 2297271457;) ; } ``` The difference in this case is: + unsigned charD.20 ivtmp_32; + unsigned charD.20 ivtmp_33; ... - # RANGE [irange] unsigned char [1, 253] - # t_19 = PHI <t_16(5), 253(2)> # .MEM_20 = PHI <.MEM_20(5), .MEM_11(D)(2)> # a_lsm.11_2 = PHI <iftmp.1_9(5), 0(2)> + # ivtmp_33 = PHI <ivtmp_32(5), 253(2)> ... - # RANGE [irange] unsigned char [0, 252] - t_16 = t_19 + 255; - if (t_16 != 0) + ivtmp_32 = ivtmp_33 - 1; + if (ivtmp_32 != 0) ``` The only thing I can of which might be causing the issue is +255 vs -1 here.