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