Mercurial > hg > icedtea8-forest > hotspot
changeset 9891:839becd2cb2f icedtea-3.8.0pre01
Merge jdk8u162-b12
line wrap: on
line diff
--- a/.hgtags Wed Mar 07 05:37:59 2018 +0000 +++ b/.hgtags Thu Mar 15 03:52:15 2018 +0000 @@ -1164,3 +1164,16 @@ 074a569c30e47bd860652f31d52418c8fa878f2f icedtea-3.7.0 074a569c30e47bd860652f31d52418c8fa878f2f icedtea-3.8.0pre00 8bb8d4e46d6736c6feee35453ade3ed28392835f icedtea-4-branchpoint +210f7ef62595c608d69fc8bf442a4f5b0bceddb5 jdk8u161-b12 +7b96cfeed22242bb68a387d1680e602e37e48050 jdk8u162-b00 +92693f9dd704467ddd5fbae5a5908c1713a08ee0 jdk8u162-b01 +741b7a6743c0e02eae7e4a864f378fa1df0da112 jdk8u162-b02 +e0c000e8eb7588501637873c6dcd255306c9c5cc jdk8u162-b03 +18366fa39fe0839291b672ce4f8f12605d88b0d0 jdk8u162-b04 +e34428c12886692f9d562263a10bc72c8d222613 jdk8u162-b05 +cd7f8ee4553d0f884ddc150ceefcb5b48b12ca21 jdk8u162-b06 +7be95092ed8b37b7b55ae341c8d62d377d7310df jdk8u162-b07 +080cfab193208aeb198f5b98841782fbf51ab851 jdk8u162-b08 +02f9409295f9ea7350cc2d25eeabf3c2b13b1df6 jdk8u162-b09 +c3618e1cdefdda6c262f082791bfd988e0e9d9c9 jdk8u162-b10 +39e2895b795aded8b584626fb019d35f12e9d1e7 jdk8u162-b11
--- a/agent/src/share/classes/sun/jvm/hotspot/tools/ClassLoaderStats.java Wed Mar 07 05:37:59 2018 +0000 +++ b/agent/src/share/classes/sun/jvm/hotspot/tools/ClassLoaderStats.java Thu Mar 15 03:52:15 2018 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -103,11 +103,12 @@ } SystemDictionary dict = VM.getVM().getSystemDictionary(); - dict.classesDo(new SystemDictionary.ClassAndLoaderVisitor() { - public void visit(Klass k, Oop loader) { + dict.classesDo(new SystemDictionary.ClassVisitor() { + public void visit(Klass k) { if (! (k instanceof InstanceKlass)) { return; } + Oop loader = ((InstanceKlass) k).getClassLoader(); LoaderData ld = (loader != null) ? (LoaderData)loaderMap.get(loader) : bootstrapLoaderData; if (ld != null) {
--- a/agent/src/share/classes/sun/jvm/hotspot/utilities/soql/sa.js Wed Mar 07 05:37:59 2018 +0000 +++ b/agent/src/share/classes/sun/jvm/hotspot/utilities/soql/sa.js Thu Mar 15 03:52:15 2018 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -804,6 +804,16 @@ // VM type to SA class map var vmType2Class = new Object(); +// C2 only classes +try{ + vmType2Class["ExceptionBlob"] = sapkg.code.ExceptionBlob; + vmType2Class["UncommonTrapBlob"] = sapkg.code.UncommonTrapBlob; +} catch(e) { + // Ignore exception. C2 specific objects might be not + // available in client VM +} + + // This is *not* exhaustive. Add more if needed. // code blobs vmType2Class["BufferBlob"] = sapkg.code.BufferBlob; @@ -812,10 +822,8 @@ vmType2Class["SafepointBlob"] = sapkg.code.SafepointBlob; vmType2Class["C2IAdapter"] = sapkg.code.C2IAdapter; vmType2Class["DeoptimizationBlob"] = sapkg.code.DeoptimizationBlob; -vmType2Class["ExceptionBlob"] = sapkg.code.ExceptionBlob; vmType2Class["I2CAdapter"] = sapkg.code.I2CAdapter; vmType2Class["OSRAdapter"] = sapkg.code.OSRAdapter; -vmType2Class["UncommonTrapBlob"] = sapkg.code.UncommonTrapBlob; vmType2Class["PCDesc"] = sapkg.code.PCDesc; // interpreter
--- a/src/os/windows/vm/version.rc Wed Mar 07 05:37:59 2018 +0000 +++ b/src/os/windows/vm/version.rc Thu Mar 15 03:52:15 2018 +0000 @@ -36,7 +36,7 @@ // VS_VERSION_INFO VERSIONINFO - FILEVERSION HS_VER + FILEVERSION JDK_VER PRODUCTVERSION JDK_VER FILEFLAGSMASK 0x3fL #ifdef _DEBUG @@ -56,7 +56,7 @@ BEGIN VALUE "CompanyName", XSTR(HS_COMPANY) "\0" VALUE "FileDescription", XSTR(HS_FILEDESC) "\0" - VALUE "FileVersion", XSTR(HS_DOTVER) "\0" + VALUE "FileVersion", XSTR(JDK_DOTVER) "\0" VALUE "Full Version", XSTR(HS_BUILD_ID) "\0" VALUE "InternalName", XSTR(HS_INTERNAL_NAME) "\0" VALUE "LegalCopyright", XSTR(HS_COPYRIGHT) "\0"
--- a/src/os_cpu/solaris_sparc/vm/vm_version_solaris_sparc.cpp Wed Mar 07 05:37:59 2018 +0000 +++ b/src/os_cpu/solaris_sparc/vm/vm_version_solaris_sparc.cpp Thu Mar 15 03:52:15 2018 +0000 @@ -442,7 +442,7 @@ // is available to us as well Sysinfo cpu_info(SI_CPUBRAND); bool use_solaris_12_api = cpu_info.valid(); - const char* impl; + const char* impl = "unknown"; int impl_m = 0; if (use_solaris_12_api) { impl = cpu_info.value(); @@ -477,7 +477,7 @@ kstat_close(kc); } } - assert(impl_m != 0, err_msg("Unknown CPU implementation %s", impl)); + assert(impl_m != 0, err_msg("Unrecognized CPU implementation %s", impl)); features |= impl_m; bool is_sun4v = (features & sun4v_m) != 0;
--- a/src/share/vm/c1/c1_GraphBuilder.cpp Wed Mar 07 05:37:59 2018 +0000 +++ b/src/share/vm/c1/c1_GraphBuilder.cpp Thu Mar 15 03:52:15 2018 +0000 @@ -1530,7 +1530,7 @@ ciMethod* caller = state()->scope()->method(); ciMethodData* md = caller->method_data_or_null(); ciProfileData* data = md->bci_to_data(invoke_bci); - if (data->is_CallTypeData() || data->is_VirtualCallTypeData()) { + if (data != NULL && (data->is_CallTypeData() || data->is_VirtualCallTypeData())) { bool has_return = data->is_CallTypeData() ? ((ciCallTypeData*)data)->has_return() : ((ciVirtualCallTypeData*)data)->has_return(); // May not be true in case of an inlined call through a method handle intrinsic. if (has_return) { @@ -1747,7 +1747,7 @@ start = has_receiver ? 1 : 0; if (profile_arguments()) { ciProfileData* data = method()->method_data()->bci_to_data(bci()); - if (data->is_CallTypeData() || data->is_VirtualCallTypeData()) { + if (data != NULL && (data->is_CallTypeData() || data->is_VirtualCallTypeData())) { n = data->is_CallTypeData() ? data->as_CallTypeData()->number_of_arguments() : data->as_VirtualCallTypeData()->number_of_arguments(); } } @@ -3313,7 +3313,9 @@ // for osr compile, bailout if some requirements are not fulfilled if (osr_bci != -1) { BlockBegin* osr_block = blm.bci2block()->at(osr_bci); - assert(osr_block->is_set(BlockBegin::was_visited_flag),"osr entry must have been visited for osr compile"); + if (!osr_block->is_set(BlockBegin::was_visited_flag)) { + BAILOUT("osr entry must have been visited for osr compile"); + } // check if osr entry point has empty stack - we cannot handle non-empty stacks at osr entry points if (!osr_block->state()->stack_is_empty()) { @@ -4465,7 +4467,7 @@ } ciMethodData* md = m->method_data_or_null(); ciProfileData* data = md->bci_to_data(invoke_bci); - if (data->is_CallTypeData() || data->is_VirtualCallTypeData()) { + if (data != NULL && (data->is_CallTypeData() || data->is_VirtualCallTypeData())) { append(new ProfileReturnType(m , invoke_bci, callee, ret)); } }
--- a/src/share/vm/c1/c1_Instruction.hpp Wed Mar 07 05:37:59 2018 +0000 +++ b/src/share/vm/c1/c1_Instruction.hpp Thu Mar 15 03:52:15 2018 +0000 @@ -1568,7 +1568,7 @@ set_needs_null_check(has_receiver); // some intrinsics can't trap, so don't force them to be pinned - if (!can_trap()) { + if (!can_trap() && !vmIntrinsics::should_be_pinned(_id)) { unpin(PinStateSplitConstructor); } }
--- a/src/share/vm/c1/c1_LIRGenerator.cpp Wed Mar 07 05:37:59 2018 +0000 +++ b/src/share/vm/c1/c1_LIRGenerator.cpp Thu Mar 15 03:52:15 2018 +0000 @@ -3185,50 +3185,52 @@ int bci = x->bci_of_invoke(); ciMethodData* md = x->method()->method_data_or_null(); ciProfileData* data = md->bci_to_data(bci); - if ((data->is_CallTypeData() && data->as_CallTypeData()->has_arguments()) || - (data->is_VirtualCallTypeData() && data->as_VirtualCallTypeData()->has_arguments())) { - ByteSize extra = data->is_CallTypeData() ? CallTypeData::args_data_offset() : VirtualCallTypeData::args_data_offset(); - int base_offset = md->byte_offset_of_slot(data, extra); - LIR_Opr mdp = LIR_OprFact::illegalOpr; - ciTypeStackSlotEntries* args = data->is_CallTypeData() ? ((ciCallTypeData*)data)->args() : ((ciVirtualCallTypeData*)data)->args(); - - Bytecodes::Code bc = x->method()->java_code_at_bci(bci); - int start = 0; - int stop = data->is_CallTypeData() ? ((ciCallTypeData*)data)->number_of_arguments() : ((ciVirtualCallTypeData*)data)->number_of_arguments(); - if (x->callee()->is_loaded() && x->callee()->is_static() && Bytecodes::has_receiver(bc)) { - // first argument is not profiled at call (method handle invoke) - assert(x->method()->raw_code_at_bci(bci) == Bytecodes::_invokehandle, "invokehandle expected"); - start = 1; + if (data != NULL) { + if ((data->is_CallTypeData() && data->as_CallTypeData()->has_arguments()) || + (data->is_VirtualCallTypeData() && data->as_VirtualCallTypeData()->has_arguments())) { + ByteSize extra = data->is_CallTypeData() ? CallTypeData::args_data_offset() : VirtualCallTypeData::args_data_offset(); + int base_offset = md->byte_offset_of_slot(data, extra); + LIR_Opr mdp = LIR_OprFact::illegalOpr; + ciTypeStackSlotEntries* args = data->is_CallTypeData() ? ((ciCallTypeData*)data)->args() : ((ciVirtualCallTypeData*)data)->args(); + + Bytecodes::Code bc = x->method()->java_code_at_bci(bci); + int start = 0; + int stop = data->is_CallTypeData() ? ((ciCallTypeData*)data)->number_of_arguments() : ((ciVirtualCallTypeData*)data)->number_of_arguments(); + if (x->callee()->is_loaded() && x->callee()->is_static() && Bytecodes::has_receiver(bc)) { + // first argument is not profiled at call (method handle invoke) + assert(x->method()->raw_code_at_bci(bci) == Bytecodes::_invokehandle, "invokehandle expected"); + start = 1; + } + ciSignature* callee_signature = x->callee()->signature(); + // method handle call to virtual method + bool has_receiver = x->callee()->is_loaded() && !x->callee()->is_static() && !Bytecodes::has_receiver(bc); + ciSignatureStream callee_signature_stream(callee_signature, has_receiver ? x->callee()->holder() : NULL); + + bool ignored_will_link; + ciSignature* signature_at_call = NULL; + x->method()->get_method_at_bci(bci, ignored_will_link, &signature_at_call); + ciSignatureStream signature_at_call_stream(signature_at_call); + + // if called through method handle invoke, some arguments may have been popped + for (int i = 0; i < stop && i+start < x->nb_profiled_args(); i++) { + int off = in_bytes(TypeEntriesAtCall::argument_type_offset(i)) - in_bytes(TypeEntriesAtCall::args_data_offset()); + ciKlass* exact = profile_type(md, base_offset, off, + args->type(i), x->profiled_arg_at(i+start), mdp, + !x->arg_needs_null_check(i+start), + signature_at_call_stream.next_klass(), callee_signature_stream.next_klass()); + if (exact != NULL) { + md->set_argument_type(bci, i, exact); + } + } + } else { +#ifdef ASSERT + Bytecodes::Code code = x->method()->raw_code_at_bci(x->bci_of_invoke()); + int n = x->nb_profiled_args(); + assert(MethodData::profile_parameters() && (MethodData::profile_arguments_jsr292_only() || + (x->inlined() && ((code == Bytecodes::_invokedynamic && n <= 1) || (code == Bytecodes::_invokehandle && n <= 2)))), + "only at JSR292 bytecodes"); +#endif } - ciSignature* callee_signature = x->callee()->signature(); - // method handle call to virtual method - bool has_receiver = x->callee()->is_loaded() && !x->callee()->is_static() && !Bytecodes::has_receiver(bc); - ciSignatureStream callee_signature_stream(callee_signature, has_receiver ? x->callee()->holder() : NULL); - - bool ignored_will_link; - ciSignature* signature_at_call = NULL; - x->method()->get_method_at_bci(bci, ignored_will_link, &signature_at_call); - ciSignatureStream signature_at_call_stream(signature_at_call); - - // if called through method handle invoke, some arguments may have been popped - for (int i = 0; i < stop && i+start < x->nb_profiled_args(); i++) { - int off = in_bytes(TypeEntriesAtCall::argument_type_offset(i)) - in_bytes(TypeEntriesAtCall::args_data_offset()); - ciKlass* exact = profile_type(md, base_offset, off, - args->type(i), x->profiled_arg_at(i+start), mdp, - !x->arg_needs_null_check(i+start), - signature_at_call_stream.next_klass(), callee_signature_stream.next_klass()); - if (exact != NULL) { - md->set_argument_type(bci, i, exact); - } - } - } else { -#ifdef ASSERT - Bytecodes::Code code = x->method()->raw_code_at_bci(x->bci_of_invoke()); - int n = x->nb_profiled_args(); - assert(MethodData::profile_parameters() && (MethodData::profile_arguments_jsr292_only() || - (x->inlined() && ((code == Bytecodes::_invokedynamic && n <= 1) || (code == Bytecodes::_invokehandle && n <= 2)))), - "only at JSR292 bytecodes"); -#endif } } } @@ -3319,24 +3321,26 @@ int bci = x->bci_of_invoke(); ciMethodData* md = x->method()->method_data_or_null(); ciProfileData* data = md->bci_to_data(bci); - assert(data->is_CallTypeData() || data->is_VirtualCallTypeData(), "wrong profile data type"); - ciReturnTypeEntry* ret = data->is_CallTypeData() ? ((ciCallTypeData*)data)->ret() : ((ciVirtualCallTypeData*)data)->ret(); - LIR_Opr mdp = LIR_OprFact::illegalOpr; - - bool ignored_will_link; - ciSignature* signature_at_call = NULL; - x->method()->get_method_at_bci(bci, ignored_will_link, &signature_at_call); - - // The offset within the MDO of the entry to update may be too large - // to be used in load/store instructions on some platforms. So have - // profile_type() compute the address of the profile in a register. - ciKlass* exact = profile_type(md, md->byte_offset_of_slot(data, ret->type_offset()), 0, - ret->type(), x->ret(), mdp, - !x->needs_null_check(), - signature_at_call->return_type()->as_klass(), - x->callee()->signature()->return_type()->as_klass()); - if (exact != NULL) { - md->set_return_type(bci, exact); + if (data != NULL) { + assert(data->is_CallTypeData() || data->is_VirtualCallTypeData(), "wrong profile data type"); + ciReturnTypeEntry* ret = data->is_CallTypeData() ? ((ciCallTypeData*)data)->ret() : ((ciVirtualCallTypeData*)data)->ret(); + LIR_Opr mdp = LIR_OprFact::illegalOpr; + + bool ignored_will_link; + ciSignature* signature_at_call = NULL; + x->method()->get_method_at_bci(bci, ignored_will_link, &signature_at_call); + + // The offset within the MDO of the entry to update may be too large + // to be used in load/store instructions on some platforms. So have + // profile_type() compute the address of the profile in a register. + ciKlass* exact = profile_type(md, md->byte_offset_of_slot(data, ret->type_offset()), 0, + ret->type(), x->ret(), mdp, + !x->needs_null_check(), + signature_at_call->return_type()->as_klass(), + x->callee()->signature()->return_type()->as_klass()); + if (exact != NULL) { + md->set_return_type(bci, exact); + } } }
--- a/src/share/vm/ci/ciMethodData.cpp Wed Mar 07 05:37:59 2018 +0000 +++ b/src/share/vm/ci/ciMethodData.cpp Thu Mar 15 03:52:15 2018 +0000 @@ -391,11 +391,13 @@ MethodData* mdo = get_MethodData(); if (mdo != NULL) { ProfileData* data = mdo->bci_to_data(bci); - if (data->is_CallTypeData()) { - data->as_CallTypeData()->set_argument_type(i, k->get_Klass()); - } else { - assert(data->is_VirtualCallTypeData(), "no arguments!"); - data->as_VirtualCallTypeData()->set_argument_type(i, k->get_Klass()); + if (data != NULL) { + if (data->is_CallTypeData()) { + data->as_CallTypeData()->set_argument_type(i, k->get_Klass()); + } else { + assert(data->is_VirtualCallTypeData(), "no arguments!"); + data->as_VirtualCallTypeData()->set_argument_type(i, k->get_Klass()); + } } } } @@ -413,11 +415,13 @@ MethodData* mdo = get_MethodData(); if (mdo != NULL) { ProfileData* data = mdo->bci_to_data(bci); - if (data->is_CallTypeData()) { - data->as_CallTypeData()->set_return_type(k->get_Klass()); - } else { - assert(data->is_VirtualCallTypeData(), "no arguments!"); - data->as_VirtualCallTypeData()->set_return_type(k->get_Klass()); + if (data != NULL) { + if (data->is_CallTypeData()) { + data->as_CallTypeData()->set_return_type(k->get_Klass()); + } else { + assert(data->is_VirtualCallTypeData(), "no arguments!"); + data->as_VirtualCallTypeData()->set_return_type(k->get_Klass()); + } } } }
--- a/src/share/vm/classfile/vmSymbols.cpp Wed Mar 07 05:37:59 2018 +0000 +++ b/src/share/vm/classfile/vmSymbols.cpp Thu Mar 15 03:52:15 2018 +0000 @@ -324,6 +324,20 @@ return vmIntrinsics::_none; } +// Some intrinsics produce different results if they are not pinned +bool vmIntrinsics::should_be_pinned(vmIntrinsics::ID id) { + assert(id != vmIntrinsics::_none, "must be a VM intrinsic"); + switch(id) { +#ifdef TRACE_HAVE_INTRINSICS + case vmIntrinsics::_counterTime: +#endif + case vmIntrinsics::_currentTimeMillis: + case vmIntrinsics::_nanoTime: + return true; + default: + return false; + } +} #define VM_INTRINSIC_INITIALIZE(id, klass, name, sig, flags) #id "\0" static const char* vm_intrinsic_name_bodies =
--- a/src/share/vm/classfile/vmSymbols.hpp Wed Mar 07 05:37:59 2018 +0000 +++ b/src/share/vm/classfile/vmSymbols.hpp Thu Mar 15 03:52:15 2018 +0000 @@ -1301,6 +1301,8 @@ // Raw conversion: static ID for_raw_conversion(BasicType src, BasicType dest); + + static bool should_be_pinned(vmIntrinsics::ID id); }; #endif // SHARE_VM_CLASSFILE_VMSYMBOLS_HPP
--- a/src/share/vm/compiler/oopMap.cpp Wed Mar 07 05:37:59 2018 +0000 +++ b/src/share/vm/compiler/oopMap.cpp Thu Mar 15 03:52:15 2018 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -393,17 +393,16 @@ omv = oms.current(); oop* loc = fr->oopmapreg_to_location(omv.reg(),reg_map); if ( loc != NULL ) { + oop *derived_loc = loc; oop *base_loc = fr->oopmapreg_to_location(omv.content_reg(), reg_map); - oop *derived_loc = loc; - oop val = *base_loc; - if (val == (oop)NULL || Universe::is_narrow_oop_base(val)) { - // Ignore NULL oops and decoded NULL narrow oops which - // equal to Universe::narrow_oop_base when a narrow oop - // implicit null check is used in compiled code. - // The narrow_oop_base could be NULL or be the address - // of the page below heap depending on compressed oops mode. - } else + // Ignore NULL oops and decoded NULL narrow oops which + // equal to Universe::narrow_oop_base when a narrow oop + // implicit null check is used in compiled code. + // The narrow_oop_base could be NULL or be the address + // of the page below heap depending on compressed oops mode. + if (base_loc != NULL && *base_loc != (oop)NULL && !Universe::is_narrow_oop_base(*base_loc)) { derived_oop_fn(base_loc, derived_loc); + } } oms.next(); } while (!oms.is_done());
--- a/src/share/vm/interpreter/interpreterRuntime.cpp Wed Mar 07 05:37:59 2018 +0000 +++ b/src/share/vm/interpreter/interpreterRuntime.cpp Thu Mar 15 03:52:15 2018 +0000 @@ -985,6 +985,7 @@ // ProfileData is essentially a wrapper around a derived oop, so we // need to take the lock before making any ProfileData structures. ProfileData* data = h_mdo->data_at(h_mdo->dp_to_di(fr.interpreter_frame_mdp())); + guarantee(data != NULL, "profile data must be valid"); RetData* rdata = data->as_RetData(); address new_mdp = rdata->fixup_ret(return_bci, h_mdo); fr.interpreter_frame_set_mdp(new_mdp);
--- a/src/share/vm/memory/metaspace.cpp Wed Mar 07 05:37:59 2018 +0000 +++ b/src/share/vm/memory/metaspace.cpp Thu Mar 15 03:52:15 2018 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -3175,6 +3175,24 @@ CompressedClassSpaceSize = align_size_down_bounded(CompressedClassSpaceSize, _reserve_alignment); set_compressed_class_space_size(CompressedClassSpaceSize); + + // Initial virtual space size will be calculated at global_initialize() + uintx min_metaspace_sz = + VIRTUALSPACEMULTIPLIER * InitialBootClassLoaderMetaspaceSize; + if (UseCompressedClassPointers) { + if ((min_metaspace_sz + CompressedClassSpaceSize) > MaxMetaspaceSize) { + if (min_metaspace_sz >= MaxMetaspaceSize) { + vm_exit_during_initialization("MaxMetaspaceSize is too small."); + } else { + FLAG_SET_ERGO(uintx, CompressedClassSpaceSize, + MaxMetaspaceSize - min_metaspace_sz); + } + } + } else if (min_metaspace_sz >= MaxMetaspaceSize) { + FLAG_SET_ERGO(uintx, InitialBootClassLoaderMetaspaceSize, + min_metaspace_sz); + } + } void Metaspace::global_initialize() {
--- a/src/share/vm/opto/ifnode.cpp Wed Mar 07 05:37:59 2018 +0000 +++ b/src/share/vm/opto/ifnode.cpp Thu Mar 15 03:52:15 2018 +0000 @@ -234,6 +234,13 @@ predicate_proj = proj; } } + + // If all the defs of the phi are the same constant, we already have the desired end state. + // Skip the split that would create empty phi and region nodes. + if((r->req() - req_c) == 1) { + return NULL; + } + Node* predicate_c = NULL; Node* predicate_x = NULL; bool counted_loop = r->is_CountedLoop();
--- a/src/share/vm/opto/loopnode.cpp Wed Mar 07 05:37:59 2018 +0000 +++ b/src/share/vm/opto/loopnode.cpp Thu Mar 15 03:52:15 2018 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1773,6 +1773,12 @@ Node *init2 = phi2->in( LoopNode::EntryControl ); int stride_con2 = incr2->in(2)->get_int(); + // The ratio of the two strides cannot be represented as an int + // if stride_con2 is min_int and stride_con is -1. + if (stride_con2 == min_jint && stride_con == -1) { + continue; + } + // The general case here gets a little tricky. We want to find the // GCD of all possible parallel IV's and make a new IV using this // GCD for the loop. Then all possible IVs are simple multiples of
--- a/src/share/vm/opto/loopnode.hpp Wed Mar 07 05:37:59 2018 +0000 +++ b/src/share/vm/opto/loopnode.hpp Thu Mar 15 03:52:15 2018 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -257,19 +257,29 @@ Node *incr() const { Node *tmp = cmp_node(); return (tmp && tmp->req()==3) ? tmp->in(1) : NULL; } Node *limit() const { Node *tmp = cmp_node(); return (tmp && tmp->req()==3) ? tmp->in(2) : NULL; } Node *stride() const { Node *tmp = incr (); return (tmp && tmp->req()==3) ? tmp->in(2) : NULL; } - Node *phi() const { Node *tmp = incr (); return (tmp && tmp->req()==3) ? tmp->in(1) : NULL; } Node *init_trip() const { Node *tmp = phi (); return (tmp && tmp->req()==3) ? tmp->in(1) : NULL; } int stride_con() const; bool stride_is_con() const { Node *tmp = stride (); return (tmp != NULL && tmp->is_Con()); } BoolTest::mask test_trip() const { return in(TestValue)->as_Bool()->_test._test; } + PhiNode *phi() const { + Node *tmp = incr(); + if (tmp && tmp->req() == 3) { + Node* phi = tmp->in(1); + if (phi->is_Phi()) { + return phi->as_Phi(); + } + } + return NULL; + } CountedLoopNode *loopnode() const { // The CountedLoopNode that goes with this CountedLoopEndNode may // have been optimized out by the IGVN so be cautious with the // pattern matching on the graph - if (phi() == NULL) { + PhiNode* iv_phi = phi(); + if (iv_phi == NULL) { return NULL; } - Node *ln = phi()->in(0); + Node *ln = iv_phi->in(0); if (ln->is_CountedLoop() && ln->as_CountedLoop()->loopexit() == this) { return (CountedLoopNode*)ln; }
--- a/src/share/vm/opto/memnode.cpp Wed Mar 07 05:37:59 2018 +0000 +++ b/src/share/vm/opto/memnode.cpp Thu Mar 15 03:52:15 2018 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -55,6 +55,15 @@ return calculate_adr_type(adr->bottom_type(), cross_check); } +bool MemNode::check_if_adr_maybe_raw(Node* adr) { + if (adr != NULL) { + if (adr->bottom_type()->base() == Type::RawPtr || adr->bottom_type()->base() == Type::AnyPtr) { + return true; + } + } + return false; +} + #ifndef PRODUCT void MemNode::dump_spec(outputStream *st) const { if (in(Address) == NULL) return; // node is dead @@ -503,6 +512,7 @@ if (offset == Type::OffsetBot) return NULL; // cannot unalias unless there are precise offsets + const bool adr_maybe_raw = check_if_adr_maybe_raw(adr); const TypeOopPtr *addr_t = adr->bottom_type()->isa_oopptr(); intptr_t size_in_bytes = memory_size(); @@ -519,6 +529,13 @@ Node* st_base = AddPNode::Ideal_base_and_offset(st_adr, phase, st_offset); if (st_base == NULL) break; // inscrutable pointer + + // For raw accesses it's not enough to prove that constant offsets don't intersect. + // We need the bases to be the equal in order for the offset check to make sense. + if ((adr_maybe_raw || check_if_adr_maybe_raw(st_adr)) && st_base != base) { + break; + } + if (st_offset != offset && st_offset != Type::OffsetBot) { const int MAX_STORE = BytesPerLong; if (st_offset >= offset + size_in_bytes ||
--- a/src/share/vm/opto/memnode.hpp Wed Mar 07 05:37:59 2018 +0000 +++ b/src/share/vm/opto/memnode.hpp Thu Mar 15 03:52:15 2018 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -75,6 +75,8 @@ debug_only(_adr_type=at; adr_type();) } + static bool check_if_adr_maybe_raw(Node* adr); + public: // Helpers for the optimizer. Documented in memnode.cpp. static bool detect_ptr_independence(Node* p1, AllocateNode* a1,
--- a/src/share/vm/opto/parse2.cpp Wed Mar 07 05:37:59 2018 +0000 +++ b/src/share/vm/opto/parse2.cpp Thu Mar 15 03:52:15 2018 +0000 @@ -812,6 +812,9 @@ ciMethodData* methodData = method()->method_data(); if (!methodData->is_mature()) return PROB_UNKNOWN; ciProfileData* data = methodData->bci_to_data(bci()); + if (data == NULL) { + return PROB_UNKNOWN; + } if (!data->is_JumpData()) return PROB_UNKNOWN; // get taken and not taken values @@ -903,8 +906,8 @@ // of the OSR-ed method, and we want to deopt to gather more stats. // If you have ANY counts, then this loop is simply 'cold' relative // to the OSR loop. - if (data->as_BranchData()->taken() + - data->as_BranchData()->not_taken() == 0 ) { + if (data == NULL || + (data->as_BranchData()->taken() + data->as_BranchData()->not_taken() == 0)) { // This is the only way to return PROB_UNKNOWN: return PROB_UNKNOWN; }
--- a/src/share/vm/opto/phaseX.cpp Wed Mar 07 05:37:59 2018 +0000 +++ b/src/share/vm/opto/phaseX.cpp Thu Mar 15 03:52:15 2018 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1416,6 +1416,27 @@ } } +// Return counted loop Phi if as a counted loop exit condition, cmp +// compares the the induction variable with n +static PhiNode* countedloop_phi_from_cmp(CmpINode* cmp, Node* n) { + for (DUIterator_Fast imax, i = cmp->fast_outs(imax); i < imax; i++) { + Node* bol = cmp->fast_out(i); + for (DUIterator_Fast i2max, i2 = bol->fast_outs(i2max); i2 < i2max; i2++) { + Node* iff = bol->fast_out(i2); + if (iff->is_CountedLoopEnd()) { + CountedLoopEndNode* cle = iff->as_CountedLoopEnd(); + if (cle->limit() == n) { + PhiNode* phi = cle->phi(); + if (phi != NULL) { + return phi; + } + } + } + } + } + return NULL; +} + void PhaseIterGVN::add_users_to_worklist( Node *n ) { add_users_to_worklist0(n); @@ -1445,18 +1466,7 @@ Node* bol = use->raw_out(0); if (bol->outcnt() > 0) { Node* iff = bol->raw_out(0); - if (use_op == Op_CmpI && - iff->is_CountedLoopEnd()) { - CountedLoopEndNode* cle = iff->as_CountedLoopEnd(); - if (cle->limit() == n && cle->phi() != NULL) { - // If an opaque node feeds into the limit condition of a - // CountedLoop, we need to process the Phi node for the - // induction variable when the opaque node is removed: - // the range of values taken by the Phi is now known and - // so its type is also known. - _worklist.push(cle->phi()); - } - } else if (iff->outcnt() == 2) { + if (iff->outcnt() == 2) { // Look for the 'is_x2logic' pattern: "x ? : 0 : 1" and put the // phi merging either 0 or 1 onto the worklist Node* ifproj0 = iff->raw_out(0); @@ -1471,6 +1481,15 @@ } } if (use_op == Op_CmpI) { + Node* phi = countedloop_phi_from_cmp((CmpINode*)use, n); + if (phi != NULL) { + // If an opaque node feeds into the limit condition of a + // CountedLoop, we need to process the Phi node for the + // induction variable when the opaque node is removed: + // the range of values taken by the Phi is now known and + // so its type is also known. + _worklist.push(phi); + } Node* in1 = use->in(1); for (uint i = 0; i < in1->outcnt(); i++) { if (in1->raw_out(i)->Opcode() == Op_CastII) { @@ -1659,6 +1678,15 @@ } } } + // If n is used in a counted loop exit condition then the type + // of the counted loop's Phi depends on the type of n. See + // PhiNode::Value(). + if (m_op == Op_CmpI) { + PhiNode* phi = countedloop_phi_from_cmp((CmpINode*)m, n); + if (phi != NULL) { + worklist.push(phi); + } + } } } }
--- a/src/share/vm/opto/phaseX.hpp Wed Mar 07 05:37:59 2018 +0000 +++ b/src/share/vm/opto/phaseX.hpp Thu Mar 15 03:52:15 2018 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -417,7 +417,7 @@ // Phase for iteratively performing local, pessimistic GVN-style optimizations. // and ideal transformations on the graph. class PhaseIterGVN : public PhaseGVN { - private: +private: bool _delay_transform; // When true simply register the node when calling transform // instead of actually optimizing it
--- a/src/share/vm/opto/type.cpp Wed Mar 07 05:37:59 2018 +0000 +++ b/src/share/vm/opto/type.cpp Thu Mar 15 03:52:15 2018 +0000 @@ -1001,21 +1001,10 @@ //------------------------------eq--------------------------------------------- // Structural equality check for Type representations -bool TypeF::eq( const Type *t ) const { - if( g_isnan(_f) || - g_isnan(t->getf()) ) { - // One or both are NANs. If both are NANs return true, else false. - return (g_isnan(_f) && g_isnan(t->getf())); - } - if (_f == t->getf()) { - // (NaN is impossible at this point, since it is not equal even to itself) - if (_f == 0.0) { - // difference between positive and negative zero - if (jint_cast(_f) != jint_cast(t->getf())) return false; - } - return true; - } - return false; +bool TypeF::eq(const Type *t) const { + // Bitwise comparison to distinguish between +/-0. These values must be treated + // as different to be consistent with C1 and the interpreter. + return (jint_cast(_f) == jint_cast(t->getf())); } //------------------------------hash------------------------------------------- @@ -1116,21 +1105,10 @@ //------------------------------eq--------------------------------------------- // Structural equality check for Type representations -bool TypeD::eq( const Type *t ) const { - if( g_isnan(_d) || - g_isnan(t->getd()) ) { - // One or both are NANs. If both are NANs return true, else false. - return (g_isnan(_d) && g_isnan(t->getd())); - } - if (_d == t->getd()) { - // (NaN is impossible at this point, since it is not equal even to itself) - if (_d == 0.0) { - // difference between positive and negative zero - if (jlong_cast(_d) != jlong_cast(t->getd())) return false; - } - return true; - } - return false; +bool TypeD::eq(const Type *t) const { + // Bitwise comparison to distinguish between +/-0. These values must be treated + // as different to be consistent with C1 and the interpreter. + return (jlong_cast(_d) == jlong_cast(t->getd())); } //------------------------------hash-------------------------------------------
--- a/src/share/vm/runtime/arguments.cpp Wed Mar 07 05:37:59 2018 +0000 +++ b/src/share/vm/runtime/arguments.cpp Thu Mar 15 03:52:15 2018 +0000 @@ -4156,6 +4156,11 @@ warning("Setting CompressedClassSpaceSize has no effect when compressed class pointers are not used"); } + if (UseOnStackReplacement && !UseLoopCounter) { + warning("On-stack-replacement requires loop counters; enabling loop counters"); + FLAG_SET_DEFAULT(UseLoopCounter, true); + } + #ifndef PRODUCT if (CompileTheWorld) { // Force NmethodSweeper to sweep whole CodeCache each time.
--- a/src/share/vm/runtime/jniHandles.cpp Wed Mar 07 05:37:59 2018 +0000 +++ b/src/share/vm/runtime/jniHandles.cpp Thu Mar 15 03:52:15 2018 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -196,8 +196,10 @@ int _count; public: CountHandleClosure(): _count(0) {} - virtual void do_oop(oop* unused) { - _count++; + virtual void do_oop(oop* ooph) { + if (*ooph != JNIHandles::deleted_handle()) { + _count++; + } } virtual void do_oop(narrowOop* unused) { ShouldNotReachHere(); } int count() { return _count; }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/compiler/c1/Test8172751.java Thu Mar 15 03:52:15 2018 +0000 @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @bug 8172751 + * @summary OSR compilation at unreachable bci causes C1 crash + * + * @run main/othervm -XX:-BackgroundCompilation compiler.c1.Test8172751 + */ + +package compiler.c1; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MutableCallSite; + +public class Test8172751 { + private static final MethodHandle CONSTANT_TRUE = MethodHandles.constant(boolean.class, true); + private static final MethodHandle CONSTANT_FALSE = MethodHandles.constant(boolean.class, false); + private static final MutableCallSite CALL_SITE = new MutableCallSite(CONSTANT_FALSE); + private static final int LIMIT = 1_000_000; + private static volatile int counter; + + private static boolean doSomething() { + return counter++ < LIMIT; + } + + private static void executeLoop() { + /* + * Start off with executing the first loop, then change the call site + * target so as to switch over to the second loop but continue running + * in the first loop. Eventually, an OSR compilation of the first loop + * is triggered. Yet C1 will not find the OSR entry, since it will + * have optimized out the first loop already during parsing. + */ + if (CALL_SITE.getTarget() == CONSTANT_FALSE) { + int count = 0; + while (doSomething()) { + if (count++ == 1) { + flipSwitch(); + } + } + } else { + while (doSomething()) { + } + } + } + + private static void flipSwitch() { + CALL_SITE.setTarget(CONSTANT_TRUE); + } + + public static void main(String[] args) { + executeLoop(); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/compiler/c1/TestPinnedIntrinsics.java Thu Mar 15 03:52:15 2018 +0000 @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8184271 + * @summary Test correct scheduling of System.nanoTime and System.currentTimeMillis C1 intrinsics. + * @run main/othervm -XX:TieredStopAtLevel=1 -Xbatch + * -XX:CompileCommand=dontinline,compiler.c1.TestPinnedIntrinsics::checkNanoTime + * -XX:CompileCommand=dontinline,compiler.c1.TestPinnedIntrinsics::checkCurrentTimeMillis + * compiler.c1.TestPinnedIntrinsics + */ + +package compiler.c1; + +public class TestPinnedIntrinsics { + + private static void testNanoTime() { + long start = System.nanoTime(); + long end = System.nanoTime(); + checkNanoTime(end - start); + } + + private static void checkNanoTime(long diff) { + if (diff < 0) { + throw new RuntimeException("testNanoTime failed with " + diff); + } + } + + private static void testCurrentTimeMillis() { + long start = System.currentTimeMillis(); + long end = System.currentTimeMillis(); + checkCurrentTimeMillis(end - start); + } + + private static void checkCurrentTimeMillis(long diff) { + if (diff < 0) { + throw new RuntimeException("testCurrentTimeMillis failed with " + diff); + } + } + + public static void main(String[] args) { + for (int i = 0; i < 100_000; ++i) { + testNanoTime(); + testCurrentTimeMillis(); + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/compiler/c2/FloatingPointFoldingTest.java Thu Mar 15 03:52:15 2018 +0000 @@ -0,0 +1,163 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/** + * @test + * @bug 8073670 + * @summary Test that causes C2 to fold two NaNs with different values into a single NaN. + * @run main/othervm -XX:-TieredCompilation -Xcomp -XX:CompileCommand=compileonly,FloatingPointFoldingTest.test_double_inf -XX:CompileCommand=compileonly,FloatingPointFoldingTest.test_double_zero -XX:CompileCommand=compileonly,FloatingPointFoldingTest.test_double_nan -XX:CompileCommand=compileonly,FloatingPointFoldingTest.test_float_inf -XX:CompileCommand=compileonly,FloatingPointFoldingTest.test_float_zero -XX:CompileCommand=compileonly,FloatingPointFoldingTest.test_float_nan FloatingPointFoldingTest + */ + +public class FloatingPointFoldingTest { + // Double values. + public static final long MINUS_INF_LONGBITS = 0xfff0000000000000L; + public static final double DOUBLE_MINUS_INF = Double.longBitsToDouble(MINUS_INF_LONGBITS); + + public static final long PLUS_INF_LONGBITS = 0x7ff0000000000000L; + public static final double DOUBLE_PLUS_INF = Double.longBitsToDouble(PLUS_INF_LONGBITS); + + public static final long MINUS_ZERO_LONGBITS = 0x8000000000000000L; + public static final double DOUBLE_MINUS_ZERO = Double.longBitsToDouble(MINUS_ZERO_LONGBITS); + + // We need two different NaN values. A floating point number is + // considered to be NaN is the sign bit is 0, all exponent bits + // are set to 1, and at least one bit of the exponent is not zero. + // + // As java.lang.Double.NaN is 0x7ff8000000000000L, we use + // 0x7ffc000000000000L as a second NaN double value. + public static final long NAN_LONGBITS = 0x7ffc000000000000L; + public static final double DOUBLE_NAN = Double.longBitsToDouble(NAN_LONGBITS); + + // Float values. + public static final int MINUS_INF_INTBITS = 0xff800000; + public static final float FLOAT_MINUS_INF = Float.intBitsToFloat(MINUS_INF_INTBITS); + + public static final int PLUS_INF_INTBITS = 0x7f800000; + public static final float FLOAT_PLUS_INF = Float.intBitsToFloat(PLUS_INF_INTBITS); + + public static final int MINUS_ZERO_INTBITS = 0x80000000; + public static final float FLOAT_MINUS_ZERO = Float.intBitsToFloat(MINUS_ZERO_INTBITS); + + // As java.lang.Float.NaN is 0x7fc00000, we use 0x7fe00000 + // as a second NaN float value. + public static final int NAN_INTBITS = 0x7fe00000; + public static final float FLOAT_NAN = Float.intBitsToFloat(NAN_INTBITS); + + + // Double tests. + static void test_double_inf(long[] result) { + double d1 = DOUBLE_MINUS_INF; + double d2 = DOUBLE_PLUS_INF; + result[0] = Double.doubleToRawLongBits(d1); + result[1] = Double.doubleToRawLongBits(d2); + } + + static void test_double_zero(long[] result) { + double d1 = DOUBLE_MINUS_ZERO; + double d2 = 0; + result[0] = Double.doubleToRawLongBits(d1); + result[1] = Double.doubleToRawLongBits(d2); + } + + static void test_double_nan(long[] result) { + double d1 = DOUBLE_NAN; + double d2 = Double.NaN; + result[0] = Double.doubleToRawLongBits(d1); + result[1] = Double.doubleToRawLongBits(d2); + } + + // Float tests. + static void test_float_inf(int[] result) { + float f1 = FLOAT_MINUS_INF; + float f2 = FLOAT_PLUS_INF; + result[0] = Float.floatToRawIntBits(f1); + result[1] = Float.floatToRawIntBits(f2); + } + + static void test_float_zero(int[] result) { + float f1 = FLOAT_MINUS_ZERO; + float f2 = 0; + result[0] = Float.floatToRawIntBits(f1); + result[1] = Float.floatToRawIntBits(f2); + } + + static void test_float_nan(int[] result) { + float f1 = FLOAT_NAN; + float f2 = Float.NaN; + result[0] = Float.floatToRawIntBits(f1); + result[1] = Float.floatToRawIntBits(f2); + } + + // Check doubles. + static void check_double(long[] result, double d1, double d2) { + if (result[0] == result[1]) { + throw new RuntimeException("ERROR: Two different double values are considered equal. \n" + + String.format("\toriginal values: 0x%x 0x%x\n", Double.doubleToRawLongBits(d1), Double.doubleToRawLongBits(d2)) + + String.format("\tvalues after execution of method test(): 0x%x 0x%x", result[0], result[1])); + } + } + + // Check floats. + static void check_float(int[] result, float f1, float f2) { + if (result[0] == result[1]) { + throw new RuntimeException("ERROR: Two different float values are considered equal. \n" + + String.format("\toriginal values: 0x%x 0x%x\n", Float.floatToRawIntBits(f1), Float.floatToRawIntBits(f2)) + + String.format("\tvalues after execution of method test(): 0x%x 0x%x", result[0], result[1])); + } + } + + public static void main(String[] args) { + // Float tests. + + int[] iresult = new int[2]; + + // -Inf and +Inf. + test_float_inf(iresult); + check_float(iresult, FLOAT_MINUS_INF, FLOAT_PLUS_INF); + + // 0 and -0. + test_float_zero(iresult); + check_float(iresult, FLOAT_MINUS_ZERO, 0); + + // Diferrent NaNs. + test_float_nan(iresult); + check_float(iresult, FLOAT_NAN, Float.NaN); + + // Double tests. + + long[] lresult = new long[2]; + + // -Inf and +Inf. + test_double_inf(lresult); + check_double(lresult, DOUBLE_MINUS_INF, DOUBLE_PLUS_INF); + + // 0 and -0. + test_double_zero(lresult); + check_double(lresult, DOUBLE_MINUS_ZERO, 0); + + // Diferrent NaNs. + test_double_nan(lresult); + check_double(lresult, DOUBLE_NAN, Double.NaN); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/compiler/loopopts/TestImpossibleIV.java Thu Mar 15 03:52:15 2018 +0000 @@ -0,0 +1,51 @@ +/* + * Copyright 2016 Google, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8166742 + * @summary C2 IV elimination throws FPE + * @run main/othervm -XX:-TieredCompilation -XX:-BackgroundCompilation TestImpossibleIV + * @author Chuck Rasbold rasbold@google.com + */ + +/* + * Use -XX:-TieredCompilation to get C2 only. + * Use -XX:-BackgroundCompilation to wait for compilation before test exit. + */ + +public class TestImpossibleIV { + + static private void testMethod() { + int sum = 0; + // A unit count-down loop which has an induction variable with + // MIN_VALUE stride. + for (int i = 100000; i >= 0; i--) { + sum += Integer.MIN_VALUE; + } + } + + public static void main(String[] args) { + testMethod(); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/compiler/unsafe/TestRawAliasing.java Thu Mar 15 03:52:15 2018 +0000 @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8178047 + * @run main/othervm -XX:CompileCommand=exclude,*.main -XX:-TieredCompilation -XX:-BackgroundCompilation compiler.unsafe.TestRawAliasing + */ + +package compiler.unsafe; + +import java.lang.reflect.Field; + +public class TestRawAliasing { + static private final sun.misc.Unsafe UNSAFE; + static { + try { + Field f = sun.misc.Unsafe.class.getDeclaredField("theUnsafe"); + f.setAccessible(true); + UNSAFE = (sun.misc.Unsafe) f.get(null); + } catch (Exception e) { + throw new RuntimeException("Unable to get Unsafe instance.", e); + } + } + + static private final int OFFSET_X = 50; + static private final int OFFSET_Y = 100; + + private static int test(long base_plus_offset_x, long base_plus_offset_y, int magic_value) { + // write 0 to a location + UNSAFE.putByte(base_plus_offset_x - OFFSET_X, (byte)0); + // write unfoldable value to really the same location with another base + UNSAFE.putByte(base_plus_offset_y - OFFSET_Y, (byte)magic_value); + // read the value back, should be equal to "unfoldable_value" + return UNSAFE.getByte(base_plus_offset_x - OFFSET_X); + } + + private static final int OFF_HEAP_AREA_SIZE = 128; + private static final byte MAGIC = 123; + + // main is excluded from compilation since we don't want the test method to inline and make base values fold + public static void main(String... args) { + long base = UNSAFE.allocateMemory(OFF_HEAP_AREA_SIZE); + for (int i = 0; i < 100_000; i++) { + if (test(base + OFFSET_X, base + OFFSET_Y, MAGIC) != MAGIC) { + throw new RuntimeException("Unexpected magic value"); + } + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/runtime/Metaspace/MaxMetaspaceSizeTest.java Thu Mar 15 03:52:15 2018 +0000 @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import com.oracle.java.testlibrary.ProcessTools; +import com.oracle.java.testlibrary.OutputAnalyzer; + +/* + * @test MaxMetaspaceSizeTest + * @requires vm.bits == "64" + * @bug 8087291 + * @library /testlibrary + * @run main/othervm MaxMetaspaceSizeTest + */ + +public class MaxMetaspaceSizeTest { + public static void main(String... args) throws Exception { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder( + "-Xmx1g", + "-XX:InitialBootClassLoaderMetaspaceSize=4195328", + "-XX:MaxMetaspaceSize=4195328", + "-XX:+UseCompressedClassPointers", + "-XX:CompressedClassSpaceSize=1g", + "-version"); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldContain("MaxMetaspaceSize is too small."); + } +}