1 /* { dg-do run } */
2 /* { dg-options "-Os -fno-tree-switch-conversion" } */
3 
4 #define MK_FUN(NAME, TYP, V)                            \
5   static __inline__ __attribute__((always_inline))      \
6   unsigned char value_## NAME (TYP x, unsigned char y)  \
7   {                                                     \
8     switch (x)                                          \
9       {                                                 \
10       case V + 0: return 0 + y;                         \
11       case V + 1: return 1;                             \
12       case V + 2: return 2 + y;                         \
13       case V + 3: return 3;                             \
14       case V + 4: return 4 + y;                         \
15       case V + 5: return 5;                             \
16       case V + 6: return 6 + y;                         \
17       case V + 7: return 7;                             \
18       case V + 8: return 8 + y;                         \
19       case V + 9: return 9;                             \
20       case V + 10: return 10 + y;                       \
21       case V + 11: return 11;                           \
22       case V + 12: return 12 + y;                       \
23       case V + 13: return 13;                           \
24       case V + 14: return 14 + y;                       \
25       case V + 15: return 15;                           \
26       }                                                 \
27     return x;                                           \
28   }                                                     \
29                                                         \
30   __attribute__((noinline,noclone))                     \
31   unsigned char select_## NAME (TYP x, unsigned char y) \
32   {                                                     \
33     return value_## NAME (x, y);                        \
34   }                                                     \
35                                                         \
36   static __inline__ __attribute__((always_inline))      \
37   void test1_## NAME (TYP x)                            \
38   {                                                     \
39     if (select_## NAME (x, 0) != value_## NAME (x, 0))  \
40       __builtin_abort();                                \
41   }                                                     \
42                                                         \
43   void test_## NAME (void)                              \
44   {                                                     \
45     test1_## NAME (V);                                  \
46     test1_## NAME (V - 1);                              \
47     test1_## NAME (V + 15);                             \
48     test1_## NAME (V + 16);                             \
49   }
50 
51 MK_FUN (0_s8, signed char, 0)
52 MK_FUN (0_u8, unsigned char, 0)
53 MK_FUN (0_s16, signed int, 0)
54 MK_FUN (0_u16, unsigned int, 0)
55 
56 MK_FUN (m4_s8, signed char, -4)
57 MK_FUN (m4_s16, signed int, -4)
58 
59 MK_FUN (4_s8, signed char, 4)
60 MK_FUN (4_u8, unsigned char, 4)
61 MK_FUN (4_s16, signed int, 4)
62 MK_FUN (4_u16, unsigned int, 4)
63 
main(void)64 int main (void)
65 {
66   test_0_s8();
67   test_0_u8();
68   test_0_s16();
69   test_0_u16();
70 
71   test_m4_s8();
72   test_m4_s16();
73 
74   test_4_s8();
75   test_4_u8();
76   test_4_s16();
77   test_4_u16();
78 
79   return 0;
80 }
81