49 lines
984 B
C
49 lines
984 B
C
/* { dg-do compile } */
|
|
/* { dg-options "-Os -fdump-tree-sink-stats" } */
|
|
|
|
typedef short int16_t;
|
|
typedef unsigned char uint8_t;
|
|
|
|
void foo(int16_t runs[], uint8_t alpha[], int x, int count)
|
|
{
|
|
int16_t* next_runs = runs + x;
|
|
uint8_t* next_alpha = alpha + x;
|
|
|
|
while (x > 0)
|
|
{
|
|
int n = runs[0];
|
|
|
|
if (x < n)
|
|
{
|
|
alpha[x] = alpha[0];
|
|
runs[0] = (int16_t)(x);
|
|
runs[x] = (int16_t)(n - x);
|
|
break;
|
|
}
|
|
runs += n;
|
|
alpha += n;
|
|
x -= n;
|
|
}
|
|
|
|
runs = next_runs;
|
|
alpha = next_alpha;
|
|
x = count;
|
|
|
|
for (;;)
|
|
{
|
|
int n = runs[0];
|
|
|
|
if (x < n)
|
|
{
|
|
alpha[x] = alpha[0];
|
|
break;
|
|
}
|
|
x -= n;
|
|
runs += n;
|
|
}
|
|
}
|
|
|
|
/* We should not sink the next_runs = runs + x calculation after the loop. */
|
|
/* { dg-final { scan-tree-dump-times "Sunk statements:" 0 "sink" } } */
|
|
/* { dg-final { cleanup-tree-dump "sink" } } */
|