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