diff --git a/src/cpu/zero/vm/globals_zero.hpp b/src/cpu/zero/vm/globals_zero.hpp index e8a32f1d47a500ba1bc23b17a0aea6f10a12b7de..e50df6f3dd17efa8a4ca0f887950de9d3ae28cae 100644 --- a/src/cpu/zero/vm/globals_zero.hpp +++ b/src/cpu/zero/vm/globals_zero.hpp @@ -1,6 +1,6 @@ /* * Copyright 2000-2006 Sun Microsystems, Inc. All Rights Reserved. - * Copyright 2007, 2008, 2009 Red Hat, Inc. + * Copyright 2007, 2008, 2009, 2010 Red Hat, Inc. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -40,7 +40,7 @@ define_pd_global(intx, PreInflateSpin, 10); define_pd_global(intx, StackYellowPages, 2); define_pd_global(intx, StackRedPages, 1); -define_pd_global(intx, StackShadowPages, 3 LP64_ONLY(+3) DEBUG_ONLY(+3)); +define_pd_global(intx, StackShadowPages, 5 LP64_ONLY(+1) DEBUG_ONLY(+3)); define_pd_global(bool, RewriteBytecodes, true); define_pd_global(bool, RewriteFrequentPairs, true); diff --git a/src/os_cpu/linux_zero/vm/os_linux_zero.hpp b/src/os_cpu/linux_zero/vm/os_linux_zero.hpp index d226d5ca726a15c6dfec4345cf75c1822d74ea7c..86d356269ae5a604a5f356fe37723f1dc4534ede 100644 --- a/src/os_cpu/linux_zero/vm/os_linux_zero.hpp +++ b/src/os_cpu/linux_zero/vm/os_linux_zero.hpp @@ -1,6 +1,6 @@ /* * Copyright 2003-2004 Sun Microsystems, Inc. All Rights Reserved. - * Copyright 2007, 2008 Red Hat, Inc. + * Copyright 2007, 2008, 2010 Red Hat, Inc. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -39,7 +39,13 @@ "stfd %0, 0(%2)\n" : "=f"(tmp) : "b"(src), "b"(dst)); +#elif defined(S390) && !defined(_LP64) + double tmp; + asm volatile ("ld %0, 0(%1)\n" + "std %0, 0(%2)\n" + : "=r"(tmp) + : "a"(src), "a"(dst)); #else *(jlong *) dst = *(jlong *) src; -#endif // PPC && !_LP64 +#endif } diff --git a/src/share/vm/opto/callGenerator.cpp b/src/share/vm/opto/callGenerator.cpp index 37272feb19e0272fb54144f9d98984379cb66342..a358e535076f164184f1b265abbf7a775323f240 100644 --- a/src/share/vm/opto/callGenerator.cpp +++ b/src/share/vm/opto/callGenerator.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2010 Sun Microsystems, 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 @@ -136,8 +136,10 @@ JVMState* DirectCallGenerator::generate(JVMState* jvms) { } // Mark the call node as virtual, sort of: call->set_optimized_virtual(true); - if (method()->is_method_handle_invoke()) + if (method()->is_method_handle_invoke()) { call->set_method_handle_invoke(true); + kit.C->set_has_method_handle_invokes(true); + } } kit.set_arguments_for_java_call(call); kit.set_edges_for_java_call(call, false, _separate_io_proj); @@ -194,6 +196,7 @@ JVMState* DynamicCallGenerator::generate(JVMState* jvms) { call->set_optimized_virtual(true); // Take extra care (in the presence of argument motion) not to trash the SP: call->set_method_handle_invoke(true); + kit.C->set_has_method_handle_invokes(true); // Pass the target MethodHandle as first argument and shift the // other arguments. diff --git a/src/share/vm/opto/compile.cpp b/src/share/vm/opto/compile.cpp index 84102e1553cda854bfabc026e600cce312436f7f..5ca0286b54550b64ff7b415173e7280caaf55ed5 100644 --- a/src/share/vm/opto/compile.cpp +++ b/src/share/vm/opto/compile.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2009 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2010 Sun Microsystems, 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 @@ -465,6 +465,7 @@ Compile::Compile( ciEnv* ci_env, C2Compiler* compiler, ciMethod* target, int osr _code_buffer("Compile::Fill_buffer"), _orig_pc_slot(0), _orig_pc_slot_offset_in_bytes(0), + _has_method_handle_invokes(false), _node_bundling_limit(0), _node_bundling_base(NULL), _java_calls(0), @@ -759,6 +760,7 @@ Compile::Compile( ciEnv* ci_env, _do_escape_analysis(false), _failure_reason(NULL), _code_buffer("Compile::Fill_buffer"), + _has_method_handle_invokes(false), _node_bundling_limit(0), _node_bundling_base(NULL), _java_calls(0), diff --git a/src/share/vm/opto/compile.hpp b/src/share/vm/opto/compile.hpp index c683110355d6532f19a5adfa34daba924610c535..7027d29d5337e9ad1e98eacec23131d34099f633 100644 --- a/src/share/vm/opto/compile.hpp +++ b/src/share/vm/opto/compile.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2009 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2010 Sun Microsystems, 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 @@ -166,6 +166,9 @@ class Compile : public Phase { bool _parsed_irreducible_loop; // True if ciTypeFlow detected irreducible loops during parsing #endif + // JSR 292 + bool _has_method_handle_invokes; // True if this method has MethodHandle invokes. + // Compilation environment. Arena _comp_arena; // Arena with lifetime equivalent to Compile ciEnv* _env; // CI interface @@ -336,6 +339,10 @@ class Compile : public Phase { void set_parsed_irreducible_loop(bool z) { _parsed_irreducible_loop = z; } #endif + // JSR 292 + bool has_method_handle_invokes() const { return _has_method_handle_invokes; } + void set_has_method_handle_invokes(bool z) { _has_method_handle_invokes = z; } + void begin_method() { #ifndef PRODUCT if (_printer) _printer->begin_method(this); diff --git a/src/share/vm/opto/output.cpp b/src/share/vm/opto/output.cpp index deb2ac2c3c389635306cc3bcfed6f40291f19937..fb5db8e7791d5985e43d952be77abc0fccfdabf6 100644 --- a/src/share/vm/opto/output.cpp +++ b/src/share/vm/opto/output.cpp @@ -805,8 +805,12 @@ void Compile::Process_OopMap_Node(MachNode *mach, int current_offset) { mcall = mach->as_MachCall(); // Is the call a MethodHandle call? - if (mcall->is_MachCallJava()) - is_method_handle_invoke = mcall->as_MachCallJava()->_method_handle_invoke; + if (mcall->is_MachCallJava()) { + if (mcall->as_MachCallJava()->_method_handle_invoke) { + assert(has_method_handle_invokes(), "must have been set during call generation"); + is_method_handle_invoke = true; + } + } // Check if a call returns an object. if (mcall->return_value_is_used() && @@ -1092,9 +1096,21 @@ void Compile::Fill_buffer() { deopt_handler_req += MAX_stubs_size; // add marginal slop for handler stub_req += MAX_stubs_size; // ensure per-stub margin code_req += MAX_inst_size; // ensure per-instruction margin + if (StressCodeBuffers) code_req = const_req = stub_req = exception_handler_req = deopt_handler_req = 0x10; // force expansion - int total_req = code_req + pad_req + stub_req + exception_handler_req + deopt_handler_req + const_req; + + int total_req = + code_req + + pad_req + + stub_req + + exception_handler_req + + deopt_handler_req + // deopt handler + const_req; + + if (has_method_handle_invokes()) + total_req += deopt_handler_req; // deopt MH handler + CodeBuffer* cb = code_buffer(); cb->initialize(total_req, locs_req); @@ -1436,10 +1452,13 @@ void Compile::Fill_buffer() { _code_offsets.set_value(CodeOffsets::Exceptions, emit_exception_handler(*cb)); // Emit the deopt handler code. _code_offsets.set_value(CodeOffsets::Deopt, emit_deopt_handler(*cb)); - // Emit the MethodHandle deopt handler code. We can use the same - // code as for the normal deopt handler, we just need a different - // entry point address. - _code_offsets.set_value(CodeOffsets::DeoptMH, emit_deopt_handler(*cb)); + + // Emit the MethodHandle deopt handler code (if required). + if (has_method_handle_invokes()) { + // We can use the same code as for the normal deopt handler, we + // just need a different entry point address. + _code_offsets.set_value(CodeOffsets::DeoptMH, emit_deopt_handler(*cb)); + } } // One last check for failed CodeBuffer::expand: diff --git a/src/share/vm/opto/parse1.cpp b/src/share/vm/opto/parse1.cpp index 169cdc9754be2bcde7e39a78a68c7db4dcf603f0..4cae42dd2cc0b6004c32231dafc7d1045df7d570 100644 --- a/src/share/vm/opto/parse1.cpp +++ b/src/share/vm/opto/parse1.cpp @@ -824,7 +824,6 @@ bool Parse::can_rerun_bytecode() { case Bytecodes::_ddiv: case Bytecodes::_checkcast: case Bytecodes::_instanceof: - case Bytecodes::_athrow: case Bytecodes::_anewarray: case Bytecodes::_newarray: case Bytecodes::_multianewarray: @@ -834,6 +833,8 @@ bool Parse::can_rerun_bytecode() { return true; break; + // Don't rerun athrow since it's part of the exception path. + case Bytecodes::_athrow: case Bytecodes::_invokestatic: case Bytecodes::_invokedynamic: case Bytecodes::_invokespecial: diff --git a/src/share/vm/runtime/sharedRuntime.cpp b/src/share/vm/runtime/sharedRuntime.cpp index 3098625858e880c54b033c5127c6db1bf8e39eda..bc79954b9785fdc5a33e4512a82b7793f74b0a24 100644 --- a/src/share/vm/runtime/sharedRuntime.cpp +++ b/src/share/vm/runtime/sharedRuntime.cpp @@ -1947,7 +1947,7 @@ class AdapterHandlerTable : public BasicHashtable { private: -#ifdef ASSERT +#ifndef PRODUCT static int _lookups; // number of calls to lookup static int _buckets; // number of buckets checked static int _equals; // number of buckets checked with matching hash @@ -1983,16 +1983,16 @@ class AdapterHandlerTable : public BasicHashtable { // Find a entry with the same fingerprint if it exists AdapterHandlerEntry* lookup(int total_args_passed, BasicType* sig_bt) { - debug_only(_lookups++); + NOT_PRODUCT(_lookups++); AdapterFingerPrint fp(total_args_passed, sig_bt); unsigned int hash = fp.compute_hash(); int index = hash_to_index(hash); for (AdapterHandlerEntry* e = bucket(index); e != NULL; e = e->next()) { - debug_only(_buckets++); + NOT_PRODUCT(_buckets++); if (e->hash() == hash) { - debug_only(_equals++); + NOT_PRODUCT(_equals++); if (fp.equals(e->fingerprint())) { -#ifdef ASSERT +#ifndef PRODUCT if (fp.is_compact()) _compact++; _hits++; #endif @@ -2003,6 +2003,7 @@ class AdapterHandlerTable : public BasicHashtable { return NULL; } +#ifndef PRODUCT void print_statistics() { ResourceMark rm; int longest = 0; @@ -2021,15 +2022,14 @@ class AdapterHandlerTable : public BasicHashtable { } tty->print_cr("AdapterHandlerTable: empty %d longest %d total %d average %f", empty, longest, total, total / (double)nonempty); -#ifdef ASSERT tty->print_cr("AdapterHandlerTable: lookups %d buckets %d equals %d hits %d compact %d", _lookups, _buckets, _equals, _hits, _compact); -#endif } +#endif }; -#ifdef ASSERT +#ifndef PRODUCT int AdapterHandlerTable::_lookups; int AdapterHandlerTable::_buckets;