> 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