/* Problem originally visible on ia64. There is a partial redundancy of "in + 1" that makes GCSE want to transform the final while loop to p = in + 1; tmp = p; ... goto start; top: tmp = tmp + 1; start: in = tmp; if (in < p) goto top; We miscalculate the number of loop iterations as (p - tmp) = 0 instead of (p - in) = 1, which results in overflow in the doloop optimization. */ static const char * test (const char *in, char *out) { while (1) { if (*in == 'a') { const char *p = in + 1; while (*p == 'x') ++p; if (*p == 'b') return p; while (in < p) *out++ = *in++; } } } int main () { char out[4]; test ("aab", out); return 0; }