| /* { 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 "sink1" } } */ |