1/* PR tree-optimization/51581 */
2/* { dg-require-effective-target int32plus } */
3
4extern void abort (void);
5
6#define N 4096
7int a[N], c[N];
8unsigned int b[N], d[N];
9
10__attribute__((noinline, noclone)) void
11f1 (void)
12{
13  int i;
14  for (i = 0; i < N; i++)
15    c[i] = a[i] % 3;
16}
17
18__attribute__((noinline, noclone)) void
19f2 (void)
20{
21  int i;
22  for (i = 0; i < N; i++)
23    d[i] = b[i] % 3;
24}
25
26__attribute__((noinline, noclone)) void
27f3 (void)
28{
29  int i;
30  for (i = 0; i < N; i++)
31    c[i] = a[i] % 18;
32}
33
34__attribute__((noinline, noclone)) void
35f4 (void)
36{
37  int i;
38  for (i = 0; i < N; i++)
39    d[i] = b[i] % 18;
40}
41
42__attribute__((noinline, noclone)) void
43f5 (void)
44{
45  int i;
46  for (i = 0; i < N; i++)
47    c[i] = a[i] % 19;
48}
49
50__attribute__((noinline, noclone)) void
51f6 (void)
52{
53  int i;
54  for (i = 0; i < N; i++)
55    d[i] = b[i] % 19;
56}
57
58#if __SIZEOF_INT__ == 4 && __SIZEOF_LONG_LONG__ == 8
59__attribute__((noinline, noclone)) void
60f7 (void)
61{
62  int i;
63  for (i = 0; i < N; i++)
64    {
65      int x = (int) ((unsigned long long) (a[i] * 0x55555556LL) >> 32) - (a[i] >> 31);
66      c[i] = a[i] - x * 3;
67    }
68}
69
70__attribute__((noinline, noclone)) void
71f8 (void)
72{
73  int i;
74  for (i = 0; i < N; i++)
75    {
76      unsigned int x = ((unsigned int) ((b[i] * 0xaaaaaaabULL) >> 32) >> 1);
77      d[i] = b[i] - x * 3;
78    }
79}
80
81__attribute__((noinline, noclone)) void
82f9 (void)
83{
84  int i;
85  for (i = 0; i < N; i++)
86    {
87      int x = (((int) ((unsigned long long) (a[i] * 0x38e38e39LL) >> 32)) >> 2) - (a[i] >> 31);
88      c[i] = a[i] - x * 18;
89    }
90}
91
92__attribute__((noinline, noclone)) void
93f10 (void)
94{
95  int i;
96  for (i = 0; i < N; i++)
97    {
98      unsigned int x = (unsigned int) ((b[i] * 0x38e38e39ULL) >> 32) >> 2;
99      d[i] = b[i] - x * 18;
100    }
101}
102
103__attribute__((noinline, noclone)) void
104f11 (void)
105{
106  int i;
107  for (i = 0; i < N; i++)
108    {
109      int x = (((int) ((unsigned long long) (a[i] * 0x6bca1af3LL) >> 32)) >> 3) - (a[i] >> 31);
110      c[i] = a[i] - x * 19;
111    }
112}
113
114__attribute__((noinline, noclone)) void
115f12 (void)
116{
117  int i;
118  for (i = 0; i < N; i++)
119    {
120      unsigned int tmp = (b[i] * 0xaf286bcbULL) >> 32;
121      unsigned int x = (((b[i] - tmp) >> 1) + tmp) >> 4;
122      d[i] = b[i] - x * 19;
123    }
124}
125#endif
126
127int
128main ()
129{
130  int i;
131  for (i = 0; i < N; i++)
132    {
133      asm ("");
134      a[i] = i - N / 2;
135      b[i] = i;
136    }
137  a[0] = -__INT_MAX__ - 1;
138  a[1] = -__INT_MAX__;
139  a[N - 1] = __INT_MAX__;
140  b[N - 1] = ~0;
141  f1 ();
142  f2 ();
143  for (i = 0; i < N; i++)
144    if (c[i] != a[i] % 3 || d[i] != b[i] % 3)
145      abort ();
146  f3 ();
147  f4 ();
148  for (i = 0; i < N; i++)
149    if (c[i] != a[i] % 18 || d[i] != b[i] % 18)
150      abort ();
151  f5 ();
152  f6 ();
153  for (i = 0; i < N; i++)
154    if (c[i] != a[i] % 19 || d[i] != b[i] % 19)
155      abort ();
156#if __SIZEOF_INT__ == 4 && __SIZEOF_LONG_LONG__ == 8
157  f7 ();
158  f8 ();
159  for (i = 0; i < N; i++)
160    if (c[i] != a[i] % 3 || d[i] != b[i] % 3)
161      abort ();
162  f9 ();
163  f10 ();
164  for (i = 0; i < N; i++)
165    if (c[i] != a[i] % 18 || d[i] != b[i] % 18)
166      abort ();
167  f11 ();
168  f12 ();
169  for (i = 0; i < N; i++)
170    if (c[i] != a[i] % 19 || d[i] != b[i] % 19)
171      abort ();
172#endif
173  return 0;
174}
175