1 /* PR tree-optimization/51581 */
2 
3 /* { dg-require-effective-target int32plus } */
4 
5 extern void abort (void);
6 
7 #define N 4096
8 int a[N], c[N];
9 unsigned int b[N], d[N];
10 
11 __attribute__((noinline, noclone)) void
f1(void)12 f1 (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
f2(void)20 f2 (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
f3(void)28 f3 (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
f4(void)36 f4 (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
f5(void)44 f5 (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
f6(void)52 f6 (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
f7(void)61 f7 (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
f8(void)69 f8 (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
f9(void)77 f9 (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
f10(void)85 f10 (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
f11(void)93 f11 (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
f12(void)101 f12 (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 
112 int
main()113 main ()
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