------- Comment #14 from jakub at gcc dot gnu dot org 2006-04-19 13:45 -------
It is the TREE_OVERFLOW set on 0x8000.
That seems to be created by convert_to_integer.
type in that case is unsigned short and expr is (intD.0) xD.1878 & 32768.
As the expr was using signed type, convert_to_integer decides to use
short int as typex:
typex = lang_hooks.types.signed_type (typex);
return convert (type,
fold_build2 (ex_form, typex,
convert (typex, arg0),
convert (typex, arg1)));
but convert (<short int>, <int 32768>) creates <short int overflow -32768>
and since that point forward we carry the overflow bit.
I'd say convert_to_integer should be more careful here, if it sees convert on
one or both of the args created overflow bit, it should either bail out or
use unsigned type instead.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=26729