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