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     {
64       int x = (int) ((unsigned long long) (a[i] * 0x55555556LL) >> 32) - (a[i] >> 31);
65       c[i] = a[i] - x * 3;
66     }
67 }
68 
69 __attribute__((noinline, noclone)) void
f8(void)70 f8 (void)
71 {
72   int i;
73   for (i = 0; i < N; i++)
74     {
75       unsigned int x = ((unsigned int) ((b[i] * 0xaaaaaaabULL) >> 32) >> 1);
76       d[i] = b[i] - x * 3;
77     }
78 }
79 
80 __attribute__((noinline, noclone)) void
f9(void)81 f9 (void)
82 {
83   int i;
84   for (i = 0; i < N; i++)
85     {
86       int x = (((int) ((unsigned long long) (a[i] * 0x38e38e39LL) >> 32)) >> 2) - (a[i] >> 31);
87       c[i] = a[i] - x * 18;
88     }
89 }
90 
91 __attribute__((noinline, noclone)) void
f10(void)92 f10 (void)
93 {
94   int i;
95   for (i = 0; i < N; i++)
96     {
97       unsigned int x = (unsigned int) ((b[i] * 0x38e38e39ULL) >> 32) >> 2;
98       d[i] = b[i] - x * 18;
99     }
100 }
101 
102 __attribute__((noinline, noclone)) void
f11(void)103 f11 (void)
104 {
105   int i;
106   for (i = 0; i < N; i++)
107     {
108       int x = (((int) ((unsigned long long) (a[i] * 0x6bca1af3LL) >> 32)) >> 3) - (a[i] >> 31);
109       c[i] = a[i] - x * 19;
110     }
111 }
112 
113 __attribute__((noinline, noclone)) void
f12(void)114 f12 (void)
115 {
116   int i;
117   for (i = 0; i < N; i++)
118     {
119       unsigned int tmp = (b[i] * 0xaf286bcbULL) >> 32;
120       unsigned int x = (((b[i] - tmp) >> 1) + tmp) >> 4;
121       d[i] = b[i] - x * 19;
122     }
123 }
124 #endif
125 
126 int
main()127 main ()
128 {
129   int i;
130   for (i = 0; i < N; i++)
131     {
132       asm ("");
133       a[i] = i - N / 2;
134       b[i] = i;
135     }
136   a[0] = -__INT_MAX__ - 1;
137   a[1] = -__INT_MAX__;
138   a[N - 1] = __INT_MAX__;
139   b[N - 1] = ~0;
140   f1 ();
141   f2 ();
142   for (i = 0; i < N; i++)
143     if (c[i] != a[i] % 3 || d[i] != b[i] % 3)
144       abort ();
145   f3 ();
146   f4 ();
147   for (i = 0; i < N; i++)
148     if (c[i] != a[i] % 18 || d[i] != b[i] % 18)
149       abort ();
150   f5 ();
151   f6 ();
152   for (i = 0; i < N; i++)
153     if (c[i] != a[i] % 19 || d[i] != b[i] % 19)
154       abort ();
155 #if __SIZEOF_INT__ == 4 && __SIZEOF_LONG_LONG__ == 8
156   f7 ();
157   f8 ();
158   for (i = 0; i < N; i++)
159     if (c[i] != a[i] % 3 || d[i] != b[i] % 3)
160       abort ();
161   f9 ();
162   f10 ();
163   for (i = 0; i < N; i++)
164     if (c[i] != a[i] % 18 || d[i] != b[i] % 18)
165       abort ();
166   f11 ();
167   f12 ();
168   for (i = 0; i < N; i++)
169     if (c[i] != a[i] % 19 || d[i] != b[i] % 19)
170       abort ();
171 #endif
172   return 0;
173 }
174