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 jdk.internal.value.ValueClass;
 26 import jdk.internal.vm.annotation.NullRestricted;
 27 import jdk.internal.vm.annotation.Strict;
 28 import org.openjdk.jmh.annotations.Benchmark;
 29 import org.openjdk.jmh.annotations.CompilerControl;
 30 import org.openjdk.jmh.annotations.Fork;
 31 import org.openjdk.jmh.annotations.Setup;
 32 
 33 @Fork(value = 3, jvmArgsAppend = {"--enable-preview", "--add-exports", "java.base/jdk.internal.value=ALL-UNNAMED"})
 34 public class ValueNullFree extends SumBase {
 35 
 36     public interface InterfaceSum {
 37         public int sum();
 38     }
 39 
 40     public static value class ValueInt implements InterfaceSum {
 41         public final int v0;
 42         public ValueInt(int value) {
 43             this.v0 = value;
 44         }
 45         public int sum() {
 46             return v0;
 47         }
 48     }
 49 
 50     public static value class ValueInt2_by_int implements InterfaceSum {
 51         public final int v0, v1;
 52 
 53         public ValueInt2_by_int(int v0, int v1) {
 54             this.v0 = v0;
 55             this.v1 = v1;
 56         }
 57 
 58         public int sum() {
 59             return v0 + v1;
 60         }
 61     }
 62 
 63     public static value class ValueInt2_by_Int implements InterfaceSum {
 64         @Strict
 65         @NullRestricted
 66         public final ValueInt v0, v1;
 67 
 68         public ValueInt2_by_Int(ValueInt v0, ValueInt v1) {
 69             this.v0 = v0;
 70             this.v1 = v1;
 71         }
 72 
 73         public ValueInt2_by_Int(int v0, int v1) {
 74             this(new ValueInt(v0), new ValueInt(v1));
 75         }
 76 
 77         public int sum() {
 78             return v0.sum() + v1.sum();
 79         }
 80     }
 81 
 82     public static value class ValueInt4_by_int implements InterfaceSum {
 83         public final int v0, v1, v2, v3;
 84 
 85         public ValueInt4_by_int(int v0, int v1, int v2, int v3) {
 86             this.v0 = v0;
 87             this.v1 = v1;
 88             this.v2 = v2;
 89             this.v3 = v3;
 90         }
 91 
 92         public int sum() {
 93             return v0 + v1 + v2 + v3;
 94         }
 95     }
 96 
 97     public static value class ValueInt4_by_Int implements InterfaceSum {
 98         @Strict
 99         @NullRestricted
100         public final ValueInt v0, v1, v2, v3;
101 
102         public ValueInt4_by_Int(ValueInt v0, ValueInt v1, ValueInt v2, ValueInt v3) {
103             this.v0 = v0;
104             this.v1 = v1;
105             this.v2 = v2;
106             this.v3 = v3;
107         }
108 
109         public ValueInt4_by_Int(int v0, int v1, int v2, int v3) {
110             this(new ValueInt(v0), new ValueInt(v1), new ValueInt(v2), new ValueInt(v3));
111         }
112 
113         public int sum() {
114             return v0.sum() + v1.sum() + v2.sum() + v3.sum();
115         }
116     }
117 
118     public static value  class ValueInt4_by_int2 implements InterfaceSum {
119         @Strict
120         @NullRestricted
121         public final ValueInt2_by_int v0, v1;
122 
123         public ValueInt4_by_int2(ValueInt2_by_int v0, ValueInt2_by_int v1) {
124             this.v0 = v0;
125             this.v1 = v1;
126         }
127 
128         public ValueInt4_by_int2(int v0, int v1, int v2, int v3) {
129             this(new ValueInt2_by_int(v0, v1), new ValueInt2_by_int(v2, v3));
130         }
131 
132         public int sum() {
133             return v0.sum() + v1.sum();
134         }
135     }
136 
137     public static value class ValueInt4_by_Int2 implements InterfaceSum {
138         @Strict
139         @NullRestricted
140         public final ValueInt2_by_Int v0, v1;
141 
142         public ValueInt4_by_Int2(ValueInt2_by_Int v0, ValueInt2_by_Int v1) {
143             this.v0 = v0;
144             this.v1 = v1;
145         }
146 
147         public ValueInt4_by_Int2(int v0, int v1, int v2, int v3) {
148             this(new ValueInt2_by_Int(v0, v1), new ValueInt2_by_Int(v2, v3));
149         }
150         public int sum() {
151             return v0.sum() + v1.sum();
152         }
153 
154     }
155 
156     public static class ValState_of_Int extends SizeState {
157         public ValueInt[] arr;
158         @Setup
159         public void setup() {
160             arr = (ValueInt[])ValueClass.newNullRestrictedAtomicArray(ValueInt.class, size * 4, new ValueInt(0));
161             for (int i = 0; i < arr.length; i++) {
162                 arr[i] = new ValueInt(i);
163             }
164         }
165     }
166 
167     public static class IntState_of_Int extends SizeState {
168         public InterfaceSum[] arr;
169         @Setup
170         public void setup() {
171             arr = new InterfaceSum[size * 4];
172             for (int i = 0; i < arr.length; i++) {
173                 arr[i] = new ValueInt(i);
174             }
175         }
176     }
177 
178     public static class ValState_of_Int2_by_int extends SizeState {
179         public ValueInt2_by_int[] arr;
180         @Setup
181         public void setup() {
182             arr = (ValueInt2_by_int[])ValueClass.newNullRestrictedAtomicArray(ValueInt2_by_int.class, size * 2, new ValueInt2_by_int(0, 0));
183             for (int i = 0; i < arr.length; i++) {
184                 arr[i] = new ValueInt2_by_int(2 * i, 2 * i + 1);
185             }
186         }
187     }
188 
189     public static class IntState_of_Int2_by_int extends SizeState {
190         public InterfaceSum[] arr;
191         @Setup
192         public void setup() {
193             arr = new InterfaceSum[size * 2];
194             for (int i = 0; i < arr.length; i++) {
195                 arr[i] = new ValueInt2_by_int(2 * i, 2 * i + 1);
196             }
197         }
198     }
199 
200     public static class ValState_of_Int2_by_Int extends SizeState {
201         public ValueInt2_by_Int[] arr;
202         @Setup
203         public void setup() {
204             arr = (ValueInt2_by_Int[])ValueClass.newNullRestrictedAtomicArray(ValueInt2_by_Int.class, size * 4, new ValueInt2_by_Int(0, 0));
205             for (int i = 0; i < arr.length; i++) {
206                 arr[i] = new ValueInt2_by_Int(2 * i, 2 * i + 1);
207             }
208         }
209     }
210 
211     public static class IntState_of_Int2_by_Int extends SizeState {
212         public InterfaceSum[] arr;
213         @Setup
214         public void setup() {
215             arr = new InterfaceSum[size * 2];
216             for (int i = 0; i < arr.length; i++) {
217                 arr[i] = new ValueInt2_by_Int(2 * i, 2 * i + 1);
218             }
219         }
220     }
221 
222     public static class ValState_of_Int4_by_int extends SizeState {
223         public ValueInt4_by_int[] arr;
224         @Setup
225         public void setup() {
226             arr = (ValueInt4_by_int[])ValueClass.newNullRestrictedAtomicArray(ValueInt4_by_int.class, size, new ValueInt4_by_int(0, 0, 0,  0));
227             for (int i = 0; i < arr.length; i++) {
228                 arr[i] = new ValueInt4_by_int(4 * i, 4 * i + 1, 4 * i + 2, 4 * i + 3);
229             }
230         }
231     }
232 
233     public static class IntState_of_Int4_by_int extends SizeState {
234         public InterfaceSum[] arr;
235         @Setup
236         public void setup() {
237             arr = new InterfaceSum[size];
238             for (int i = 0; i < arr.length; i++) {
239                 arr[i] = new ValueInt4_by_int(4 * i, 4 * i + 1, 4 * i + 2, 4 * i + 3);
240             }
241         }
242     }
243 
244     public static class ValState_of_Int4_by_Int extends SizeState {
245         public ValueInt4_by_Int[] arr;
246         @Setup
247         public void setup() {
248             arr = (ValueInt4_by_Int[])ValueClass.newNullRestrictedAtomicArray(ValueInt4_by_Int.class, size, new ValueInt4_by_Int(0, 0, 0,  0));
249             for (int i = 0; i < arr.length; i++) {
250                 arr[i] = new ValueInt4_by_Int(4 * i, 4 * i + 1, 4 * i + 2, 4 * i + 3);
251             }
252         }
253     }
254 
255     public static class IntState_of_Int4_by_Int extends SizeState {
256         public InterfaceSum[] arr;
257         @Setup
258         public void setup() {
259             arr = new InterfaceSum[size];
260             for (int i = 0; i < arr.length; i++) {
261                 arr[i] = new ValueInt4_by_Int(4 * i, 4 * i + 1, 4 * i + 2, 4 * i + 3);
262             }
263         }
264     }
265 
266     public static class ValState_of_Int4_by_int2 extends SizeState {
267         public ValueInt4_by_int2[] arr;
268         @Setup
269         public void setup() {
270             arr = (ValueInt4_by_int2[])ValueClass.newNullRestrictedAtomicArray(ValueInt4_by_int2.class, size, new ValueInt4_by_int2(0, 0, 0,  0));
271             for (int i = 0; i < arr.length; i++) {
272                 arr[i] = new ValueInt4_by_int2(4 * i, 4 * i + 1, 4 * i + 2, 4 * i + 3);
273             }
274         }
275     }
276 
277     public static class IntState_of_Int4_by_int2 extends SizeState {
278         public InterfaceSum[] arr;
279         @Setup
280         public void setup() {
281             arr = new InterfaceSum[size];
282             for (int i = 0; i < arr.length; i++) {
283                 arr[i] = new ValueInt4_by_int2(4 * i, 4 * i + 1, 4 * i + 2, 4 * i + 3);
284             }
285         }
286     }
287 
288     public static class ValState_of_Int4_by_Int2 extends SizeState {
289         public ValueInt4_by_Int2[] arr;
290         @Setup
291         public void setup() {
292             arr = (ValueInt4_by_Int2[])ValueClass.newNullRestrictedAtomicArray(ValueInt4_by_Int2.class, size, new ValueInt4_by_Int2(0, 0, 0,  0));
293             for (int i = 0; i < arr.length; i++) {
294                 arr[i] = new ValueInt4_by_Int2(4 * i, 4 * i + 1, 4 * i + 2, 4 * i + 3);
295             }
296         }
297     }
298 
299     public static class IntState_of_Int4_by_Int2 extends SizeState {
300         public InterfaceSum[] arr;
301         @Setup
302         public void setup() {
303             arr = new InterfaceSum[size];
304             for (int i = 0; i < arr.length; i++) {
305                 arr[i] = new ValueInt4_by_Int2(4 * i, 4 * i + 1, 4 * i + 2, 4 * i + 3);
306             }
307         }
308     }
309 
310     @CompilerControl(CompilerControl.Mode.DONT_INLINE)
311     public int sum_interface(InterfaceSum[] src) {
312         int s = 0;
313         for (var v : src) {
314             s += v.sum();
315         }
316         return s;
317     }
318 
319     @CompilerControl(CompilerControl.Mode.DONT_INLINE)
320     public int sum_val_of_Int(ValueInt[] src) {
321         int s = 0;
322         for (var v : src) {
323             s += v.sum();
324         }
325         return s;
326     }
327 
328     @CompilerControl(CompilerControl.Mode.DONT_INLINE)
329     public int sum_val_of_Int2_by_int(ValueInt2_by_int[] src) {
330         int s = 0;
331         for (var v : src) {
332             s += v.sum();
333         }
334         return s;
335     }
336 
337     @CompilerControl(CompilerControl.Mode.DONT_INLINE)
338     public int sum_val_of_Int2_by_Int(ValueInt2_by_Int[] src) {
339         int s = 0;
340         for (var v : src) {
341             s += v.sum();
342         }
343         return s;
344     }
345 
346     @CompilerControl(CompilerControl.Mode.DONT_INLINE)
347     public int sum_val_of_Int4_by_int(ValueInt4_by_int[] src) {
348         int s = 0;
349         for (var v : src) {
350             s += v.sum();
351         }
352         return s;
353     }
354 
355     @CompilerControl(CompilerControl.Mode.DONT_INLINE)
356     public int sum_val_of_Int4_by_Int(ValueInt4_by_Int[] src) {
357         int s = 0;
358         for (var v : src) {
359             s += v.sum();
360         }
361         return s;
362     }
363 
364     @CompilerControl(CompilerControl.Mode.DONT_INLINE)
365     public int sum_val_of_Int4_by_int2(ValueInt4_by_int2[] src) {
366         int s = 0;
367         for (var v : src) {
368             s += v.sum();
369         }
370         return s;
371     }
372 
373     @CompilerControl(CompilerControl.Mode.DONT_INLINE)
374     public int sum_val_of_Int4_by_Int2(ValueInt4_by_Int2[] src) {
375         int s = 0;
376         for (var v : src) {
377             s += v.sum();
378         }
379         return s;
380     }
381 
382     @Benchmark
383     public int sum_interface_of_Int(IntState_of_Int st) {
384         return sum_interface(st.arr);
385     }
386 
387     @Benchmark
388     public int sum_interface_of_Int2_by_int(IntState_of_Int2_by_int st) {
389         return sum_interface(st.arr);
390     }
391 
392     @Benchmark
393     public int sum_interface_of_Int2_by_Int(IntState_of_Int2_by_Int st) {
394         return sum_interface(st.arr);
395     }
396 
397     @Benchmark
398     public int sum_interface_of_Int4_by_int(IntState_of_Int4_by_int st) {
399         return sum_interface(st.arr);
400     }
401 
402     @Benchmark
403     public int sum_interface_of_Int4_by_Int(IntState_of_Int4_by_Int st) {
404         return sum_interface(st.arr);
405     }
406 
407     @Benchmark
408     public int sum_interface_of_Int4_by_int2(IntState_of_Int4_by_int2 st) {
409         return sum_interface(st.arr);
410     }
411 
412     @Benchmark
413     public int sum_interface_of_Int4_by_Int2(IntState_of_Int4_by_Int2 st) {
414         return sum_interface(st.arr);
415     }
416 
417     @Benchmark
418     public int sum_val_of_Int(ValState_of_Int st) {
419         return sum_val_of_Int(st.arr);
420     }
421 
422     @Benchmark
423     public int sum_val_of_Int2_by_int(ValState_of_Int2_by_int st) {
424         return sum_val_of_Int2_by_int(st.arr);
425     }
426 
427     @Benchmark
428     public int sum_val_of_Int2_by_Int(ValState_of_Int2_by_Int st) {
429         return sum_val_of_Int2_by_Int(st.arr);
430     }
431 
432     @Benchmark
433     public int sum_val_of_Int4_by_int(ValState_of_Int4_by_int st) {
434         return sum_val_of_Int4_by_int(st.arr);
435     }
436 
437     @Benchmark
438     public int sum_val_of_Int4_by_Int(ValState_of_Int4_by_Int st) {
439         return sum_val_of_Int4_by_Int(st.arr);
440     }
441 
442     @Benchmark
443     public int sum_val_of_Int4_by_int2(ValState_of_Int4_by_int2 st) {
444         return sum_val_of_Int4_by_int2(st.arr);
445     }
446 
447     @Benchmark
448     public int sum_val_of_Int4_by_Int2(ValState_of_Int4_by_Int2 st) {
449         return sum_val_of_Int4_by_Int2(st.arr);
450     }
451 
452 }