Small ChangeLog tweak.
[official-gcc.git] / gcc / testsuite / gcc.c-torture / execute / pr51581-2.c
blobe4345b5fa7cf6a813f439532bc8ad3a6d57b4820
1 /* PR tree-optimization/51581 */
2 /* { dg-require-effective-target int32plus } */
4 extern void abort (void);
6 #define N 4096
7 int a[N], c[N];
8 unsigned int b[N], d[N];
10 __attribute__((noinline, noclone)) void
11 f1 (void)
13 int i;
14 for (i = 0; i < N; i++)
15 c[i] = a[i] % 3;
18 __attribute__((noinline, noclone)) void
19 f2 (void)
21 int i;
22 for (i = 0; i < N; i++)
23 d[i] = b[i] % 3;
26 __attribute__((noinline, noclone)) void
27 f3 (void)
29 int i;
30 for (i = 0; i < N; i++)
31 c[i] = a[i] % 18;
34 __attribute__((noinline, noclone)) void
35 f4 (void)
37 int i;
38 for (i = 0; i < N; i++)
39 d[i] = b[i] % 18;
42 __attribute__((noinline, noclone)) void
43 f5 (void)
45 int i;
46 for (i = 0; i < N; i++)
47 c[i] = a[i] % 19;
50 __attribute__((noinline, noclone)) void
51 f6 (void)
53 int i;
54 for (i = 0; i < N; i++)
55 d[i] = b[i] % 19;
58 #if __SIZEOF_INT__ == 4 && __SIZEOF_LONG_LONG__ == 8
59 __attribute__((noinline, noclone)) void
60 f7 (void)
62 int i;
63 for (i = 0; i < N; i++)
65 int x = (int) ((unsigned long long) (a[i] * 0x55555556LL) >> 32) - (a[i] >> 31);
66 c[i] = a[i] - x * 3;
70 __attribute__((noinline, noclone)) void
71 f8 (void)
73 int i;
74 for (i = 0; i < N; i++)
76 unsigned int x = ((unsigned int) ((b[i] * 0xaaaaaaabULL) >> 32) >> 1);
77 d[i] = b[i] - x * 3;
81 __attribute__((noinline, noclone)) void
82 f9 (void)
84 int i;
85 for (i = 0; i < N; i++)
87 int x = (((int) ((unsigned long long) (a[i] * 0x38e38e39LL) >> 32)) >> 2) - (a[i] >> 31);
88 c[i] = a[i] - x * 18;
92 __attribute__((noinline, noclone)) void
93 f10 (void)
95 int i;
96 for (i = 0; i < N; i++)
98 unsigned int x = (unsigned int) ((b[i] * 0x38e38e39ULL) >> 32) >> 2;
99 d[i] = b[i] - x * 18;
103 __attribute__((noinline, noclone)) void
104 f11 (void)
106 int i;
107 for (i = 0; i < N; i++)
109 int x = (((int) ((unsigned long long) (a[i] * 0x6bca1af3LL) >> 32)) >> 3) - (a[i] >> 31);
110 c[i] = a[i] - x * 19;
114 __attribute__((noinline, noclone)) void
115 f12 (void)
117 int i;
118 for (i = 0; i < N; i++)
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;
125 #endif
128 main ()
130 int i;
131 for (i = 0; i < N; i++)
133 asm ("");
134 a[i] = i - N / 2;
135 b[i] = i;
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;