--- a/hotspot/src/cpu/zero/vm/globals_zero.hpp Tue Feb 16 14:11:44 2010 -0800
+++ b/hotspot/src/cpu/zero/vm/globals_zero.hpp Thu Feb 18 10:44:14 2010 -0800
@@ -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, 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);
--- a/hotspot/src/os_cpu/linux_zero/vm/os_linux_zero.hpp Tue Feb 16 14:11:44 2010 -0800
+++ b/hotspot/src/os_cpu/linux_zero/vm/os_linux_zero.hpp Thu Feb 18 10:44:14 2010 -0800
@@ -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
}
--- a/hotspot/src/share/vm/opto/callGenerator.cpp Tue Feb 16 14:11:44 2010 -0800
+++ b/hotspot/src/share/vm/opto/callGenerator.cpp Thu Feb 18 10:44:14 2010 -0800
@@ -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 @@
}
// 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 @@
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.
--- a/hotspot/src/share/vm/opto/compile.cpp Tue Feb 16 14:11:44 2010 -0800
+++ b/hotspot/src/share/vm/opto/compile.cpp Thu Feb 18 10:44:14 2010 -0800
@@ -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 @@
_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 @@
_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),
--- a/hotspot/src/share/vm/opto/compile.hpp Tue Feb 16 14:11:44 2010 -0800
+++ b/hotspot/src/share/vm/opto/compile.hpp Thu Feb 18 10:44:14 2010 -0800
@@ -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 @@
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 @@
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);
--- a/hotspot/src/share/vm/opto/output.cpp Tue Feb 16 14:11:44 2010 -0800
+++ b/hotspot/src/share/vm/opto/output.cpp Thu Feb 18 10:44:14 2010 -0800
@@ -805,8 +805,12 @@
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 @@
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 @@
_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:
--- a/hotspot/src/share/vm/opto/parse1.cpp Tue Feb 16 14:11:44 2010 -0800
+++ b/hotspot/src/share/vm/opto/parse1.cpp Thu Feb 18 10:44:14 2010 -0800
@@ -824,7 +824,6 @@
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 @@
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:
--- a/hotspot/src/share/vm/runtime/sharedRuntime.cpp Tue Feb 16 14:11:44 2010 -0800
+++ b/hotspot/src/share/vm/runtime/sharedRuntime.cpp Thu Feb 18 10:44:14 2010 -0800
@@ -1947,7 +1947,7 @@
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 @@
// 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 @@
return NULL;
}
+#ifndef PRODUCT
void print_statistics() {
ResourceMark rm;
int longest = 0;
@@ -2021,15 +2022,14 @@
}
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
- }
};
-#ifdef ASSERT
+#ifndef PRODUCT
int AdapterHandlerTable::_lookups;
int AdapterHandlerTable::_buckets;