> On Jul 14, 2014, at 8:57 AM, "Bin.Cheng" <amker.ch...@gmail.com> wrote:
> 
> Hi,
> For a simple example like below.
> 
> int
> f1 (int p, short i, short n)
> {
>  int sum = 0;
> 
>  do
>    {
>      sum += i;
>      i++;

This here is the same as i = i + 1; which is really
i = (short)(((int)i) + 1);

So it gets convert to using unsigned short to avoid undefined overflow ness of 
signed types (which is part of gcc's ir). 

Thanks,
Andrew


>    }
>  while (i < n);
> 
>  return sum;
> }
> 
> When compiling with -O2 -fdump-tree-all options, GCC introduces
> unsigned type at the very beginning of gimple pass, for example, the
> dump for gimple pass is like below.
> f1 (int p, short int i, short int n)
> {
>  int D.4116;
>  short int i.0;
>  unsigned short i.1;
>  unsigned short D.4119;
>  int D.4120;
>  int sum;
> 
>  sum = 0;
>  <D.4111>:
>  D.4116 = (int) i;
>  sum = D.4116 + sum;
>  i.0 = i;
>  i.1 = (unsigned short) i.0;
>  D.4119 = i.1 + 1;
>  i = (short int) D.4119;
>  if (i < n) goto <D.4111>; else goto <D.4112>;
>  <D.4112>:
>  D.4120 = sum;
>  return D.4120;
> }
> 
> It uses i.1 to increase the induction variable and converts it back to
> signed type for comparison.  Is it designed behavior?  &why?
> 
> Thanks,
> bin

Reply via email to