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