https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105135
--- Comment #6 from Andrew Pinski <pinskia at gcc dot gnu.org> --- If we change all char to "unsigned char", it is still different and for to_lower_3 we get on the tree level: if (_1 <= 25) goto <bb 3>; [34.00%] else goto <bb 4>; [66.00%] <bb 3> [local count: 365072224]: _4 = c_3(D) + 32; <bb 4> [local count: 1073741824]: # _2 = PHI <_4(3), c_3(D)(2)> There is another bug for the above which asks to transform this to: if (_1 <= 25) goto <bb 3>; [34.00%] else goto <bb 4>; [66.00%] <bb 3> [local count: 365072224]: _4 = 32; <bb 4> [local count: 1073741824]: # _t = PHI <_4(3), 0> _2 = c_3(D) + _t; Which then would get it similar to the other two ...