]> Cypherpunks.ru repositories - gostls13.git/blob - test/torture.go
cmd/compile/internal/inline: score call sites exposed by inlines
[gostls13.git] / test / torture.go
1 // compile
2
3 // Copyright 2012 The Go Authors. All rights reserved.
4 // Use of this source code is governed by a BSD-style
5 // license that can be found in the LICENSE file.
6
7 // Various tests for expressions with high complexity.
8
9 package main
10
11 // Concatenate 16 4-bit integers into a 64-bit number.
12 func concat(s *[16]byte) uint64 {
13         r := (((((((((((((((uint64(s[0])<<4|
14                 uint64(s[1]))<<4|
15                 uint64(s[2]))<<4|
16                 uint64(s[3]))<<4|
17                 uint64(s[4]))<<4|
18                 uint64(s[5]))<<4|
19                 uint64(s[6]))<<4|
20                 uint64(s[7]))<<4|
21                 uint64(s[8]))<<4|
22                 uint64(s[9]))<<4|
23                 uint64(s[10]))<<4|
24                 uint64(s[11]))<<4|
25                 uint64(s[12]))<<4|
26                 uint64(s[13]))<<4|
27                 uint64(s[14]))<<4 |
28                 uint64(s[15]))
29         return r
30 }
31
32 // Compute the determinant of a 4x4-matrix by the sum
33 // over all index permutations.
34 func determinant(m [4][4]float64) float64 {
35         return m[0][0]*m[1][1]*m[2][2]*m[3][3] -
36                 m[0][0]*m[1][1]*m[2][3]*m[3][2] -
37                 m[0][0]*m[1][2]*m[2][1]*m[3][3] +
38                 m[0][0]*m[1][2]*m[2][3]*m[3][1] +
39                 m[0][0]*m[1][3]*m[2][1]*m[3][2] -
40                 m[0][0]*m[1][3]*m[2][2]*m[3][1] -
41                 m[0][1]*m[1][0]*m[2][2]*m[3][3] +
42                 m[0][1]*m[1][0]*m[2][3]*m[3][2] +
43                 m[0][1]*m[1][2]*m[2][0]*m[3][3] -
44                 m[0][1]*m[1][2]*m[2][3]*m[3][0] -
45                 m[0][1]*m[1][3]*m[2][0]*m[3][2] +
46                 m[0][1]*m[1][3]*m[2][2]*m[3][0] +
47                 m[0][2]*m[1][0]*m[2][1]*m[3][3] -
48                 m[0][2]*m[1][0]*m[2][3]*m[3][1] -
49                 m[0][2]*m[1][1]*m[2][0]*m[3][3] +
50                 m[0][2]*m[1][1]*m[2][3]*m[3][0] +
51                 m[0][2]*m[1][3]*m[2][0]*m[3][1] -
52                 m[0][2]*m[1][3]*m[2][1]*m[3][0] -
53                 m[0][3]*m[1][0]*m[2][1]*m[3][2] +
54                 m[0][3]*m[1][0]*m[2][2]*m[3][1] +
55                 m[0][3]*m[1][1]*m[2][0]*m[3][2] -
56                 m[0][3]*m[1][1]*m[2][2]*m[3][0] -
57                 m[0][3]*m[1][2]*m[2][0]*m[3][1] +
58                 m[0][3]*m[1][2]*m[2][1]*m[3][0]
59 }
60
61 // Compute the determinant of a 4x4-matrix by the sum
62 // over all index permutations.
63 func determinantInt(m [4][4]int) int {
64         return m[0][0]*m[1][1]*m[2][2]*m[3][3] -
65                 m[0][0]*m[1][1]*m[2][3]*m[3][2] -
66                 m[0][0]*m[1][2]*m[2][1]*m[3][3] +
67                 m[0][0]*m[1][2]*m[2][3]*m[3][1] +
68                 m[0][0]*m[1][3]*m[2][1]*m[3][2] -
69                 m[0][0]*m[1][3]*m[2][2]*m[3][1] -
70                 m[0][1]*m[1][0]*m[2][2]*m[3][3] +
71                 m[0][1]*m[1][0]*m[2][3]*m[3][2] +
72                 m[0][1]*m[1][2]*m[2][0]*m[3][3] -
73                 m[0][1]*m[1][2]*m[2][3]*m[3][0] -
74                 m[0][1]*m[1][3]*m[2][0]*m[3][2] +
75                 m[0][1]*m[1][3]*m[2][2]*m[3][0] +
76                 m[0][2]*m[1][0]*m[2][1]*m[3][3] -
77                 m[0][2]*m[1][0]*m[2][3]*m[3][1] -
78                 m[0][2]*m[1][1]*m[2][0]*m[3][3] +
79                 m[0][2]*m[1][1]*m[2][3]*m[3][0] +
80                 m[0][2]*m[1][3]*m[2][0]*m[3][1] -
81                 m[0][2]*m[1][3]*m[2][1]*m[3][0] -
82                 m[0][3]*m[1][0]*m[2][1]*m[3][2] +
83                 m[0][3]*m[1][0]*m[2][2]*m[3][1] +
84                 m[0][3]*m[1][1]*m[2][0]*m[3][2] -
85                 m[0][3]*m[1][1]*m[2][2]*m[3][0] -
86                 m[0][3]*m[1][2]*m[2][0]*m[3][1] +
87                 m[0][3]*m[1][2]*m[2][1]*m[3][0]
88 }
89
90 // Compute the determinant of a 4x4-matrix by the sum
91 // over all index permutations.
92 func determinantByte(m [4][4]byte) byte {
93         return m[0][0]*m[1][1]*m[2][2]*m[3][3] -
94                 m[0][0]*m[1][1]*m[2][3]*m[3][2] -
95                 m[0][0]*m[1][2]*m[2][1]*m[3][3] +
96                 m[0][0]*m[1][2]*m[2][3]*m[3][1] +
97                 m[0][0]*m[1][3]*m[2][1]*m[3][2] -
98                 m[0][0]*m[1][3]*m[2][2]*m[3][1] -
99                 m[0][1]*m[1][0]*m[2][2]*m[3][3] +
100                 m[0][1]*m[1][0]*m[2][3]*m[3][2] +
101                 m[0][1]*m[1][2]*m[2][0]*m[3][3] -
102                 m[0][1]*m[1][2]*m[2][3]*m[3][0] -
103                 m[0][1]*m[1][3]*m[2][0]*m[3][2] +
104                 m[0][1]*m[1][3]*m[2][2]*m[3][0] +
105                 m[0][2]*m[1][0]*m[2][1]*m[3][3] -
106                 m[0][2]*m[1][0]*m[2][3]*m[3][1] -
107                 m[0][2]*m[1][1]*m[2][0]*m[3][3] +
108                 m[0][2]*m[1][1]*m[2][3]*m[3][0] +
109                 m[0][2]*m[1][3]*m[2][0]*m[3][1] -
110                 m[0][2]*m[1][3]*m[2][1]*m[3][0] -
111                 m[0][3]*m[1][0]*m[2][1]*m[3][2] +
112                 m[0][3]*m[1][0]*m[2][2]*m[3][1] +
113                 m[0][3]*m[1][1]*m[2][0]*m[3][2] -
114                 m[0][3]*m[1][1]*m[2][2]*m[3][0] -
115                 m[0][3]*m[1][2]*m[2][0]*m[3][1] +
116                 m[0][3]*m[1][2]*m[2][1]*m[3][0]
117 }
118
119 type A []A
120
121 // A sequence of constant indexings.
122 func IndexChain1(s A) A {
123         return s[0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0]
124 }
125
126 // A sequence of non-constant indexings.
127 func IndexChain2(s A, i int) A {
128         return s[i][i][i][i][i][i][i][i][i][i][i][i][i][i][i][i]
129 }
130
131 // Another sequence of indexings.
132 func IndexChain3(s []int) int {
133         return s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[0]]]]]]]]]]]]]]]]]]]]]
134 }
135
136 // A right-leaning tree of byte multiplications.
137 func righttree(a, b, c, d uint8) uint8 {
138         return a * (b * (c * (d *
139                 (a * (b * (c * (d *
140                         (a * (b * (c * (d *
141                                 (a * (b * (c * (d *
142                                         (a * (b * (c * (d *
143                                                 a * (b * (c * d)))))))))))))))))))))
144
145 }
146
147 // A left-leaning tree of byte multiplications.
148 func lefttree(a, b, c, d uint8) uint8 {
149         return ((((((((((((((((((a * b) * c) * d *
150                 a) * b) * c) * d *
151                 a) * b) * c) * d *
152                 a) * b) * c) * d *
153                 a) * b) * c) * d *
154                 a) * b) * c) * d)
155 }
156
157 type T struct {
158         Next I
159 }
160
161 type I interface{}
162
163 // A chains of type assertions.
164 func ChainT(t *T) *T {
165         return t.
166                 Next.(*T).
167                 Next.(*T).
168                 Next.(*T).
169                 Next.(*T).
170                 Next.(*T).
171                 Next.(*T).
172                 Next.(*T).
173                 Next.(*T).
174                 Next.(*T).
175                 Next.(*T).
176                 Next.(*T).
177                 Next.(*T).
178                 Next.(*T).
179                 Next.(*T).
180                 Next.(*T).
181                 Next.(*T).
182                 Next.(*T).
183                 Next.(*T).
184                 Next.(*T).
185                 Next.(*T)
186 }
187
188 type U struct {
189         Children []J
190 }
191
192 func (u *U) Child(n int) J { return u.Children[n] }
193
194 type J interface {
195         Child(n int) J
196 }
197
198 func ChainUAssert(u *U) *U {
199         return u.Child(0).(*U).
200                 Child(0).(*U).
201                 Child(0).(*U).
202                 Child(0).(*U).
203                 Child(0).(*U).
204                 Child(0).(*U).
205                 Child(0).(*U).
206                 Child(0).(*U).
207                 Child(0).(*U).
208                 Child(0).(*U).
209                 Child(0).(*U).
210                 Child(0).(*U).
211                 Child(0).(*U).
212                 Child(0).(*U).
213                 Child(0).(*U).
214                 Child(0).(*U).
215                 Child(0).(*U).
216                 Child(0).(*U).
217                 Child(0).(*U).
218                 Child(0).(*U).
219                 Child(0).(*U).
220                 Child(0).(*U)
221 }
222
223 func ChainUNoAssert(u *U) *U {
224         return u.Child(0).
225                 Child(0).
226                 Child(0).
227                 Child(0).
228                 Child(0).
229                 Child(0).
230                 Child(0).
231                 Child(0).
232                 Child(0).
233                 Child(0).
234                 Child(0).
235                 Child(0).
236                 Child(0).
237                 Child(0).
238                 Child(0).
239                 Child(0).
240                 Child(0).
241                 Child(0).
242                 Child(0).
243                 Child(0).
244                 Child(0).
245                 Child(0).(*U)
246 }
247
248 // Type assertions and slice indexing. See issue 4207.
249 func ChainAssertIndex(u *U) J {
250         return u.
251                 Children[0].(*U).
252                 Children[0].(*U).
253                 Children[0].(*U).
254                 Children[0].(*U).
255                 Children[0].(*U).
256                 Children[0].(*U).
257                 Children[0].(*U).
258                 Children[0].(*U).
259                 Children[0].(*U).
260                 Children[0].(*U).
261                 Children[0].(*U).
262                 Children[0].(*U).
263                 Children[0].(*U).
264                 Children[0]
265 }
266
267 type UArr struct {
268         Children [2]J
269 }
270
271 func (u *UArr) Child(n int) J { return u.Children[n] }
272
273 func ChainAssertArrayIndex(u *UArr) J {
274         return u.
275                 Children[0].(*UArr).
276                 Children[0].(*UArr).
277                 Children[0].(*UArr).
278                 Children[0].(*UArr).
279                 Children[0].(*UArr).
280                 Children[0].(*UArr).
281                 Children[0].(*UArr).
282                 Children[0].(*UArr).
283                 Children[0].(*UArr).
284                 Children[0].(*UArr).
285                 Children[0].(*UArr).
286                 Children[0].(*UArr).
287                 Children[0].(*UArr).
288                 Children[0]
289 }
290
291 type UArrPtr struct {
292         Children *[2]J
293 }
294
295 func (u *UArrPtr) Child(n int) J { return u.Children[n] }
296
297 func ChainAssertArrayptrIndex(u *UArrPtr) J {
298         return u.
299                 Children[0].(*UArrPtr).
300                 Children[0].(*UArrPtr).
301                 Children[0].(*UArrPtr).
302                 Children[0].(*UArrPtr).
303                 Children[0].(*UArrPtr).
304                 Children[0].(*UArrPtr).
305                 Children[0].(*UArrPtr).
306                 Children[0].(*UArrPtr).
307                 Children[0].(*UArrPtr).
308                 Children[0].(*UArrPtr).
309                 Children[0].(*UArrPtr).
310                 Children[0].(*UArrPtr).
311                 Children[0].(*UArrPtr).
312                 Children[0]
313 }
314
315 // Chains of divisions. See issue 4201.
316
317 func ChainDiv(a, b int) int {
318         return a / b / a / b / a / b / a / b /
319                 a / b / a / b / a / b / a / b /
320                 a / b / a / b / a / b / a / b
321 }
322
323 func ChainDivRight(a, b int) int {
324         return a / (b / (a / (b /
325                 (a / (b / (a / (b /
326                         (a / (b / (a / (b /
327                                 (a / (b / (a / (b /
328                                         (a / (b / (a / b))))))))))))))))))
329 }
330
331 func ChainDivConst(a int) int {
332         return a / 17 / 17 / 17 /
333                 17 / 17 / 17 / 17 /
334                 17 / 17 / 17 / 17
335 }
336
337 func ChainMulBytes(a, b, c byte) byte {
338         return a*(a*(a*(a*(a*(a*(a*(a*(a*b+c)+c)+c)+c)+c)+c)+c)+c) + c
339 }
340
341 func ChainCap() {
342         select {
343         case <-make(chan int, cap(make(chan int, cap(make(chan int, cap(make(chan int, cap(make(chan int))))))))):
344         default:
345         }
346 }