< prev index next >

test/hotspot/jtreg/runtime/valhalla/valuetypes/ValueTypesTest.java

Print this page




  34 import java.util.concurrent.*;
  35 
  36 import static jdk.test.lib.Asserts.*;
  37 
  38 import jdk.experimental.bytecode.MacroCodeBuilder;
  39 import jdk.experimental.bytecode.MacroCodeBuilder.CondKind;
  40 import jdk.experimental.bytecode.TypeTag;
  41 import jdk.test.lib.Utils;
  42 
  43 import jdk.experimental.value.MethodHandleBuilder;
  44 
  45 import javax.tools.*;
  46 
  47 /**
  48  * @test ValueTypesTest
  49  * @summary Test data movement with value types
  50  * @modules java.base/jdk.experimental.bytecode
  51  *          java.base/jdk.experimental.value
  52  * @library /test/lib
  53  * @compile -XDenableValueTypes TestValue1.java TestValue2.java TestValue3.java TestValue4.java ValueTypesTest.java
  54  * @run main/othervm -Xint -Xmx128m -XX:+EnableValhalla -XX:-ShowMessageBoxOnError
  55  *                   -XX:+ExplicitGCInvokesConcurrent
  56  *                   -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions
  57  *                   -Djava.lang.invoke.MethodHandle.DUMP_CLASS_FILES=false
  58  *                   runtime.valhalla.valuetypes.ValueTypesTest
  59  * @run main/othervm -Xmx128m -XX:+EnableValhalla -XX:-ShowMessageBoxOnError
  60  *                   -XX:+ExplicitGCInvokesConcurrent
  61  *                   -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions
  62  *                   -Djava.lang.invoke.MethodHandle.DUMP_CLASS_FILES=true
  63  *                   runtime.valhalla.valuetypes.ValueTypesTest
  64  */
  65 public class ValueTypesTest {
  66 
  67     public static void main(String[] args) {
  68         Class<?> valueClass = runtime.valhalla.valuetypes.TestValue1.class;
  69         Class<?> testClasses[] = {
  70                 runtime.valhalla.valuetypes.TestValue1.class,
  71                 runtime.valhalla.valuetypes.TestValue2.class,
  72                 runtime.valhalla.valuetypes.TestValue3.class,
  73                 runtime.valhalla.valuetypes.TestValue4.class
  74         };


  77                 runtime.valhalla.valuetypes.ContainerValue2.class,
  78                 runtime.valhalla.valuetypes.ContainerValue3.class,
  79                 runtime.valhalla.valuetypes.ContainerValue4.class
  80         };
  81 
  82         for (int i = 0; i < testClasses.length; i++) {
  83             try {
  84                 testExecutionStackToLocalVariable(testClasses[i]);
  85                 testExecutionStackToFields(testClasses[i], containerClasses[i]);
  86                 testExecutionStackToValueArray(testClasses[i], containerClasses[i]);
  87             } catch (Throwable t) {
  88                 t.printStackTrace();
  89                 throw new RuntimeException(t);
  90             }
  91         }
  92     }
  93 
  94     static MethodHandles.Lookup LOOKUP = MethodHandles.lookup();
  95 
  96     static void testExecutionStackToLocalVariable(Class<?> valueClass) throws Throwable {
  97         String sig = "()Q" + valueClass.getName() + ";";
  98         final String signature = sig.replace('.', '/');
  99         System.out.println(signature);
 100         MethodHandle fromExecStackToLocalVar = MethodHandleBuilder.loadCode(
 101                 LOOKUP,
 102                 "execStackToLocalVar",
 103                 MethodType.methodType(boolean.class),
 104                 CODE -> {
 105                     CODE.invokestatic(System.class, "gc", "()V", false);
 106                     int n = -1;
 107                     while (n < 1024) {
 108                         n++;
 109                         CODE
 110                                 .invokestatic(valueClass, "getInstance", signature, false)
 111                                 .vstore(n);
 112                         n++;
 113                         CODE
 114                                 .invokestatic(valueClass, "getNonBufferedInstance", signature, false)
 115                                 .vstore(n);
 116                     }
 117                     CODE.invokestatic(System.class, "gc", "()V", false);
 118                     while (n > 0) {
 119                         CODE
 120                                 .vload(n)
 121                                 .invokevirtual(valueClass, "verify", "()Z", false)
 122                                 .iconst_1()
 123                                 .ifcmp(TypeTag.I, CondKind.NE, "end");
 124                         n--;
 125                     }
 126                     CODE
 127                             .iconst_1()
 128                             .return_(TypeTag.Z)
 129                             .label("end")
 130                             .iconst_0()
 131                             .return_(TypeTag.Z);
 132                 });
 133         boolean result = (boolean) fromExecStackToLocalVar.invokeExact();
 134         System.out.println(result);
 135         assertTrue(result, "Invariant");
 136     }
 137 
 138     static void testExecutionStackToFields(Class<?> valueClass, Class<?> containerClass) throws Throwable {
 139         final int ITERATIONS = 512;
 140         String sig = "()Q" + valueClass.getName() + ";";
 141         final String methodSignature = sig.replace('.', '/');
 142         final String fieldSignature = "Q" + valueClass.getName().replace('.', '/') + ";";
 143         System.out.println(methodSignature);
 144         MethodHandle fromExecStackToFields = MethodHandleBuilder.loadCode(
 145                 LOOKUP,
 146                 "execStackToFields",
 147                 MethodType.methodType(boolean.class),
 148                 CODE -> {
 149                     CODE
 150                             .invokestatic(System.class, "gc", "()V", false)
 151                             .new_(containerClass)
 152                             .dup()
 153                             .invoke(MacroCodeBuilder.InvocationKind.INVOKESPECIAL, containerClass, "<init>", "()V", false)
 154                             .astore_1()
 155                             .iconst_m1()
 156                             .istore_2()
 157                             .label("loop")
 158                             .iload_2()
 159                             .ldc(ITERATIONS)
 160                             .ifcmp(TypeTag.I, CondKind.EQ, "end")
 161                             .aload_1()
 162                             .invokestatic(valueClass, "getInstance", methodSignature, false)


 189                             .getstatic(containerClass, "staticValueField", fieldSignature)
 190                             .invokevirtual(valueClass, "verify", "()Z", false)
 191                             .iconst_1()
 192                             .ifcmp(TypeTag.I, CondKind.NE, "failed")
 193                             .iinc(2, 1)
 194                             .goto_("loop")
 195                             .label("end")
 196                             .iconst_1()
 197                             .return_(TypeTag.Z)
 198                             .label("failed")
 199                             .iconst_0()
 200                             .return_(TypeTag.Z);
 201                 });
 202         boolean result = (boolean) fromExecStackToFields.invokeExact();
 203         System.out.println(result);
 204         assertTrue(result, "Invariant");
 205     }
 206 
 207     static void testExecutionStackToValueArray(Class<?> valueClass, Class<?> containerClass) throws Throwable {
 208         final int ITERATIONS = 100;
 209         String sig = "()Q" + valueClass.getName() + ";";
 210         final String signature = sig.replace('.', '/');
 211         final String arraySignature = "[Q" + valueClass.getName().replace('.', '/') + ";";
 212         System.out.println(arraySignature);
 213         MethodHandle fromExecStackToValueArray = MethodHandleBuilder.loadCode(
 214                 LOOKUP,
 215                 "execStackToValueArray",
 216                 MethodType.methodType(boolean.class),
 217                 CODE -> {
 218                     CODE
 219                             .invokestatic(System.class, "gc", "()V", false)
 220                             .new_(containerClass)
 221                             .dup()
 222                             .invoke(MacroCodeBuilder.InvocationKind.INVOKESPECIAL, containerClass, "<init>", "()V", false)
 223                             .astore_1()
 224                             .ldc(ITERATIONS * 3)
 225                             .anewarray(valueClass)
 226                             .astore_2()
 227                             .aload_2()
 228                             .aload_1()
 229                             .swap()
 230                             .putfield(containerClass, "valueArray", arraySignature)
 231                             .iconst_0()
 232                             .istore_3()
 233                             .label("loop1")
 234                             .iload_3()
 235                             .ldc(ITERATIONS)
 236                             .ifcmp(TypeTag.I, CondKind.GE, "end1")
 237                             .aload_2()
 238                             .iload_3()
 239                             .invokestatic(valueClass, "getInstance", signature, false)
 240                             .vastore()
 241                             .iinc(3, 1)
 242                             .aload_2()
 243                             .iload_3()
 244                             .invokestatic(valueClass, "getNonBufferedInstance", signature, false)
 245                             .vastore()
 246                             .iinc(3, 1)
 247                             .aload_2()
 248                             .iload_3()
 249                             .vdefault(valueClass)
 250                             .vastore()
 251                             .iinc(3, 1)
 252                             .goto_("loop1")
 253                             .label("end1")
 254                             .invokestatic(System.class, "gc", "()V", false)
 255                             .iconst_0()
 256                             .istore_3()
 257                             .label("loop2")
 258                             .iload_3()
 259                             .ldc(ITERATIONS * 3)
 260                             .ifcmp(TypeTag.I, CondKind.GE, "end2")
 261                             .aload_2()
 262                             .iload_3()
 263                             .vaload()
 264                             .invokevirtual(valueClass, "verify", "()Z", false)
 265                             .iconst_1()
 266                             .ifcmp(TypeTag.I, CondKind.NE, "failed")
 267                             .iinc(3, 1)
 268                             .goto_("loop2")
 269                             .label("end2")
 270                             .iconst_1()
 271                             .return_(TypeTag.Z)
 272                             .label("failed")
 273                             .iconst_0()
 274                             .return_(TypeTag.Z);
 275                 });
 276         boolean result = (boolean) fromExecStackToValueArray.invokeExact();
 277         System.out.println(result);
 278         assertTrue(result, "Invariant");
 279     }
 280 
 281 
 282 }


  34 import java.util.concurrent.*;
  35 
  36 import static jdk.test.lib.Asserts.*;
  37 
  38 import jdk.experimental.bytecode.MacroCodeBuilder;
  39 import jdk.experimental.bytecode.MacroCodeBuilder.CondKind;
  40 import jdk.experimental.bytecode.TypeTag;
  41 import jdk.test.lib.Utils;
  42 
  43 import jdk.experimental.value.MethodHandleBuilder;
  44 
  45 import javax.tools.*;
  46 
  47 /**
  48  * @test ValueTypesTest
  49  * @summary Test data movement with value types
  50  * @modules java.base/jdk.experimental.bytecode
  51  *          java.base/jdk.experimental.value
  52  * @library /test/lib
  53  * @compile -XDenableValueTypes TestValue1.java TestValue2.java TestValue3.java TestValue4.java ValueTypesTest.java
  54  * @run main/othervm -noverify -Xint -Xmx128m -XX:+EnableValhalla -XX:-ShowMessageBoxOnError
  55  *                   -XX:+ExplicitGCInvokesConcurrent
  56  *                   -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions
  57  *                   -Djava.lang.invoke.MethodHandle.DUMP_CLASS_FILES=false
  58  *                   runtime.valhalla.valuetypes.ValueTypesTest
  59  * @run main/othervm -Xmx128m -XX:+EnableValhalla -XX:-ShowMessageBoxOnError
  60  *                   -XX:+ExplicitGCInvokesConcurrent
  61  *                   -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions
  62  *                   -Djava.lang.invoke.MethodHandle.DUMP_CLASS_FILES=true
  63  *                   runtime.valhalla.valuetypes.ValueTypesTest
  64  */
  65 public class ValueTypesTest {
  66 
  67     public static void main(String[] args) {
  68         Class<?> valueClass = runtime.valhalla.valuetypes.TestValue1.class;
  69         Class<?> testClasses[] = {
  70                 runtime.valhalla.valuetypes.TestValue1.class,
  71                 runtime.valhalla.valuetypes.TestValue2.class,
  72                 runtime.valhalla.valuetypes.TestValue3.class,
  73                 runtime.valhalla.valuetypes.TestValue4.class
  74         };


  77                 runtime.valhalla.valuetypes.ContainerValue2.class,
  78                 runtime.valhalla.valuetypes.ContainerValue3.class,
  79                 runtime.valhalla.valuetypes.ContainerValue4.class
  80         };
  81 
  82         for (int i = 0; i < testClasses.length; i++) {
  83             try {
  84                 testExecutionStackToLocalVariable(testClasses[i]);
  85                 testExecutionStackToFields(testClasses[i], containerClasses[i]);
  86                 testExecutionStackToValueArray(testClasses[i], containerClasses[i]);
  87             } catch (Throwable t) {
  88                 t.printStackTrace();
  89                 throw new RuntimeException(t);
  90             }
  91         }
  92     }
  93 
  94     static MethodHandles.Lookup LOOKUP = MethodHandles.lookup();
  95 
  96     static void testExecutionStackToLocalVariable(Class<?> valueClass) throws Throwable {
  97         String sig = "()L" + valueClass.getName() + ";";
  98         final String signature = sig.replace('.', '/');
  99         System.out.println(signature);
 100         MethodHandle fromExecStackToLocalVar = MethodHandleBuilder.loadCode(
 101                 LOOKUP,
 102                 "execStackToLocalVar",
 103                 MethodType.methodType(boolean.class),
 104                 CODE -> {
 105                     CODE.invokestatic(System.class, "gc", "()V", false);
 106                     int n = -1;
 107                     while (n < 1024) {
 108                         n++;
 109                         CODE
 110                                 .invokestatic(valueClass, "getInstance", signature, false)
 111                                 .astore(n);
 112                         n++;
 113                         CODE
 114                                 .invokestatic(valueClass, "getNonBufferedInstance", signature, false)
 115                                 .astore(n);
 116                     }
 117                     CODE.invokestatic(System.class, "gc", "()V", false);
 118                     while (n > 0) {
 119                         CODE
 120                                 .aload(n)
 121                                 .invokevirtual(valueClass, "verify", "()Z", false)
 122                                 .iconst_1()
 123                                 .ifcmp(TypeTag.I, CondKind.NE, "end");
 124                         n--;
 125                     }
 126                     CODE
 127                             .iconst_1()
 128                             .return_(TypeTag.Z)
 129                             .label("end")
 130                             .iconst_0()
 131                             .return_(TypeTag.Z);
 132                 });
 133         boolean result = (boolean) fromExecStackToLocalVar.invokeExact();
 134         System.out.println(result);
 135         assertTrue(result, "Invariant");
 136     }
 137 
 138     static void testExecutionStackToFields(Class<?> valueClass, Class<?> containerClass) throws Throwable {
 139         final int ITERATIONS = 512;
 140         String sig = "()L" + valueClass.getName() + ";";
 141         final String methodSignature = sig.replace('.', '/');
 142         final String fieldSignature = "L" + valueClass.getName().replace('.', '/') + ";";
 143         System.out.println(methodSignature);
 144         MethodHandle fromExecStackToFields = MethodHandleBuilder.loadCode(
 145                 LOOKUP,
 146                 "execStackToFields",
 147                 MethodType.methodType(boolean.class),
 148                 CODE -> {
 149                     CODE
 150                             .invokestatic(System.class, "gc", "()V", false)
 151                             .new_(containerClass)
 152                             .dup()
 153                             .invoke(MacroCodeBuilder.InvocationKind.INVOKESPECIAL, containerClass, "<init>", "()V", false)
 154                             .astore_1()
 155                             .iconst_m1()
 156                             .istore_2()
 157                             .label("loop")
 158                             .iload_2()
 159                             .ldc(ITERATIONS)
 160                             .ifcmp(TypeTag.I, CondKind.EQ, "end")
 161                             .aload_1()
 162                             .invokestatic(valueClass, "getInstance", methodSignature, false)


 189                             .getstatic(containerClass, "staticValueField", fieldSignature)
 190                             .invokevirtual(valueClass, "verify", "()Z", false)
 191                             .iconst_1()
 192                             .ifcmp(TypeTag.I, CondKind.NE, "failed")
 193                             .iinc(2, 1)
 194                             .goto_("loop")
 195                             .label("end")
 196                             .iconst_1()
 197                             .return_(TypeTag.Z)
 198                             .label("failed")
 199                             .iconst_0()
 200                             .return_(TypeTag.Z);
 201                 });
 202         boolean result = (boolean) fromExecStackToFields.invokeExact();
 203         System.out.println(result);
 204         assertTrue(result, "Invariant");
 205     }
 206 
 207     static void testExecutionStackToValueArray(Class<?> valueClass, Class<?> containerClass) throws Throwable {
 208         final int ITERATIONS = 100;
 209         String sig = "()L" + valueClass.getName() + ";";
 210         final String signature = sig.replace('.', '/');
 211         final String arraySignature = "[L" + valueClass.getName().replace('.', '/') + ";";
 212         System.out.println(arraySignature);
 213         MethodHandle fromExecStackToValueArray = MethodHandleBuilder.loadCode(
 214                 LOOKUP,
 215                 "execStackToValueArray",
 216                 MethodType.methodType(boolean.class),
 217                 CODE -> {
 218                     CODE
 219                             .invokestatic(System.class, "gc", "()V", false)
 220                             .new_(containerClass)
 221                             .dup()
 222                             .invoke(MacroCodeBuilder.InvocationKind.INVOKESPECIAL, containerClass, "<init>", "()V", false)
 223                             .astore_1()
 224                             .ldc(ITERATIONS * 3)
 225                             .anewarray(valueClass)
 226                             .astore_2()
 227                             .aload_2()
 228                             .aload_1()
 229                             .swap()
 230                             .putfield(containerClass, "valueArray", arraySignature)
 231                             .iconst_0()
 232                             .istore_3()
 233                             .label("loop1")
 234                             .iload_3()
 235                             .ldc(ITERATIONS)
 236                             .ifcmp(TypeTag.I, CondKind.GE, "end1")
 237                             .aload_2()
 238                             .iload_3()
 239                             .invokestatic(valueClass, "getInstance", signature, false)
 240                             .aastore()
 241                             .iinc(3, 1)
 242                             .aload_2()
 243                             .iload_3()
 244                             .invokestatic(valueClass, "getNonBufferedInstance", signature, false)
 245                             .aastore()
 246                             .iinc(3, 1)
 247                             .aload_2()
 248                             .iload_3()
 249                             .vdefault(valueClass)
 250                             .aastore()
 251                             .iinc(3, 1)
 252                             .goto_("loop1")
 253                             .label("end1")
 254                             .invokestatic(System.class, "gc", "()V", false)
 255                             .iconst_0()
 256                             .istore_3()
 257                             .label("loop2")
 258                             .iload_3()
 259                             .ldc(ITERATIONS * 3)
 260                             .ifcmp(TypeTag.I, CondKind.GE, "end2")
 261                             .aload_2()
 262                             .iload_3()
 263                             .aaload()
 264                             .invokevirtual(valueClass, "verify", "()Z", false)
 265                             .iconst_1()
 266                             .ifcmp(TypeTag.I, CondKind.NE, "failed")
 267                             .iinc(3, 1)
 268                             .goto_("loop2")
 269                             .label("end2")
 270                             .iconst_1()
 271                             .return_(TypeTag.Z)
 272                             .label("failed")
 273                             .iconst_0()
 274                             .return_(TypeTag.Z);
 275                 });
 276         boolean result = (boolean) fromExecStackToValueArray.invokeExact();
 277         System.out.println(result);
 278         assertTrue(result, "Invariant");
 279     }
 280 
 281 
 282 }
< prev index next >