------- Comment #7 from rakdver at gcc dot gnu dot org  2010-07-26 14:47 -------
By the time the code reaches ivopts, it looks (modulo SSA form) this way:

signed char x = -128, tmp;

for (;;)
  {
    tmp = -x;
    foo ((int) x, (int) tmp, x==-128);
    ...
    if (x == 127)
      break;
    x++;
  }

Note that all the careful handling of -x in case that x=-128 disappeared. 
Then, ivopts trust that signed arithmetics does not overflow, and misscompile
the program.  In fact, it seems that the error is already there at the very
beginning: the .original dump shows

fixnum_neg
{
  ux = (unsigned char) x;
  uy = (unsigned char) -(signed char) ux;
  ...
}

That is, the negation of unsigned char value is implemented by casting it to
signed char, which introduces signed overflow if the value of x is -128.  As
far as I understand the C standard, this seems incorrect.


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45034

Reply via email to