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 20static const char * 21test (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 38int main () 39{ 40 char out[4]; 41 test ("aab", out); 42 return 0; 43} 44