mirror of
https://github.com/nArnoSNES/tcc-65816.git
synced 2024-06-02 19:42:59 +00:00
44 lines
746 B
C
44 lines
746 B
C
/* 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;
|
|
}
|