1 /* PR tree-optimization/51581 */
2 /* { dg-require-effective-target int32plus } */
3 
4 extern void abort (void);
5 
6 #define N 4096
7 int a[N], c[N];
8 unsigned int b[N], d[N];
9 
10 __attribute__((noinline, noclone)) void
f1(void)11 f1 (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
f2(void)19 f2 (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
f3(void)27 f3 (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
f4(void)35 f4 (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
f5(void)43 f5 (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
f6(void)51 f6 (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
f7(void)60 f7 (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
f8(void)71 f8 (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
f9(void)82 f9 (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
f10(void)93 f10 (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
f11(void)104 f11 (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
f12(void)115 f12 (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 
127 int
main()128 main ()
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