< prev index next >
test/hotspot/jtreg/compiler/valhalla/valuetypes/TestLWorld.java
Print this page
@@ -36,10 +36,11 @@
* @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 TestLWorld_mismatched
* @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:+EnableValhalla
* compiler.valhalla.valuetypes.ValueTypeTest
@@ -58,11 +59,12 @@
return null;
}
public static void main(String[] args) throws Throwable {
TestLWorld test = new TestLWorld();
- test.run(args, MyValue1.class, MyValue2.class, MyValue2Inline.class, MyValue3.class, MyValue3Inline.class, Test65Value.class);
+ test.run(args, MyValue1.class, MyValue2.class, MyValue2Inline.class, MyValue3.class,
+ MyValue3Inline.class, Test65Value.class, TestLWorld_mismatched.class);
}
// Helper methods
private static final MyValue1 testValue1 = MyValue1.createWithFieldsInline(rI, rL);
@@ -2231,6 +2233,41 @@
@DontCompile
public void test86_verifier(boolean warmup) {
int result = test86();
Asserts.assertEquals(result, 0);
}
+
+ @DontInline
+ MyValue1 get_nullField() {
+ return nullField;
+ }
+
+ // A callees that returns a VT performs null check (and deoptimizes caller) before returning.
+ @Test(match = {"CallStaticJava.*TestLWorld::get_nullField compiler/valhalla/valuetypes/MyValue1:NotNull"}, matchCount = {2})
+ public void test87() {
+ try {
+ valueField1 = get_nullField();
+ throw new RuntimeException("NullPointerException expected");
+ } catch (NullPointerException e) {
+ // Expected
+ }
+
+ nullField = get_nullField(); // should not throw
+ }
+
+ @DontCompile
+ public void test87_verifier(boolean warmup) {
+ test87();
+ }
+
+ // A callee that's not aware of VT may return a null to the caller. An
+ // explicit null check is needed in compiled code.
+ @Test(failOn = "CallStaticJava.*TestLWorld_mismatched::test88_callee compiler/valhalla/valuetypes/MyValue1:NotNull")
+ public void test88() {
+ TestLWorld_mismatched.test88();
+ }
+
+ @DontCompile
+ public void test88_verifier(boolean warmup) {
+ test88();
+ }
}
< prev index next >