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