< prev index next >

test/hotspot/jtreg/compiler/valhalla/valuetypes/TestLWorld.java

Print this page


  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 }
< prev index next >