< prev index next >
test/hotspot/jtreg/compiler/valhalla/valuetypes/TestLWorld.java
Print this page
*** 36,45 ****
--- 36,46 ----
* @summary Test value types in LWorld.
* @modules java.base/jdk.experimental.bytecode
* java.base/jdk.experimental.value
* @library /testlibrary /test/lib /compiler/whitebox /
* @requires os.simpleArch == "x64"
+ * @build GetNullAsm RarelyUsedValueUserAsm
* @compile -XDenableValueTypes -XDallowFlattenabilityModifiers TestLWorld.java
* @run driver ClassFileInstaller sun.hotspot.WhiteBox jdk.test.lib.Platform
* @run main/othervm/timeout=120 -Xbootclasspath/a:. -ea -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockDiagnosticVMOptions
* -XX:+UnlockExperimentalVMOptions -XX:+WhiteBoxAPI -XX:+AlwaysIncrementalInline
* -XX:+EnableValhalla -XX:+ValueTypePassFieldsAsArgs -XX:+ValueTypeReturnedAsFields -XX:+ValueArrayFlatten
*** 444,454 ****
--- 445,464 ----
valueField1 = (MyValue1)getNull.invoke();
throw new RuntimeException("NullPointerException expected");
} catch (NullPointerException e) {
// Expected
}
+
+ try {
+ valueField1 = (MyValue1)GetNullAsm.invoke();
+ throw new RuntimeException("NullPointerException expected");
+ } catch (NullPointerException e) {
+ // Expected
+ }
+
nullField = (MyValue1)getNull.invoke(); // Should not throw
+ nullField = (MyValue1)GetNullAsm.invoke(); // Should not throw
}
@DontCompile
public void test13_verifier(boolean warmup) throws Throwable {
test13();
*** 2087,2092 ****
--- 2097,2165 ----
// Expected
return;
}
throw new RuntimeException("test77 failed: no exception thrown");
}
+
+ // Test the null check of VT return values in callee.
+ @Test()
+ @Warmup(1)
+ public void test78() {
+ int n = RarelyUsedValueUser.doit();
+ if (n != 1234) {
+ throw new RuntimeException("Should be 1234 but got " + n);
+ }
+ }
+
+ @DontCompile
+ public void test78_verifier(boolean warmup) {
+ if (warmup) {
+ // Invoke RarelyUsedValueUserAsm.invoke() before RarelyUsedValue
+ // has been loaded. This means Method::check_returning_vt() cannot
+ // decide whether RarelyUsedValueUserAsm.legacy_areturn_null()
+ // is returning a VT or not.
+ RarelyUsedValueUserAsm.legacy_areturn_null();
+
+ // Make sure all constants RarelyUsedValueUser.doit in are resolved
+ // so we won't get uncommon traps.
+ RarelyUsedValueUser.warmup();
+ } else {
+ test78();
+ }
+ }
+ }
+
+ // Don't use this class in any test cases except for TestLWorld.test78. We want to make sure this
+ // class is NOT loaded during other test cases.
+ final __ByValue class RarelyUsedValue {
+ public final int v;
+ RarelyUsedValue () {
+ v = 0;
+ }
+ public static RarelyUsedValue makeRarelyUsedValue(int v) {
+ RarelyUsedValue p = __MakeDefault RarelyUsedValue();
+ p = __WithField(p.v, v);
+ return p;
+ }
+ }
+
+ class RarelyUsedValueUser {
+ static {
+ TestLWorld.setup(RarelyUsedValueUser.class);
+ TestLWorld.setup(RarelyUsedValueUserAsm.class);
+ }
+
+ @DontCompile
+ static void warmup() {
+ doit();
+ }
+
+ @ForceInline
+ static int doit() {
+ try {
+ RarelyUsedValue x = RarelyUsedValueUserAsm.legacy_areturn_null();
+ return x.v;
+ } catch (Throwable t) {
+ return 1234;
+ }
+ }
}
\ No newline at end of file
< prev index next >