test/compiler/valhalla/valuetypes/ValueTypeTestBench.java
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File valhalla-experimental Cdiff test/compiler/valhalla/valuetypes/ValueTypeTestBench.java

test/compiler/valhalla/valuetypes/ValueTypeTestBench.java

Print this page

        

*** 49,65 **** --- 49,67 ---- import sun.hotspot.WhiteBox; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Repeatable; + import java.lang.invoke.*; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; import java.util.Hashtable; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; + import jdk.experimental.value.*; // Test value types __ByValue final class MyValue1 { static int s; static final long sf = ValueTypeTestBench.rL;
*** 79,94 **** this.c = c; } @DontInline public static MyValue1 createDontInline(int x, long y) { ! return __Make MyValue1(x, y, MyValue2.createInline(x, x < y), MyValue2.createInline(x, x > y), ValueTypeTestBench.rI); } @ForceInline public static MyValue1 createInline(int x, long y) { ! return __Make MyValue1(x, y, MyValue2.createInline(x, x < y), MyValue2.createInline(x, x > y), ValueTypeTestBench.rI); } @ForceInline public long hash() { return s + sf + x + y + c + v1.hash() + v2.hash() + v3.hash(); --- 81,96 ---- this.c = c; } @DontInline public static MyValue1 createDontInline(int x, long y) { ! return __Make MyValue1(x, y, MyValue2.createInline(x, true), MyValue2.createInline(x, false), ValueTypeTestBench.rI); } @ForceInline public static MyValue1 createInline(int x, long y) { ! return __Make MyValue1(x, y, MyValue2.createInline(x, true), MyValue2.createInline(x, false), ValueTypeTestBench.rI); } @ForceInline public long hash() { return s + sf + x + y + c + v1.hash() + v2.hash() + v3.hash();
*** 137,146 **** --- 139,156 ---- public ValueTypeTestBench() { val3 = MyValue1.createInline(rI, rL); } + // MethodHandles and value-capable class instance needed for testing vbox/vunbox + private static final MethodHandle vccUnboxLoadLongMH = generateVCCUnboxLoadLongMH(); + private static final MethodHandle vccUnboxLoadIntMH = generateVCCUnboxLoadIntMH(); + private static final MethodHandle vccUnboxBoxMH = generateVCCUnboxBoxMH(); + private static final MethodHandle vccUnboxBoxLoadIntMH = generateVCCUnboxBoxLoadIntMH(); + + private static final ValueCapableClass1 vcc = ValueCapableClass1.create(15L, 31, (short)63, (short)127); + // ========== Helper methods ========== public long hash() { return hash(rI, rL); }
*** 774,794 **** result = test36(v, true, rL); Asserts.assertEQ(result, v.hashInterpreted() + rL); } } // ========== Test infrastructure ========== private static final WhiteBox WHITE_BOX = WhiteBox.getWhiteBox(); private static final int ValueTypePassFieldsAsArgsOn = 0x1; private static final int ValueTypePassFieldsAsArgsOff = 0x2; static final int AllFlags = ValueTypePassFieldsAsArgsOn | ValueTypePassFieldsAsArgsOff; private static final boolean ValueTypePassFieldsAsArgs = (Boolean)WHITE_BOX.getVMFlag("ValueTypePassFieldsAsArgs"); private static final int COMP_LEVEL_ANY = -1; private static final int COMP_LEVEL_FULL_OPTIMIZATION = 4; private static final Hashtable<String, Method> tests = new Hashtable<String, Method>(); ! private static final int WARMUP = 10; private static boolean USE_COMPILER = WHITE_BOX.getBooleanVMFlag("UseCompiler"); private static boolean PRINT_IDEAL = WHITE_BOX.getBooleanVMFlag("PrintIdeal"); // TODO use Platform.isComp() after merge with JDK 9 private static boolean XCOMP = System.getProperty("java.vm.info").startsWith("compiled "); --- 784,932 ---- result = test36(v, true, rL); Asserts.assertEQ(result, v.hashInterpreted() + rL); } } + // Test vbox and vunbox + @Test + public long test37() throws Throwable { + return (long)vccUnboxLoadLongMH.invokeExact(vcc); + } + + @DontCompile + public void test37_verifier(boolean warmup) { + try { + long result = test37(); + Asserts.assertEQ(vcc.t, result, "Field t of input and result must be equal."); + } catch (Throwable t) { + throw new RuntimeException("test 37 failed", t); + } + } + + // Generate a MethodHandle that obtains field t of the + // derived value type + private static MethodHandle generateVCCUnboxLoadLongMH() { + return MethodHandleBuilder.loadCode(MethodHandles.lookup(), + "vccUnboxLoadLong", + MethodType.methodType(long.class, ValueCapableClass1.class), + CODE -> { + CODE. + aload_0(). + vunbox(ValueType.forClass(ValueCapableClass1.class).valueClass()). + vgetfield(ValueType.forClass(ValueCapableClass1.class).valueClass(), "t", "J"). + lreturn(); + } + ); + } + + + @Test + public int test38() throws Throwable { + return (int)vccUnboxLoadIntMH.invokeExact(vcc); + } + + @DontCompile + public void test38_verifier(boolean warmup) { + try { + int result = test38(); + Asserts.assertEQ(vcc.x, result, "Field x of input and result must be equal."); + } catch (Throwable t) { + throw new RuntimeException("test 38 failed", t); + } + } + + // Generate a MethodHandle that obtains field x of the + // derived value type + private static MethodHandle generateVCCUnboxLoadIntMH() { + return MethodHandleBuilder.loadCode(MethodHandles.lookup(), + "vccUnboxLoadInt", + MethodType.methodType(int.class, ValueCapableClass1.class), + CODE -> { + CODE. + aload_0(). + vunbox(ValueType.forClass(ValueCapableClass1.class).valueClass()). + vgetfield(ValueType.forClass(ValueCapableClass1.class).valueClass(), "x", "I"). + ireturn(); + } + ); + } + + @Test + public ValueCapableClass1 test39() throws Throwable { + return (ValueCapableClass1)vccUnboxBoxMH.invokeExact(vcc); + } + + @DontCompile + public void test39_verifier(boolean warmup) { + try { + ValueCapableClass1 result = test39(); + Asserts.assertEQ(vcc.value(), result.value(), "Value of VCC and returned VCC must be equal"); + } catch (Throwable t) { + throw new RuntimeException("test 39 failed", t); + } + } + + // Generate a MethodHandle that takes a value-capable class, + // unboxes it, then boxes it again and returns it. + private static MethodHandle generateVCCUnboxBoxMH() { + return MethodHandleBuilder.loadCode(MethodHandles.lookup(), + "vccUnboxBox", + MethodType.methodType(ValueCapableClass1.class, ValueCapableClass1.class), + CODE -> { + CODE. + aload_0(). + vunbox(ValueType.forClass(ValueCapableClass1.class).valueClass()). + vbox(ValueCapableClass1.class). + areturn(); + } + ); + } + + @Test + public int test40() throws Throwable { + return (int)vccUnboxBoxLoadIntMH.invokeExact(vcc); + } + + @DontCompile + public void test40_verifier(boolean warmup) { + try { + int result = test40(); + Asserts.assertEQ(vcc.x, result, "Field x of VCC and result must be equal"); + } catch (Throwable t) { + throw new RuntimeException("Test failed in the interpeter", t); + } + } + + // Generate a MethodHandle that takes a value-capable class, + // unboxes it, boxes it, reads a field from it, and returns the + // field. + private static MethodHandle generateVCCUnboxBoxLoadIntMH() { + return MethodHandleBuilder.loadCode(MethodHandles.lookup(), + "vccUnboxBoxLoadInt", + MethodType.methodType(int.class, ValueCapableClass1.class), + CODE -> { + CODE. + aload_0(). + vunbox(ValueType.forClass(ValueCapableClass1.class).valueClass()). + vbox(ValueCapableClass1.class). + getfield(ValueCapableClass1.class, "x", "I"). + ireturn(); + } + ); + } + // ========== Test infrastructure ========== private static final WhiteBox WHITE_BOX = WhiteBox.getWhiteBox(); private static final int ValueTypePassFieldsAsArgsOn = 0x1; private static final int ValueTypePassFieldsAsArgsOff = 0x2; static final int AllFlags = ValueTypePassFieldsAsArgsOn | ValueTypePassFieldsAsArgsOff; private static final boolean ValueTypePassFieldsAsArgs = (Boolean)WHITE_BOX.getVMFlag("ValueTypePassFieldsAsArgs"); private static final int COMP_LEVEL_ANY = -1; private static final int COMP_LEVEL_FULL_OPTIMIZATION = 4; private static final Hashtable<String, Method> tests = new Hashtable<String, Method>(); ! private static final int WARMUP = 250; private static boolean USE_COMPILER = WHITE_BOX.getBooleanVMFlag("UseCompiler"); private static boolean PRINT_IDEAL = WHITE_BOX.getBooleanVMFlag("PrintIdeal"); // TODO use Platform.isComp() after merge with JDK 9 private static boolean XCOMP = System.getProperty("java.vm.info").startsWith("compiled ");
test/compiler/valhalla/valuetypes/ValueTypeTestBench.java
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File