1/* PR tree-optimization/53645 */
2/* { dg-options "-std=gnu89" } */
3
4typedef unsigned int UV __attribute__((vector_size (16)));
5typedef int SV __attribute__((vector_size (16)));
6extern void abort (void);
7
8#define TEST(a, b, c, d) \
9__attribute__((noinline)) void		\
10uq##a##b##c##d (UV *x, UV *y) 		\
11{					\
12  *x = *y / ((UV) { a, b, c, d });	\
13}					\
14					\
15__attribute__((noinline)) void		\
16ur##a##b##c##d (UV *x, UV *y) 		\
17{					\
18  *x = *y % ((UV) { a, b, c, d });	\
19}					\
20					\
21__attribute__((noinline)) void		\
22sq##a##b##c##d (SV *x, SV *y) 		\
23{					\
24  *x = *y / ((SV) { a, b, c, d });	\
25}					\
26					\
27__attribute__((noinline)) void		\
28sr##a##b##c##d (SV *x, SV *y) 		\
29{					\
30  *x = *y % ((SV) { a, b, c, d });	\
31}
32
33#define TESTS \
34TEST (4, 4, 4, 4)			\
35TEST (1, 4, 2, 8)			\
36TEST (3, 3, 3, 3)			\
37TEST (6, 5, 6, 5)			\
38TEST (14, 14, 14, 6)			\
39TEST (7, 7, 7, 7)			\
40
41TESTS
42
43UV u[] =
44  { ((UV) { 73U, 65531U, 0U, 174U }),
45    ((UV) { 1U, 8173U, ~0U, ~0U - 63 }) };
46SV s[] =
47  { ((SV) { 73, -9123, 32761, 8191 }),
48    ((SV) { 9903, -1, -7323, 0 }) };
49
50int
51main ()
52{
53  UV ur, ur2;
54  SV sr, sr2;
55  int i;
56#undef TEST
57#define TEST(a, b, c, d)				\
58    uq##a##b##c##d (&ur, u + i);			\
59    if (ur[0] != u[i][0] / a || ur[3] != u[i][3] / d)	\
60     abort ();						\
61    asm volatile ("" : : "r" (&ur) : "memory");		\
62    if (ur[2] != u[i][2] / c || ur[1] != u[i][1] / b)	\
63     abort ();						\
64    asm volatile ("" : : "r" (&ur) : "memory");		\
65    ur##a##b##c##d (&ur, u + i);			\
66    if (ur[0] != u[i][0] % a || ur[3] != u[i][3] % d)	\
67     abort ();						\
68    asm volatile ("" : : "r" (&ur) : "memory");		\
69    if (ur[2] != u[i][2] % c || ur[1] != u[i][1] % b)	\
70     abort ();						\
71    asm volatile ("" : : "r" (&ur) : "memory");
72  for (i = 0; i < sizeof (u) / sizeof (u[0]); i++)
73    {
74      TESTS
75    }
76#undef TEST
77#define TEST(a, b, c, d)				\
78    sq##a##b##c##d (&sr, s + i);			\
79    if (sr[0] != s[i][0] / a || sr[3] != s[i][3] / d)	\
80     abort ();						\
81    asm volatile ("" : : "r" (&sr) : "memory");		\
82    if (sr[2] != s[i][2] / c || sr[1] != s[i][1] / b)	\
83     abort ();						\
84    asm volatile ("" : : "r" (&sr) : "memory");		\
85    sr##a##b##c##d (&sr, s + i);			\
86    if (sr[0] != s[i][0] % a || sr[3] != s[i][3] % d)	\
87     abort ();						\
88    asm volatile ("" : : "r" (&sr) : "memory");		\
89    if (sr[2] != s[i][2] % c || sr[1] != s[i][1] % b)	\
90     abort ();						\
91    asm volatile ("" : : "r" (&sr) : "memory");
92  for (i = 0; i < sizeof (s) / sizeof (s[0]); i++)
93    {
94      TESTS
95    }
96  return 0;
97}
98