| /* PR rtl-optimization/46777 */ |
| /* { dg-do compile } */ |
| /* { dg-options "-fgcse -O -fno-tree-dominator-opts -funroll-loops" } */ |
| |
| struct S { char s[256]; }; |
| |
| static inline int |
| foo (int x, int y) |
| { |
| switch (x) |
| { |
| case 1: |
| case 2: |
| return 3; |
| case 3: |
| case 4: |
| return 2; |
| case 5: |
| switch (y) |
| { |
| case 4: |
| return 1; |
| } |
| } |
| return 0; |
| } |
| |
| void |
| bar (struct S *x, int *y, int *z, int **w) |
| { |
| switch (*y ? x->s[*y] : foo (y[1], y[0])) |
| { |
| case 3: |
| if (y + 2 == z) |
| for (;;) |
| { |
| y += 2; |
| switch (*y ? x->s[*y] : foo (y[1], y[0])) |
| { |
| case 6: |
| break; |
| default: |
| *w = y; |
| } |
| if (y == z) |
| break; |
| } |
| } |
| } |