On Mon, Jul 25, 2011 at 03:41, Richard Guenther <rguent...@suse.de> wrote:
> I think we also need to care for non-integral PHIs where TYPE_PRECISION
> and TYPE_UNSIGNED are not applicable (seems the original code is also
> buggy here?).  So, sth like
>
>  type = TREE_TYPE (res);
>  if (!is_gimple_reg (res)
>      || !INTEGRAL_TYPE_P (type)
>      || TYPE_PRECISION (type) < precision)
>    continue;
>
>  precision = TYPE_PRECISION (type);
>  unsigned_p |= TYPE_UNSIGNED (type);
> }
>

This would not work optimally on the following sequence:
unsigned char
signed short
as we would set the unsigned_p to true for the "unsigned char" and
then we would not reset the value of unsigned_p when the precision
increases.  So what about doing this instead:

  type = TREE_TYPE (res);
  if (!is_gimple_reg (res)
      || !INTEGRAL_TYPE_P (type)
      || TYPE_PRECISION (type) < precision)
    continue;

  if (TYPE_PRECISION (type) > precision)
    unsigned_p = TYPE_UNSIGNED (type);
  else
    unsigned_p |= TYPE_UNSIGNED (type);

  precision = TYPE_PRECISION (type);

Thanks,
Sebastian

Reply via email to