| /* { dg-do run } */ |
| /* { dg-options "-O2" } */ |
| /* { dg-options "-O2 -fno-short-enums -Wl,--no-enum-size-warning" {target arm_eabi} } */ |
| |
| /* This testcase got misoptimized by combine due to a wrong setting of |
| subst_low_luid in try_combine. */ |
| |
| enum rtx_code { |
| A, B |
| }; |
| |
| void abort (void); |
| |
| struct rtx_def { |
| __extension__ enum rtx_code code:16; |
| }; |
| typedef struct rtx_def *rtx; |
| |
| void __attribute__((noinline)) |
| add_constraint (unsigned char is_a) |
| { |
| if (is_a) |
| abort (); |
| } |
| |
| void __attribute__((noinline)) |
| foo (rtx defn) |
| { |
| switch (defn->code) |
| { |
| case A: |
| case B: |
| add_constraint (defn->code == A); |
| break; |
| default: |
| break; |
| } |
| } |
| |
| int |
| main () |
| { |
| struct rtx_def r; |
| |
| r.code = B; |
| |
| foo (&r); |
| return 0; |
| } |