--- old/src/cpu/x86/vm/macroAssembler_x86.cpp 2017-06-21 13:07:29.658590492 +0200 +++ new/src/cpu/x86/vm/macroAssembler_x86.cpp 2017-06-21 13:07:29.574590488 +0200 @@ -6016,7 +6016,11 @@ } void MacroAssembler::verify_oop(Register reg, const char* s) { - if (!VerifyOops) return; + if (!VerifyOops || VerifyAdapterSharing) { + // Below address of the code string confuses VerifyAdapterSharing + // because it may differ between otherwise equivalent adapters. + return; + } // Pass register number to verify_oop_subroutine const char* b = NULL; @@ -6106,7 +6110,11 @@ void MacroAssembler::verify_oop_addr(Address addr, const char* s) { - if (!VerifyOops) return; + if (!VerifyOops || VerifyAdapterSharing) { + // Below address of the code string confuses VerifyAdapterSharing + // because it may differ between otherwise equivalent adapters. + return; + } // Address adjust(addr.base(), addr.index(), addr.scale(), addr.disp() + BytesPerWord); // Pass register number to verify_oop_subroutine --- old/src/share/vm/code/compiledMethod.cpp 2017-06-21 13:07:30.042590508 +0200 +++ new/src/share/vm/code/compiledMethod.cpp 2017-06-21 13:07:29.954590504 +0200 @@ -315,11 +315,10 @@ // which contains the types of all (oop) fields of the value type. if (ValueTypePassFieldsAsArgs) { // Check if receiver or one of the arguments is a value type - bool has_value_receiver = (callee != NULL && callee->method_holder()->is_value()); + bool has_value_receiver = (has_receiver && callee != NULL && callee->method_holder()->is_value()); bool has_value_argument = has_value_receiver; - const int len = signature->utf8_length(); - for (int i = 0; i < len && !has_value_argument; ++i) { - if (signature->byte_at(i) == 'Q') { + for (SignatureStream ss(signature); !has_value_argument && !ss.at_return_type(); ss.next()) { + if (ss.type() == T_VALUETYPE) { has_value_argument = true; } } --- old/src/share/vm/runtime/globals.hpp 2017-06-21 13:07:30.330590520 +0200 +++ new/src/share/vm/runtime/globals.hpp 2017-06-21 13:07:30.246590517 +0200 @@ -4090,9 +4090,6 @@ \ develop_pd(bool, ValueTypeReturnedAsFields, \ "return fields instead of a value type reference") \ - \ - develop(bool, FullGCALotWithValueTypes, false, \ - "Force full GCs to stress test handling of value types") \ /* --- old/src/share/vm/runtime/sharedRuntime.cpp 2017-06-21 13:07:30.662590534 +0200 +++ new/src/share/vm/runtime/sharedRuntime.cpp 2017-06-21 13:07:30.582590531 +0200 @@ -1374,10 +1374,6 @@ if (ValueTypePassFieldsAsArgs && callee_method->method_holder()->is_value()) { // If the receiver is a value type that is passed as fields, no oop is available receiver_klass = callee_method->method_holder(); - if (FullGCALotWithValueTypes) { - // Trigger a full GC to verify that the GC knows about the contents of oop fields - Universe::heap()->collect(GCCause::_full_gc_alot); - } } else { assert(receiver.not_null() || invoke_code == Bytecodes::_invokehandle, "sanity check"); receiver_klass = invoke_code == Bytecodes::_invokehandle ? NULL : receiver->klass(); @@ -3048,6 +3044,7 @@ case 'S': sig_bt[cnt++] = T_SHORT; break; case 'Z': sig_bt[cnt++] = T_BOOLEAN; break; case 'V': sig_bt[cnt++] = T_VOID; break; + case 'Q': case 'L': // Oop while (*s++ != ';'); // Skip signature sig_bt[cnt++] = T_OBJECT; @@ -3057,7 +3054,7 @@ while (*s >= '0' && *s <= '9') s++; } while (*s++ == '['); // Nested arrays? // Skip element type - if (s[-1] == 'L') + if (s[-1] == 'L' || s[-1] == 'Q') while (*s++ != ';'); // Skip signature sig_bt[cnt++] = T_ARRAY; break; --- old/test/compiler/valhalla/valuetypes/ValueTypeTestBench.java 2017-06-21 13:07:30.974590547 +0200 +++ new/test/compiler/valhalla/valuetypes/ValueTypeTestBench.java 2017-06-21 13:07:30.886590544 +0200 @@ -32,12 +32,12 @@ * @run main ClassFileInstaller sun.hotspot.WhiteBox * @run main ClassFileInstaller jdk.test.lib.Platform * @run main/othervm -Xbootclasspath/a:. -ea -noverify -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockDiagnosticVMOptions - * -XX:+UnlockExperimentalVMOptions -XX:+WhiteBoxAPI -XX:-TieredCompilation -XX:+VerifyAdapterSharing + * -XX:+UnlockExperimentalVMOptions -XX:+WhiteBoxAPI -XX:-TieredCompilation -XX:+VerifyAdapterSharing -XX:+VerifyStack * -XX:+EnableValhalla -XX:+EnableMVT -XX:+ValueTypePassFieldsAsArgs -XX:+ValueTypeReturnedAsFields -XX:+ValueArrayFlatten - * -XX:ValueArrayElemMaxFlatSize=-1 -XX:ValueArrayElemMaxFlatOops=-1 -XX:+FullGCALotWithValueTypes + * -XX:ValueArrayElemMaxFlatSize=-1 -XX:ValueArrayElemMaxFlatOops=-1 * compiler.valhalla.valuetypes.ValueTypeTestBench * @run main/othervm -Xbootclasspath/a:. -ea -noverify -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockDiagnosticVMOptions - * -XX:+UnlockExperimentalVMOptions -XX:+WhiteBoxAPI -XX:-TieredCompilation + * -XX:+UnlockExperimentalVMOptions -XX:+WhiteBoxAPI -XX:-TieredCompilation -XX:+VerifyStack * -XX:+EnableValhalla -XX:+EnableMVT -XX:-ValueTypePassFieldsAsArgs -XX:-ValueTypeReturnedAsFields -XX:-ValueArrayFlatten * compiler.valhalla.valuetypes.ValueTypeTestBench * @run main/othervm -Xbootclasspath/a:. -ea -noverify -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockDiagnosticVMOptions @@ -2584,6 +2584,8 @@ "-XX:CompileCommand=quiet", "-XX:CompileCommand=compileonly,compiler.valhalla.valuetypes.ValueTypeTestBench::*", "-XX:CompileCommand=compileonly,compiler.valhalla.valuetypes.MyValue1::*", "-XX:CompileCommand=compileonly,compiler.valhalla.valuetypes.MyValue2::*", + "-XX:CompileCommand=compileonly,compiler.valhalla.valuetypes.MyValue3::*", + "-XX:CompileCommand=compileonly,compiler.valhalla.valuetypes.MyValue4::*", "-XX:CompileCommand=compileonly,java.lang.Object::", "-XX:CompileCommand=inline,java.lang.__Value::hashCode", "-XX:CompileCommand=compileonly,java.lang.invoke.*::*");