mirror of
git://gcc.gnu.org/git/gcc.git
synced 2024-12-22 13:09:50 +08:00
New test.
From-SVN: r47370
This commit is contained in:
parent
07e96fc688
commit
08884e6657
43
gcc/testsuite/gcc.c-torture/execute/20011126-2.c
Normal file
43
gcc/testsuite/gcc.c-torture/execute/20011126-2.c
Normal file
@ -0,0 +1,43 @@
|
||||
/* 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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user