21 * questions.
22 */
23
24 package compiler.valhalla.valuetypes;
25
26 import java.lang.invoke.*;
27
28 import jdk.experimental.value.MethodHandleBuilder;
29 import jdk.experimental.bytecode.MacroCodeBuilder;
30 import jdk.experimental.bytecode.MacroCodeBuilder.CondKind;
31 import jdk.experimental.bytecode.TypeTag;
32 import jdk.test.lib.Asserts;
33
34 /*
35 * @test
36 * @summary Test value types in LWorld.
37 * @modules java.base/jdk.experimental.bytecode
38 * java.base/jdk.experimental.value
39 * @library /testlibrary /test/lib /compiler/whitebox /
40 * @requires os.simpleArch == "x64"
41 * @compile -XDenableValueTypes -XDallowFlattenabilityModifiers TestLWorld.java
42 * @run driver ClassFileInstaller sun.hotspot.WhiteBox jdk.test.lib.Platform
43 * @run main/othervm/timeout=120 -Xbootclasspath/a:. -ea -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockDiagnosticVMOptions
44 * -XX:+UnlockExperimentalVMOptions -XX:+WhiteBoxAPI -XX:+AlwaysIncrementalInline
45 * -XX:+EnableValhalla -XX:+ValueTypePassFieldsAsArgs -XX:+ValueTypeReturnedAsFields -XX:+ValueArrayFlatten
46 * -XX:ValueFieldMaxFlatSize=-1 -XX:ValueArrayElemMaxFlatSize=-1 -XX:ValueArrayElemMaxFlatOops=-1
47 * compiler.valhalla.valuetypes.TestLWorld
48 * @run main/othervm/timeout=120 -Xbootclasspath/a:. -ea -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockDiagnosticVMOptions
49 * -XX:+UnlockExperimentalVMOptions -XX:+WhiteBoxAPI -XX:-UseCompressedOops -XX:-UseOptoBiasInlining
50 * -XX:+EnableValhalla -XX:-ValueTypePassFieldsAsArgs -XX:-ValueTypeReturnedAsFields -XX:+ValueArrayFlatten
51 * -XX:ValueFieldMaxFlatSize=-1 -XX:ValueArrayElemMaxFlatSize=-1 -XX:ValueArrayElemMaxFlatOops=-1
52 * compiler.valhalla.valuetypes.TestLWorld
53 * @run main/othervm/timeout=120 -Xbootclasspath/a:. -ea -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockDiagnosticVMOptions
54 * -XX:+UnlockExperimentalVMOptions -XX:+WhiteBoxAPI -XX:-UseCompressedOops -XX:-UseBiasedLocking
55 * -XX:+EnableValhalla -XX:+ValueTypePassFieldsAsArgs -XX:+ValueTypeReturnedAsFields -XX:-ValueArrayFlatten
56 * -XX:ValueFieldMaxFlatSize=0 -XX:ValueArrayElemMaxFlatSize=0 -XX:ValueArrayElemMaxFlatOops=0
57 * -DVerifyIR=false compiler.valhalla.valuetypes.TestLWorld
58 * @run main/othervm/timeout=120 -Xbootclasspath/a:. -ea -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockDiagnosticVMOptions
59 * -XX:+UnlockExperimentalVMOptions -XX:+WhiteBoxAPI -XX:+AlwaysIncrementalInline -XX:-UseBiasedLocking
60 * -XX:+EnableValhalla -XX:-ValueTypePassFieldsAsArgs -XX:-ValueTypeReturnedAsFields -XX:+ValueArrayFlatten
429 }
430
431 private static final MethodHandle getNull = MethodHandleBuilder.loadCode(MethodHandles.lookup(),
432 "getNull",
433 MethodType.methodType(MyValue1.class),
434 CODE -> {
435 CODE.
436 aconst_null().
437 areturn();
438 }
439 );
440
441 @Test
442 public void test13() throws Throwable {
443 try {
444 valueField1 = (MyValue1)getNull.invoke();
445 throw new RuntimeException("NullPointerException expected");
446 } catch (NullPointerException e) {
447 // Expected
448 }
449 nullField = (MyValue1)getNull.invoke(); // Should not throw
450 }
451
452 @DontCompile
453 public void test13_verifier(boolean warmup) throws Throwable {
454 test13();
455 }
456
457 // null constant
458 private static final MethodHandle setNull = MethodHandleBuilder.loadCode(MethodHandles.lookup(),
459 "setNull",
460 MethodType.methodType(void.class, TestLWorld.class),
461 CODE -> {
462 CODE.
463 aload_0().
464 aconst_null().
465 putfield(TestLWorld.class, "valueField1", "Lcompiler/valhalla/valuetypes/MyValue1;").
466 return_();
467 }
468 );
469
2072 public void test76_verifier(boolean warmup) {
2073 test76(testValue1);
2074 }
2075
2076 // Test synchronization without any instructions in the synchronized block
2077 @Test()
2078 public void test77(Object o) {
2079 synchronized (o) { }
2080 }
2081
2082 @DontCompile
2083 public void test77_verifier(boolean warmup) {
2084 try {
2085 test77(testValue1);
2086 } catch (IllegalMonitorStateException ex) {
2087 // Expected
2088 return;
2089 }
2090 throw new RuntimeException("test77 failed: no exception thrown");
2091 }
2092 }
|
21 * questions.
22 */
23
24 package compiler.valhalla.valuetypes;
25
26 import java.lang.invoke.*;
27
28 import jdk.experimental.value.MethodHandleBuilder;
29 import jdk.experimental.bytecode.MacroCodeBuilder;
30 import jdk.experimental.bytecode.MacroCodeBuilder.CondKind;
31 import jdk.experimental.bytecode.TypeTag;
32 import jdk.test.lib.Asserts;
33
34 /*
35 * @test
36 * @summary Test value types in LWorld.
37 * @modules java.base/jdk.experimental.bytecode
38 * java.base/jdk.experimental.value
39 * @library /testlibrary /test/lib /compiler/whitebox /
40 * @requires os.simpleArch == "x64"
41 * @build GetNullAsm RarelyUsedValueUserAsm
42 * @compile -XDenableValueTypes -XDallowFlattenabilityModifiers TestLWorld.java
43 * @run driver ClassFileInstaller sun.hotspot.WhiteBox jdk.test.lib.Platform
44 * @run main/othervm/timeout=120 -Xbootclasspath/a:. -ea -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockDiagnosticVMOptions
45 * -XX:+UnlockExperimentalVMOptions -XX:+WhiteBoxAPI -XX:+AlwaysIncrementalInline
46 * -XX:+EnableValhalla -XX:+ValueTypePassFieldsAsArgs -XX:+ValueTypeReturnedAsFields -XX:+ValueArrayFlatten
47 * -XX:ValueFieldMaxFlatSize=-1 -XX:ValueArrayElemMaxFlatSize=-1 -XX:ValueArrayElemMaxFlatOops=-1
48 * compiler.valhalla.valuetypes.TestLWorld
49 * @run main/othervm/timeout=120 -Xbootclasspath/a:. -ea -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockDiagnosticVMOptions
50 * -XX:+UnlockExperimentalVMOptions -XX:+WhiteBoxAPI -XX:-UseCompressedOops -XX:-UseOptoBiasInlining
51 * -XX:+EnableValhalla -XX:-ValueTypePassFieldsAsArgs -XX:-ValueTypeReturnedAsFields -XX:+ValueArrayFlatten
52 * -XX:ValueFieldMaxFlatSize=-1 -XX:ValueArrayElemMaxFlatSize=-1 -XX:ValueArrayElemMaxFlatOops=-1
53 * compiler.valhalla.valuetypes.TestLWorld
54 * @run main/othervm/timeout=120 -Xbootclasspath/a:. -ea -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockDiagnosticVMOptions
55 * -XX:+UnlockExperimentalVMOptions -XX:+WhiteBoxAPI -XX:-UseCompressedOops -XX:-UseBiasedLocking
56 * -XX:+EnableValhalla -XX:+ValueTypePassFieldsAsArgs -XX:+ValueTypeReturnedAsFields -XX:-ValueArrayFlatten
57 * -XX:ValueFieldMaxFlatSize=0 -XX:ValueArrayElemMaxFlatSize=0 -XX:ValueArrayElemMaxFlatOops=0
58 * -DVerifyIR=false compiler.valhalla.valuetypes.TestLWorld
59 * @run main/othervm/timeout=120 -Xbootclasspath/a:. -ea -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockDiagnosticVMOptions
60 * -XX:+UnlockExperimentalVMOptions -XX:+WhiteBoxAPI -XX:+AlwaysIncrementalInline -XX:-UseBiasedLocking
61 * -XX:+EnableValhalla -XX:-ValueTypePassFieldsAsArgs -XX:-ValueTypeReturnedAsFields -XX:+ValueArrayFlatten
430 }
431
432 private static final MethodHandle getNull = MethodHandleBuilder.loadCode(MethodHandles.lookup(),
433 "getNull",
434 MethodType.methodType(MyValue1.class),
435 CODE -> {
436 CODE.
437 aconst_null().
438 areturn();
439 }
440 );
441
442 @Test
443 public void test13() throws Throwable {
444 try {
445 valueField1 = (MyValue1)getNull.invoke();
446 throw new RuntimeException("NullPointerException expected");
447 } catch (NullPointerException e) {
448 // Expected
449 }
450
451 try {
452 valueField1 = (MyValue1)GetNullAsm.invoke();
453 throw new RuntimeException("NullPointerException expected");
454 } catch (NullPointerException e) {
455 // Expected
456 }
457
458 nullField = (MyValue1)getNull.invoke(); // Should not throw
459 nullField = (MyValue1)GetNullAsm.invoke(); // Should not throw
460 }
461
462 @DontCompile
463 public void test13_verifier(boolean warmup) throws Throwable {
464 test13();
465 }
466
467 // null constant
468 private static final MethodHandle setNull = MethodHandleBuilder.loadCode(MethodHandles.lookup(),
469 "setNull",
470 MethodType.methodType(void.class, TestLWorld.class),
471 CODE -> {
472 CODE.
473 aload_0().
474 aconst_null().
475 putfield(TestLWorld.class, "valueField1", "Lcompiler/valhalla/valuetypes/MyValue1;").
476 return_();
477 }
478 );
479
2082 public void test76_verifier(boolean warmup) {
2083 test76(testValue1);
2084 }
2085
2086 // Test synchronization without any instructions in the synchronized block
2087 @Test()
2088 public void test77(Object o) {
2089 synchronized (o) { }
2090 }
2091
2092 @DontCompile
2093 public void test77_verifier(boolean warmup) {
2094 try {
2095 test77(testValue1);
2096 } catch (IllegalMonitorStateException ex) {
2097 // Expected
2098 return;
2099 }
2100 throw new RuntimeException("test77 failed: no exception thrown");
2101 }
2102
2103 // Test the null check of VT return values in callee.
2104 @Test()
2105 @Warmup(1)
2106 public void test78() {
2107 int n = RarelyUsedValueUser.doit();
2108 if (n != 1234) {
2109 throw new RuntimeException("Should be 1234 but got " + n);
2110 }
2111 }
2112
2113 @DontCompile
2114 public void test78_verifier(boolean warmup) {
2115 if (warmup) {
2116 // Invoke RarelyUsedValueUserAsm.invoke() before RarelyUsedValue
2117 // has been loaded. This means Method::check_returning_vt() cannot
2118 // decide whether RarelyUsedValueUserAsm.legacy_areturn_null()
2119 // is returning a VT or not.
2120 RarelyUsedValueUserAsm.legacy_areturn_null();
2121
2122 // Make sure all constants RarelyUsedValueUser.doit in are resolved
2123 // so we won't get uncommon traps.
2124 RarelyUsedValueUser.warmup();
2125 } else {
2126 test78();
2127 }
2128 }
2129 }
2130
2131 // Don't use this class in any test cases except for TestLWorld.test78. We want to make sure this
2132 // class is NOT loaded during other test cases.
2133 final __ByValue class RarelyUsedValue {
2134 public final int v;
2135 RarelyUsedValue () {
2136 v = 0;
2137 }
2138 public static RarelyUsedValue makeRarelyUsedValue(int v) {
2139 RarelyUsedValue p = __MakeDefault RarelyUsedValue();
2140 p = __WithField(p.v, v);
2141 return p;
2142 }
2143 }
2144
2145 class RarelyUsedValueUser {
2146 static {
2147 TestLWorld.setup(RarelyUsedValueUser.class);
2148 TestLWorld.setup(RarelyUsedValueUserAsm.class);
2149 }
2150
2151 @DontCompile
2152 static void warmup() {
2153 doit();
2154 }
2155
2156 @ForceInline
2157 static int doit() {
2158 try {
2159 RarelyUsedValue x = RarelyUsedValueUserAsm.legacy_areturn_null();
2160 return x.v;
2161 } catch (Throwable t) {
2162 return 1234;
2163 }
2164 }
2165 }
|