1 /*
2 * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23 package org.openjdk.bench.valhalla.sum;
24
25 import org.openjdk.jmh.annotations.Benchmark;
26 import org.openjdk.jmh.annotations.CompilerControl;
27 import org.openjdk.jmh.annotations.Setup;
28
29 public class Identity extends SumBase {
30
31 public interface InterfaceSum {
32 public int sum();
33 }
34
35 public static class IdentityInt implements InterfaceSum {
36 public final int v0;
37 public IdentityInt(int value) {
38 this.v0 = value;
39 }
40 public int sum() {
41 return v0;
42 }
43 }
44
45 public static class IdentityInt2_w2_d0 implements InterfaceSum {
46 public final int v0, v1;
47
48 public IdentityInt2_w2_d0(int v0, int v1) {
49 this.v0 = v0;
50 this.v1 = v1;
51 }
52
53 public int sum() {
54 return v0 + v1;
55 }
56 }
57
58 public static class IdentityInt2_w2_d1 implements InterfaceSum {
59 public final IdentityInt v0, v1;
60
61 public IdentityInt2_w2_d1(IdentityInt v0, IdentityInt v1) {
62 this.v0 = v0;
63 this.v1 = v1;
64 }
65
66 public IdentityInt2_w2_d1(int v0, int v1) {
67 this(new IdentityInt(v0), new IdentityInt(v1));
68 }
69
70 public int sum() {
71 return v0.sum() + v1.sum();
72 }
73 }
74
75 public static class IdentityInt4_w4_d0 implements InterfaceSum {
76 public final int v0, v1, v2, v3;
77
78 public IdentityInt4_w4_d0(int v0, int v1, int v2, int v3) {
79 this.v0 = v0;
80 this.v1 = v1;
81 this.v2 = v2;
82 this.v3 = v3;
83 }
84
85 public int sum() {
86 return v0 + v1 + v2 + v3;
87 }
88 }
89
90 public static class IdentityInt4_w4_d1 implements InterfaceSum {
91 public final IdentityInt v0, v1, v2, v3;
92
93 public IdentityInt4_w4_d1(IdentityInt v0, IdentityInt v1, IdentityInt v2, IdentityInt v3) {
94 this.v0 = v0;
95 this.v1 = v1;
96 this.v2 = v2;
97 this.v3 = v3;
98 }
99
100 public IdentityInt4_w4_d1(int v0, int v1, int v2, int v3) {
101 this(new IdentityInt(v0), new IdentityInt(v1), new IdentityInt(v2), new IdentityInt(v3));
102 }
103
104 public int sum() {
105 return v0.sum() + v1.sum() + v2.sum() + v3.sum();
106 }
107 }
108
109 public static class IdentityInt4_w2_d1 implements InterfaceSum {
110 public final IdentityInt2_w2_d0 v0, v1;
111
112 public IdentityInt4_w2_d1(IdentityInt2_w2_d0 v0, IdentityInt2_w2_d0 v1) {
113 this.v0 = v0;
114 this.v1 = v1;
115 }
116
117 public IdentityInt4_w2_d1(int v0, int v1, int v2, int v3) {
118 this(new IdentityInt2_w2_d0(v0, v1), new IdentityInt2_w2_d0(v2, v3));
119 }
120
121 public int sum() {
122 return v0.sum() + v1.sum();
123 }
124 }
125
126 public static class IdentityInt4_w2_d2 implements InterfaceSum {
127
128 public final IdentityInt2_w2_d1 v0, v1;
129
130 public IdentityInt4_w2_d2(IdentityInt2_w2_d1 v0, IdentityInt2_w2_d1 v1) {
131 this.v0 = v0;
132 this.v1 = v1;
133 }
134
135 public IdentityInt4_w2_d2(int v0, int v1, int v2, int v3) {
136 this(new IdentityInt2_w2_d1(v0, v1), new IdentityInt2_w2_d1(v2, v3));
137 }
138 public int sum() {
139 return v0.sum() + v1.sum();
140 }
141
142 }
143
144 public static class RefState_of_Int extends SizeState {
145 public IdentityInt[] arr;
146 @Setup
147 public void setup() {
148 arr = new IdentityInt[size * 4];
149 for (int i = 0; i < arr.length; i++) {
150 arr[i] = new IdentityInt(i);
151 }
152 }
153 }
154
155 public static class IntState_of_Int extends SizeState {
156 public InterfaceSum[] arr;
157 @Setup
158 public void setup() {
159 arr = new InterfaceSum[size * 4];
160 for (int i = 0; i < arr.length; i++) {
161 arr[i] = new IdentityInt(i);
162 }
163 }
164 }
165
166 public static class RefState_of_Int2_w2_d0 extends SizeState {
167 public IdentityInt2_w2_d0[] arr;
168 @Setup
169 public void setup() {
170 arr = new IdentityInt2_w2_d0[size * 2];
171 for (int i = 0; i < arr.length; i++) {
172 arr[i] = new IdentityInt2_w2_d0(2 * i, 2 * i + 1);
173 }
174 }
175 }
176
177 public static class IntState_of_Int2_w2_d0 extends SizeState {
178 public InterfaceSum[] arr;
179 @Setup
180 public void setup() {
181 arr = new InterfaceSum[size * 2];
182 for (int i = 0; i < arr.length; i++) {
183 arr[i] = new IdentityInt2_w2_d0(2 * i, 2 * i + 1);
184 }
185 }
186 }
187
188 public static class RefState_of_Int2_w2_d1 extends SizeState {
189 public IdentityInt2_w2_d1[] arr;
190 @Setup
191 public void setup() {
192 arr = new IdentityInt2_w2_d1[size * 2];
193 for (int i = 0; i < arr.length; i++) {
194 arr[i] = new IdentityInt2_w2_d1(2 * i, 2 * i + 1);
195 }
196 }
197 }
198
199 public static class IntState_of_Int2_w2_d1 extends SizeState {
200 public InterfaceSum[] arr;
201 @Setup
202 public void setup() {
203 arr = new InterfaceSum[size * 2];
204 for (int i = 0; i < arr.length; i++) {
205 arr[i] = new IdentityInt2_w2_d1(2 * i, 2 * i + 1);
206 }
207 }
208 }
209
210 public static class RefState_of_Int4_w4_d0 extends SizeState {
211 public IdentityInt4_w4_d0[] arr;
212 @Setup
213 public void setup() {
214 arr = new IdentityInt4_w4_d0[size];
215 for (int i = 0; i < arr.length; i++) {
216 arr[i] = new IdentityInt4_w4_d0(4 * i, 4 * i + 1, 4 * i + 2, 4 * i + 3);
217 }
218 }
219 }
220
221 public static class IntState_of_Int4_w4_d0 extends SizeState {
222 public InterfaceSum[] arr;
223 @Setup
224 public void setup() {
225 arr = new InterfaceSum[size];
226 for (int i = 0; i < arr.length; i++) {
227 arr[i] = new IdentityInt4_w4_d0(4 * i, 4 * i + 1, 4 * i + 2, 4 * i + 3);
228 }
229 }
230 }
231
232 public static class RefState_of_Int4_w4_d1 extends SizeState {
233 public IdentityInt4_w4_d1[] arr;
234 @Setup
235 public void setup() {
236 arr = new IdentityInt4_w4_d1[size];
237 for (int i = 0; i < arr.length; i++) {
238 arr[i] = new IdentityInt4_w4_d1(4 * i, 4 * i + 1, 4 * i + 2, 4 * i + 3);
239 }
240 }
241 }
242
243 public static class IntState_of_Int4_w4_d1 extends SizeState {
244 public InterfaceSum[] arr;
245 @Setup
246 public void setup() {
247 arr = new InterfaceSum[size];
248 for (int i = 0; i < arr.length; i++) {
249 arr[i] = new IdentityInt4_w4_d1(4 * i, 4 * i + 1, 4 * i + 2, 4 * i + 3);
250 }
251 }
252 }
253
254 public static class RefState_of_Int4_w2_d1 extends SizeState {
255 public IdentityInt4_w2_d1[] arr;
256 @Setup
257 public void setup() {
258 arr = new IdentityInt4_w2_d1[size];
259 for (int i = 0; i < arr.length; i++) {
260 arr[i] = new IdentityInt4_w2_d1(4 * i, 4 * i + 1, 4 * i + 2, 4 * i + 3);
261 }
262 }
263 }
264
265 public static class IntState_of_Int4_w2_d1 extends SizeState {
266 public InterfaceSum[] arr;
267 @Setup
268 public void setup() {
269 arr = new InterfaceSum[size];
270 for (int i = 0; i < arr.length; i++) {
271 arr[i] = new IdentityInt4_w2_d1(4 * i, 4 * i + 1, 4 * i + 2, 4 * i + 3);
272 }
273 }
274 }
275
276 public static class RefState_of_Int4_w2_d2 extends SizeState {
277 public IdentityInt4_w2_d2[] arr;
278 @Setup
279 public void setup() {
280 arr = new IdentityInt4_w2_d2[size];
281 for (int i = 0; i < arr.length; i++) {
282 arr[i] = new IdentityInt4_w2_d2(4 * i, 4 * i + 1, 4 * i + 2, 4 * i + 3);
283 }
284 }
285 }
286
287 public static class IntState_of_Int4_w2_d2 extends SizeState {
288 public InterfaceSum[] arr;
289 @Setup
290 public void setup() {
291 arr = new InterfaceSum[size];
292 for (int i = 0; i < arr.length; i++) {
293 arr[i] = new IdentityInt4_w2_d2(4 * i, 4 * i + 1, 4 * i + 2, 4 * i + 3);
294 }
295 }
296 }
297
298 @CompilerControl(CompilerControl.Mode.DONT_INLINE)
299 public int sum_interface(InterfaceSum[] src) {
300 int s = 0;
301 for (var v : src) {
302 s += v.sum();
303 }
304 return s;
305 }
306
307 @CompilerControl(CompilerControl.Mode.DONT_INLINE)
308 public int sum_ref_of_Int(IdentityInt[] src) {
309 int s = 0;
310 for (var v : src) {
311 s += v.sum();
312 }
313 return s;
314 }
315
316 @CompilerControl(CompilerControl.Mode.DONT_INLINE)
317 public int sum_ref_of_Int2_w2_d0(IdentityInt2_w2_d0[] src) {
318 int s = 0;
319 for (var v : src) {
320 s += v.sum();
321 }
322 return s;
323 }
324
325 @CompilerControl(CompilerControl.Mode.DONT_INLINE)
326 public int sum_ref_of_Int2_w2_d1(IdentityInt2_w2_d1[] src) {
327 int s = 0;
328 for (var v : src) {
329 s += v.sum();
330 }
331 return s;
332 }
333
334 @CompilerControl(CompilerControl.Mode.DONT_INLINE)
335 public int sum_ref_of_Int4_w4_d0(IdentityInt4_w4_d0[] src) {
336 int s = 0;
337 for (var v : src) {
338 s += v.sum();
339 }
340 return s;
341 }
342
343 @CompilerControl(CompilerControl.Mode.DONT_INLINE)
344 public int sum_ref_of_Int4_w4_d1(IdentityInt4_w4_d1[] src) {
345 int s = 0;
346 for (var v : src) {
347 s += v.sum();
348 }
349 return s;
350 }
351
352 @CompilerControl(CompilerControl.Mode.DONT_INLINE)
353 public int sum_ref_of_Int4_w2_d1(IdentityInt4_w2_d1[] src) {
354 int s = 0;
355 for (var v : src) {
356 s += v.sum();
357 }
358 return s;
359 }
360
361 @CompilerControl(CompilerControl.Mode.DONT_INLINE)
362 public int sum_ref_of_Int4_w2_d2(IdentityInt4_w2_d2[] src) {
363 int s = 0;
364 for (var v : src) {
365 s += v.sum();
366 }
367 return s;
368 }
369
370 @Benchmark
371 public int sum_interface_of_Int(IntState_of_Int st) {
372 return sum_interface(st.arr);
373 }
374
375 @Benchmark
376 public int sum_interface_of_Int2_w2_d0(IntState_of_Int2_w2_d0 st) {
377 return sum_interface(st.arr);
378 }
379
380 @Benchmark
381 public int sum_interface_of_Int2_w2_d1(IntState_of_Int2_w2_d1 st) {
382 return sum_interface(st.arr);
383 }
384
385 @Benchmark
386 public int sum_interface_of_Int4_w4_d0(IntState_of_Int4_w4_d0 st) {
387 return sum_interface(st.arr);
388 }
389
390 @Benchmark
391 public int sum_interface_of_Int4_w4_d1(IntState_of_Int4_w4_d1 st) {
392 return sum_interface(st.arr);
393 }
394
395 @Benchmark
396 public int sum_interface_of_Int4_w2_d1(IntState_of_Int4_w2_d1 st) {
397 return sum_interface(st.arr);
398 }
399
400 @Benchmark
401 public int sum_interface_of_Int4_w2_d2(IntState_of_Int4_w2_d2 st) {
402 return sum_interface(st.arr);
403 }
404
405 @Benchmark
406 public int sum_ref_of_Int(RefState_of_Int st) {
407 return sum_ref_of_Int(st.arr);
408 }
409
410 @Benchmark
411 public int sum_ref_of_Int2_w2_d0(RefState_of_Int2_w2_d0 st) {
412 return sum_ref_of_Int2_w2_d0(st.arr);
413 }
414
415 @Benchmark
416 public int sum_ref_of_Int2_w2_d1(RefState_of_Int2_w2_d1 st) {
417 return sum_ref_of_Int2_w2_d1(st.arr);
418 }
419
420 @Benchmark
421 public int sum_ref_of_Int4_w4_d0(RefState_of_Int4_w4_d0 st) {
422 return sum_ref_of_Int4_w4_d0(st.arr);
423 }
424
425 @Benchmark
426 public int sum_ref_of_Int4_w4_d1(RefState_of_Int4_w4_d1 st) {
427 return sum_ref_of_Int4_w4_d1(st.arr);
428 }
429
430 @Benchmark
431 public int sum_ref_of_Int4_w2_d1(RefState_of_Int4_w2_d1 st) {
432 return sum_ref_of_Int4_w2_d1(st.arr);
433 }
434
435 @Benchmark
436 public int sum_ref_of_Int4_w2_d2(RefState_of_Int4_w2_d2 st) {
437 return sum_ref_of_Int4_w2_d2(st.arr);
438 }
439
440 }