1 /* Problem originally visible on ia64.
2 
3    There is a partial redundancy of "in + 1" that makes GCSE want to
4    transform the final while loop to
5 
6      p = in + 1;
7      tmp = p;
8      ...
9      goto start;
10    top:
11      tmp = tmp + 1;
12    start:
13      in = tmp;
14      if (in < p) goto top;
15 
16    We miscalculate the number of loop iterations as (p - tmp) = 0
17    instead of (p - in) = 1, which results in overflow in the doloop
18    optimization.  */
19 
20 static const char *
test(const char * in,char * out)21 test (const char *in, char *out)
22 {
23   while (1)
24     {
25       if (*in == 'a')
26 	{
27 	  const char *p = in + 1;
28 	  while (*p == 'x')
29 	    ++p;
30 	  if (*p == 'b')
31 	    return p;
32 	  while (in < p)
33 	    *out++ = *in++;
34 	}
35     }
36 }
37 
main()38 int main ()
39 {
40   char out[4];
41   test ("aab", out);
42   return 0;
43 }
44