blob: 6c10f04b964c5af53875101cebd627bf6a01bbdd [file] [log] [blame]
/* { dg-do run } */
/* { dg-options "-Os -fno-tree-switch-conversion" } */
#define MK_FUN(NAME, TYP, V) \
static __inline__ __attribute__((always_inline)) \
unsigned char value_## NAME (TYP x, unsigned char y) \
{ \
switch (x) \
{ \
case V + 0: return 0 + y; \
case V + 1: return 1; \
case V + 2: return 2 + y; \
case V + 3: return 3; \
case V + 4: return 4 + y; \
case V + 5: return 5; \
case V + 6: return 6 + y; \
case V + 7: return 7; \
case V + 8: return 8 + y; \
case V + 9: return 9; \
case V + 10: return 10 + y; \
case V + 11: return 11; \
case V + 12: return 12 + y; \
case V + 13: return 13; \
case V + 14: return 14 + y; \
case V + 15: return 15; \
} \
return x; \
} \
\
__attribute__((noinline,noclone)) \
unsigned char select_## NAME (TYP x, unsigned char y) \
{ \
return value_## NAME (x, y); \
} \
\
static __inline__ __attribute__((always_inline)) \
void test1_## NAME (TYP x) \
{ \
if (select_## NAME (x, 0) != value_## NAME (x, 0)) \
__builtin_abort(); \
} \
\
void test_## NAME (void) \
{ \
test1_## NAME (V); \
test1_## NAME (V - 1); \
test1_## NAME (V + 15); \
test1_## NAME (V + 16); \
}
MK_FUN (0_s8, signed char, 0)
MK_FUN (0_u8, unsigned char, 0)
MK_FUN (0_s16, signed int, 0)
MK_FUN (0_u16, unsigned int, 0)
MK_FUN (m4_s8, signed char, -4)
MK_FUN (m4_s16, signed int, -4)
MK_FUN (4_s8, signed char, 4)
MK_FUN (4_u8, unsigned char, 4)
MK_FUN (4_s16, signed int, 4)
MK_FUN (4_u16, unsigned int, 4)
int main (void)
{
test_0_s8();
test_0_u8();
test_0_s16();
test_0_u16();
test_m4_s8();
test_m4_s16();
test_4_s8();
test_4_u8();
test_4_s16();
test_4_u16();
return 0;
}