| /* PR tree-optimization/45830 */ |
| /* { dg-do run } */ |
| /* { dg-additional-options "-fno-tree-switch-conversion" { target avr-*-* } } */ |
| |
| extern void abort (void); |
| |
| long long va, vb, vc, vd, ve; |
| |
| __attribute__((noinline)) int |
| foo (int x) |
| { |
| long long a, b, c, d, e; |
| switch (x) |
| { |
| case 0: |
| case 3: |
| case 1: |
| case 2: |
| case 4: |
| a = 1; |
| b = 129; |
| c = -12; |
| d = -4; |
| e = 128; |
| break; |
| case 23: |
| case 26: |
| case 19: |
| case 65: |
| case 5: |
| a = 2; |
| b = 138; |
| c = 115; |
| d = 128; |
| e = -16; |
| break; |
| case 21: |
| case 20: |
| case 22: |
| case 38: |
| case 27: |
| case 66: |
| case 45: |
| case 47: |
| a = 3; |
| b = 6; |
| c = 127; |
| d = 25; |
| e = 257; |
| break; |
| default: |
| a = 0; |
| b = 18; |
| c = 0; |
| d = 64; |
| e = 32768L; |
| break; |
| } |
| va = a; |
| vb = b; |
| vc = c; |
| vd = d; |
| ve = e; |
| } |
| |
| int |
| bar (int x) |
| { |
| if (x < 0) |
| return 3; |
| if (x < 5) |
| return 0; |
| if (x == 5 || x == 19 || x == 23 | x == 26 || x == 65) |
| return 1; |
| if ((x >= 20 && x <= 22) || x == 27 || x == 38 |
| || x == 45 || x == 47 || x == 66) |
| return 2; |
| return 3; |
| } |
| |
| long long expected[] = |
| { 1, 129, -12, -4, 128, 2, 138, 115, 128, -16, |
| 3, 6, 127, 25, 257, 0, 18, 0, 64, 32768L }; |
| |
| int |
| main (void) |
| { |
| int i, v; |
| for (i = -4; i < 70; i++) |
| { |
| foo (i); |
| v = bar (i); |
| if (va != expected[5 * v] || vb != expected[5 * v + 1] |
| || vc != expected[5 * v + 2] || vd != expected[5 * v + 3] |
| || ve != expected[5 * v + 4]) |
| abort (); |
| } |
| return 0; |
| } |