Merge
This commit is contained in:
commit
6ddab0cf3c
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2000, 2012, 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,4 +75,43 @@ define_pd_global(bool, UseMembar, false);
|
||||
|
||||
// GC Ergo Flags
|
||||
define_pd_global(intx, CMSYoungGenPerWorker, 16*M); // default max size of CMS young gen, per GC worker thread
|
||||
|
||||
#define ARCH_FLAGS(develop, product, diagnostic, experimental, notproduct) \
|
||||
\
|
||||
product(intx, UseVIS, 99, \
|
||||
"Highest supported VIS instructions set on Sparc") \
|
||||
\
|
||||
product(bool, UseCBCond, false, \
|
||||
"Use compare and branch instruction on SPARC") \
|
||||
\
|
||||
product(bool, UseBlockZeroing, false, \
|
||||
"Use special cpu instructions for block zeroing") \
|
||||
\
|
||||
product(intx, BlockZeroingLowLimit, 2048, \
|
||||
"Minimum size in bytes when block zeroing will be used") \
|
||||
\
|
||||
product(bool, UseBlockCopy, false, \
|
||||
"Use special cpu instructions for block copy") \
|
||||
\
|
||||
product(intx, BlockCopyLowLimit, 2048, \
|
||||
"Minimum size in bytes when block copy will be used") \
|
||||
\
|
||||
develop(bool, UseV8InstrsOnly, false, \
|
||||
"Use SPARC-V8 Compliant instruction subset") \
|
||||
\
|
||||
product(bool, UseNiagaraInstrs, false, \
|
||||
"Use Niagara-efficient instruction subset") \
|
||||
\
|
||||
develop(bool, UseCASForSwap, false, \
|
||||
"Do not use swap instructions, but only CAS (in a loop) on SPARC")\
|
||||
\
|
||||
product(uintx, ArraycopySrcPrefetchDistance, 0, \
|
||||
"Distance to prefetch source array in arracopy") \
|
||||
\
|
||||
product(uintx, ArraycopyDstPrefetchDistance, 0, \
|
||||
"Distance to prefetch destination array in arracopy") \
|
||||
\
|
||||
develop(intx, V8AtomicOperationUnderLockSpinCount, 50, \
|
||||
"Number of times to spin wait on a v8 atomic operation lock") \
|
||||
|
||||
#endif // CPU_SPARC_VM_GLOBALS_SPARC_HPP
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2000, 2012, 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
|
||||
@ -78,4 +78,53 @@ define_pd_global(bool, UseMembar, false);
|
||||
|
||||
// GC Ergo Flags
|
||||
define_pd_global(intx, CMSYoungGenPerWorker, 64*M); // default max size of CMS young gen, per GC worker thread
|
||||
|
||||
#define ARCH_FLAGS(develop, product, diagnostic, experimental, notproduct) \
|
||||
\
|
||||
develop(bool, IEEEPrecision, true, \
|
||||
"Enables IEEE precision (for INTEL only)") \
|
||||
\
|
||||
product(intx, FenceInstruction, 0, \
|
||||
"(Unsafe,Unstable) Experimental") \
|
||||
\
|
||||
product(intx, ReadPrefetchInstr, 0, \
|
||||
"Prefetch instruction to prefetch ahead") \
|
||||
\
|
||||
product(bool, UseStoreImmI16, true, \
|
||||
"Use store immediate 16-bits value instruction on x86") \
|
||||
\
|
||||
product(intx, UseAVX, 99, \
|
||||
"Highest supported AVX instructions set on x86/x64") \
|
||||
\
|
||||
diagnostic(bool, UseIncDec, true, \
|
||||
"Use INC, DEC instructions on x86") \
|
||||
\
|
||||
product(bool, UseNewLongLShift, false, \
|
||||
"Use optimized bitwise shift left") \
|
||||
\
|
||||
product(bool, UseAddressNop, false, \
|
||||
"Use '0F 1F [addr]' NOP instructions on x86 cpus") \
|
||||
\
|
||||
product(bool, UseXmmLoadAndClearUpper, true, \
|
||||
"Load low part of XMM register and clear upper part") \
|
||||
\
|
||||
product(bool, UseXmmRegToRegMoveAll, false, \
|
||||
"Copy all XMM register bits when moving value between registers") \
|
||||
\
|
||||
product(bool, UseXmmI2D, false, \
|
||||
"Use SSE2 CVTDQ2PD instruction to convert Integer to Double") \
|
||||
\
|
||||
product(bool, UseXmmI2F, false, \
|
||||
"Use SSE2 CVTDQ2PS instruction to convert Integer to Float") \
|
||||
\
|
||||
product(bool, UseUnalignedLoadStores, false, \
|
||||
"Use SSE2 MOVDQU instruction for Arraycopy") \
|
||||
\
|
||||
/* assembler */ \
|
||||
product(bool, Use486InstrsOnly, false, \
|
||||
"Use 80486 Compliant instruction subset") \
|
||||
\
|
||||
product(bool, UseCountLeadingZerosInstruction, false, \
|
||||
"Use count leading zeros instruction") \
|
||||
|
||||
#endif // CPU_X86_VM_GLOBALS_X86_HPP
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright 2007, 2008, 2009, 2010, 2011 Red Hat, Inc.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
@ -60,4 +60,7 @@ define_pd_global(bool, UseMembar, false);
|
||||
|
||||
// GC Ergo Flags
|
||||
define_pd_global(intx, CMSYoungGenPerWorker, 16*M); // default max size of CMS young gen, per GC worker thread
|
||||
|
||||
#define ARCH_FLAGS(develop, product, diagnostic, experimental, notproduct)
|
||||
|
||||
#endif // CPU_ZERO_VM_GLOBALS_ZERO_HPP
|
||||
|
@ -1646,15 +1646,15 @@ Dependencies* GraphBuilder::dependency_recorder() const {
|
||||
|
||||
|
||||
void GraphBuilder::invoke(Bytecodes::Code code) {
|
||||
const bool is_invokedynamic = (code == Bytecodes::_invokedynamic);
|
||||
|
||||
bool will_link;
|
||||
ciMethod* target = stream()->get_method(will_link);
|
||||
ciSignature* declared_signature = NULL;
|
||||
ciMethod* target = stream()->get_method(will_link, &declared_signature);
|
||||
ciKlass* holder = stream()->get_declared_method_holder();
|
||||
const Bytecodes::Code bc_raw = stream()->cur_bc_raw();
|
||||
assert(declared_signature != NULL, "cannot be null");
|
||||
|
||||
// FIXME bail out for now
|
||||
if ((bc_raw == Bytecodes::_invokehandle || is_invokedynamic) && !will_link) {
|
||||
if (Bytecodes::has_optional_appendix(bc_raw) && !will_link) {
|
||||
BAILOUT("unlinked call site (FIXME needs patching or recompile support)");
|
||||
}
|
||||
|
||||
@ -1840,7 +1840,7 @@ void GraphBuilder::invoke(Bytecodes::Code code) {
|
||||
bool success = false;
|
||||
if (target->is_method_handle_intrinsic()) {
|
||||
// method handle invokes
|
||||
success = for_method_handle_inline(target);
|
||||
success = try_method_handle_inline(target);
|
||||
} else {
|
||||
// static binding => check if callee is ok
|
||||
success = try_inline(inline_target, (cha_monomorphic_target != NULL) || (exact_target != NULL), code, better_receiver);
|
||||
@ -1877,7 +1877,7 @@ void GraphBuilder::invoke(Bytecodes::Code code) {
|
||||
|
||||
// inlining not successful => standard invoke
|
||||
bool is_loaded = target->is_loaded();
|
||||
ValueType* result_type = as_ValueType(target->return_type());
|
||||
ValueType* result_type = as_ValueType(declared_signature->return_type());
|
||||
ValueStack* state_before = copy_state_exhandling();
|
||||
|
||||
// The bytecode (code) might change in this method so we are checking this very late.
|
||||
@ -3823,7 +3823,7 @@ bool GraphBuilder::try_inline_full(ciMethod* callee, bool holder_known, Bytecode
|
||||
}
|
||||
|
||||
|
||||
bool GraphBuilder::for_method_handle_inline(ciMethod* callee) {
|
||||
bool GraphBuilder::try_method_handle_inline(ciMethod* callee) {
|
||||
ValueStack* state_before = state()->copy_for_parsing();
|
||||
vmIntrinsics::ID iid = callee->intrinsic_id();
|
||||
switch (iid) {
|
||||
@ -3858,7 +3858,7 @@ bool GraphBuilder::for_method_handle_inline(ciMethod* callee) {
|
||||
// If the target is another method handle invoke try recursivly to get
|
||||
// a better target.
|
||||
if (target->is_method_handle_intrinsic()) {
|
||||
if (for_method_handle_inline(target)) {
|
||||
if (try_method_handle_inline(target)) {
|
||||
return true;
|
||||
}
|
||||
} else {
|
||||
|
@ -346,7 +346,7 @@ class GraphBuilder VALUE_OBJ_CLASS_SPEC {
|
||||
const char* should_not_inline(ciMethod* callee) const;
|
||||
|
||||
// JSR 292 support
|
||||
bool for_method_handle_inline(ciMethod* callee);
|
||||
bool try_method_handle_inline(ciMethod* callee);
|
||||
|
||||
// helpers
|
||||
void inline_bailout(const char* msg);
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2000, 2012, 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
|
||||
@ -156,18 +156,12 @@
|
||||
develop(bool, CanonicalizeNodes, true, \
|
||||
"Canonicalize graph nodes") \
|
||||
\
|
||||
develop(bool, CanonicalizeExperimental, false, \
|
||||
"Canonicalize graph nodes, experimental code") \
|
||||
\
|
||||
develop(bool, PrintCanonicalization, false, \
|
||||
"Print graph node canonicalization") \
|
||||
\
|
||||
develop(bool, UseTableRanges, true, \
|
||||
"Faster versions of lookup table using ranges") \
|
||||
\
|
||||
develop(bool, UseFastExceptionHandling, true, \
|
||||
"Faster handling of exceptions") \
|
||||
\
|
||||
develop_pd(bool, RoundFPResults, \
|
||||
"Indicates whether rounding is needed for floating point results")\
|
||||
\
|
||||
@ -224,9 +218,6 @@
|
||||
develop(bool, PinAllInstructions, false, \
|
||||
"All instructions are pinned") \
|
||||
\
|
||||
develop(bool, ValueStackPinStackAll, true, \
|
||||
"Pinning in ValueStack pin everything") \
|
||||
\
|
||||
develop(bool, UseFastNewInstance, true, \
|
||||
"Use fast inlined instance allocation") \
|
||||
\
|
||||
|
@ -236,12 +236,16 @@ void BCEscapeAnalyzer::invoke(StateInfo &state, Bytecodes::Code code, ciMethod*
|
||||
ciInstanceKlass* callee_holder = ciEnv::get_instance_klass_for_declared_method_holder(holder);
|
||||
ciInstanceKlass* actual_recv = callee_holder;
|
||||
|
||||
// some methods are obviously bindable without any type checks so
|
||||
// convert them directly to an invokespecial.
|
||||
// Some methods are obviously bindable without any type checks so
|
||||
// convert them directly to an invokespecial or invokestatic.
|
||||
if (target->is_loaded() && !target->is_abstract() && target->can_be_statically_bound()) {
|
||||
switch (code) {
|
||||
case Bytecodes::_invokevirtual: code = Bytecodes::_invokespecial; break;
|
||||
case Bytecodes::_invokehandle: code = Bytecodes::_invokestatic; break;
|
||||
case Bytecodes::_invokevirtual:
|
||||
code = Bytecodes::_invokespecial;
|
||||
break;
|
||||
case Bytecodes::_invokehandle:
|
||||
code = target->is_static() ? Bytecodes::_invokestatic : Bytecodes::_invokespecial;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -826,8 +830,8 @@ void BCEscapeAnalyzer::iterate_one_block(ciBlock *blk, StateInfo &state, Growabl
|
||||
break;
|
||||
case Bytecodes::_getstatic:
|
||||
case Bytecodes::_getfield:
|
||||
{ bool will_link;
|
||||
ciField* field = s.get_field(will_link);
|
||||
{ bool ignored_will_link;
|
||||
ciField* field = s.get_field(ignored_will_link);
|
||||
BasicType field_type = field->type()->basic_type();
|
||||
if (s.cur_bc() != Bytecodes::_getstatic) {
|
||||
set_method_escape(state.apop());
|
||||
@ -865,16 +869,21 @@ void BCEscapeAnalyzer::iterate_one_block(ciBlock *blk, StateInfo &state, Growabl
|
||||
case Bytecodes::_invokestatic:
|
||||
case Bytecodes::_invokedynamic:
|
||||
case Bytecodes::_invokeinterface:
|
||||
{ bool will_link;
|
||||
ciMethod* target = s.get_method(will_link);
|
||||
ciKlass* holder = s.get_declared_method_holder();
|
||||
{ bool ignored_will_link;
|
||||
ciSignature* declared_signature = NULL;
|
||||
ciMethod* target = s.get_method(ignored_will_link, &declared_signature);
|
||||
ciKlass* holder = s.get_declared_method_holder();
|
||||
assert(declared_signature != NULL, "cannot be null");
|
||||
// Push appendix argument, if one.
|
||||
if (s.has_appendix()) {
|
||||
state.apush(unknown_obj);
|
||||
}
|
||||
// Pass in raw bytecode because we need to see invokehandle instructions.
|
||||
invoke(state, s.cur_bc_raw(), target, holder);
|
||||
ciType* return_type = target->return_type();
|
||||
// We are using the return type of the declared signature here because
|
||||
// it might be a more concrete type than the one from the target (for
|
||||
// e.g. invokedynamic and invokehandle).
|
||||
ciType* return_type = declared_signature->return_type();
|
||||
if (!return_type->is_primitive_type()) {
|
||||
state.apush(unknown_obj);
|
||||
} else if (return_type->is_one_word()) {
|
||||
|
@ -738,91 +738,81 @@ methodOop ciEnv::lookup_method(instanceKlass* accessor,
|
||||
ciMethod* ciEnv::get_method_by_index_impl(constantPoolHandle cpool,
|
||||
int index, Bytecodes::Code bc,
|
||||
ciInstanceKlass* accessor) {
|
||||
int holder_index = cpool->klass_ref_index_at(index);
|
||||
bool holder_is_accessible;
|
||||
ciKlass* holder = get_klass_by_index_impl(cpool, holder_index, holder_is_accessible, accessor);
|
||||
ciInstanceKlass* declared_holder = get_instance_klass_for_declared_method_holder(holder);
|
||||
if (bc == Bytecodes::_invokedynamic) {
|
||||
ConstantPoolCacheEntry* secondary_entry = cpool->cache()->secondary_entry_at(index);
|
||||
const bool is_resolved = !secondary_entry->is_f1_null();
|
||||
// FIXME: code generation could allow for null (unlinked) call site
|
||||
// The call site could be made patchable as follows:
|
||||
// Load the appendix argument from the constant pool.
|
||||
// Test the appendix argument and jump to a known deopt routine if it is null.
|
||||
// Jump through a patchable call site, which is initially a deopt routine.
|
||||
// Patch the call site to the nmethod entry point of the static compiled lambda form.
|
||||
// As with other two-component call sites, both values must be independently verified.
|
||||
|
||||
// Get the method's name and signature.
|
||||
Symbol* name_sym = cpool->name_ref_at(index);
|
||||
Symbol* sig_sym = cpool->signature_ref_at(index);
|
||||
|
||||
if (cpool->has_preresolution()
|
||||
|| (holder == ciEnv::MethodHandle_klass() &&
|
||||
MethodHandles::is_signature_polymorphic_name(holder->get_klassOop(), name_sym))) {
|
||||
// Short-circuit lookups for JSR 292-related call sites.
|
||||
// That is, do not rely only on name-based lookups, because they may fail
|
||||
// if the names are not resolvable in the boot class loader (7056328).
|
||||
switch (bc) {
|
||||
case Bytecodes::_invokevirtual:
|
||||
case Bytecodes::_invokeinterface:
|
||||
case Bytecodes::_invokespecial:
|
||||
case Bytecodes::_invokestatic:
|
||||
{
|
||||
oop appendix_oop = NULL;
|
||||
methodOop m = constantPoolOopDesc::method_at_if_loaded(cpool, index);
|
||||
if (m != NULL) {
|
||||
return get_object(m)->as_method();
|
||||
}
|
||||
}
|
||||
break;
|
||||
if (is_resolved) {
|
||||
// Get the invoker methodOop and the extra argument from the constant pool.
|
||||
methodOop adapter = secondary_entry->f2_as_vfinal_method();
|
||||
return get_object(adapter)->as_method();
|
||||
}
|
||||
}
|
||||
|
||||
if (holder_is_accessible) { // Our declared holder is loaded.
|
||||
instanceKlass* lookup = declared_holder->get_instanceKlass();
|
||||
methodOop m = lookup_method(accessor->get_instanceKlass(), lookup, name_sym, sig_sym, bc);
|
||||
if (m != NULL &&
|
||||
(bc == Bytecodes::_invokestatic
|
||||
? instanceKlass::cast(m->method_holder())->is_not_initialized()
|
||||
: !instanceKlass::cast(m->method_holder())->is_loaded())) {
|
||||
m = NULL;
|
||||
}
|
||||
if (m != NULL) {
|
||||
// We found the method.
|
||||
return get_object(m)->as_method();
|
||||
}
|
||||
}
|
||||
|
||||
// Either the declared holder was not loaded, or the method could
|
||||
// not be found. Create a dummy ciMethod to represent the failed
|
||||
// lookup.
|
||||
ciSymbol* name = get_symbol(name_sym);
|
||||
ciSymbol* signature = get_symbol(sig_sym);
|
||||
return get_unloaded_method(declared_holder, name, signature, accessor);
|
||||
}
|
||||
|
||||
|
||||
// ------------------------------------------------------------------
|
||||
// ciEnv::get_fake_invokedynamic_method_impl
|
||||
ciMethod* ciEnv::get_fake_invokedynamic_method_impl(constantPoolHandle cpool,
|
||||
int index, Bytecodes::Code bc,
|
||||
ciInstanceKlass* accessor) {
|
||||
// Compare the following logic with InterpreterRuntime::resolve_invokedynamic.
|
||||
assert(bc == Bytecodes::_invokedynamic, "must be invokedynamic");
|
||||
|
||||
ConstantPoolCacheEntry* secondary_entry = cpool->cache()->secondary_entry_at(index);
|
||||
bool is_resolved = !secondary_entry->is_f1_null();
|
||||
// FIXME: code generation could allow for null (unlinked) call site
|
||||
// The call site could be made patchable as follows:
|
||||
// Load the appendix argument from the constant pool.
|
||||
// Test the appendix argument and jump to a known deopt routine if it is null.
|
||||
// Jump through a patchable call site, which is initially a deopt routine.
|
||||
// Patch the call site to the nmethod entry point of the static compiled lambda form.
|
||||
// As with other two-component call sites, both values must be independently verified.
|
||||
|
||||
// Call site might not be resolved yet.
|
||||
// Stop the code path here with an unlinked method.
|
||||
if (!is_resolved) {
|
||||
// Fake a method that is equivalent to a declared method.
|
||||
ciInstanceKlass* holder = get_object(SystemDictionary::MethodHandle_klass())->as_instance_klass();
|
||||
ciSymbol* name = ciSymbol::invokeBasic_name();
|
||||
ciSymbol* signature = get_symbol(cpool->signature_ref_at(index));
|
||||
return get_unloaded_method(holder, name, signature, accessor);
|
||||
}
|
||||
} else {
|
||||
const int holder_index = cpool->klass_ref_index_at(index);
|
||||
bool holder_is_accessible;
|
||||
ciKlass* holder = get_klass_by_index_impl(cpool, holder_index, holder_is_accessible, accessor);
|
||||
ciInstanceKlass* declared_holder = get_instance_klass_for_declared_method_holder(holder);
|
||||
|
||||
// Get the invoker methodOop and the extra argument from the constant pool.
|
||||
methodOop adapter = secondary_entry->f2_as_vfinal_method();
|
||||
return get_object(adapter)->as_method();
|
||||
// Get the method's name and signature.
|
||||
Symbol* name_sym = cpool->name_ref_at(index);
|
||||
Symbol* sig_sym = cpool->signature_ref_at(index);
|
||||
|
||||
if (cpool->has_preresolution()
|
||||
|| (holder == ciEnv::MethodHandle_klass() &&
|
||||
MethodHandles::is_signature_polymorphic_name(holder->get_klassOop(), name_sym))) {
|
||||
// Short-circuit lookups for JSR 292-related call sites.
|
||||
// That is, do not rely only on name-based lookups, because they may fail
|
||||
// if the names are not resolvable in the boot class loader (7056328).
|
||||
switch (bc) {
|
||||
case Bytecodes::_invokevirtual:
|
||||
case Bytecodes::_invokeinterface:
|
||||
case Bytecodes::_invokespecial:
|
||||
case Bytecodes::_invokestatic:
|
||||
{
|
||||
methodOop m = constantPoolOopDesc::method_at_if_loaded(cpool, index);
|
||||
if (m != NULL) {
|
||||
return get_object(m)->as_method();
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (holder_is_accessible) { // Our declared holder is loaded.
|
||||
instanceKlass* lookup = declared_holder->get_instanceKlass();
|
||||
methodOop m = lookup_method(accessor->get_instanceKlass(), lookup, name_sym, sig_sym, bc);
|
||||
if (m != NULL &&
|
||||
(bc == Bytecodes::_invokestatic
|
||||
? instanceKlass::cast(m->method_holder())->is_not_initialized()
|
||||
: !instanceKlass::cast(m->method_holder())->is_loaded())) {
|
||||
m = NULL;
|
||||
}
|
||||
if (m != NULL) {
|
||||
// We found the method.
|
||||
return get_object(m)->as_method();
|
||||
}
|
||||
}
|
||||
|
||||
// Either the declared holder was not loaded, or the method could
|
||||
// not be found. Create a dummy ciMethod to represent the failed
|
||||
// lookup.
|
||||
ciSymbol* name = get_symbol(name_sym);
|
||||
ciSymbol* signature = get_symbol(sig_sym);
|
||||
return get_unloaded_method(declared_holder, name, signature, accessor);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -853,11 +843,7 @@ ciInstanceKlass* ciEnv::get_instance_klass_for_declared_method_holder(ciKlass* m
|
||||
ciMethod* ciEnv::get_method_by_index(constantPoolHandle cpool,
|
||||
int index, Bytecodes::Code bc,
|
||||
ciInstanceKlass* accessor) {
|
||||
if (bc == Bytecodes::_invokedynamic) {
|
||||
GUARDED_VM_ENTRY(return get_fake_invokedynamic_method_impl(cpool, index, bc, accessor);)
|
||||
} else {
|
||||
GUARDED_VM_ENTRY(return get_method_by_index_impl( cpool, index, bc, accessor);)
|
||||
}
|
||||
GUARDED_VM_ENTRY(return get_method_by_index_impl(cpool, index, bc, accessor);)
|
||||
}
|
||||
|
||||
|
||||
|
@ -152,9 +152,6 @@ private:
|
||||
ciMethod* get_method_by_index_impl(constantPoolHandle cpool,
|
||||
int method_index, Bytecodes::Code bc,
|
||||
ciInstanceKlass* loading_klass);
|
||||
ciMethod* get_fake_invokedynamic_method_impl(constantPoolHandle cpool,
|
||||
int index, Bytecodes::Code bc,
|
||||
ciInstanceKlass* accessor);
|
||||
|
||||
// Helper methods
|
||||
bool check_klass_accessibility(ciKlass* accessing_klass,
|
||||
|
@ -1215,9 +1215,10 @@ void ciMethod::print_impl(outputStream* st) {
|
||||
holder()->print_name_on(st);
|
||||
st->print(" signature=");
|
||||
signature()->as_symbol()->print_symbol_on(st);
|
||||
st->print(" arg_size=%d", arg_size());
|
||||
if (is_loaded()) {
|
||||
st->print(" loaded=true flags=");
|
||||
st->print(" loaded=true");
|
||||
st->print(" arg_size=%d", arg_size());
|
||||
st->print(" flags=");
|
||||
flags().print_member_flags(st);
|
||||
} else {
|
||||
st->print(" loaded=false");
|
||||
|
@ -355,11 +355,23 @@ int ciBytecodeStream::get_method_index() {
|
||||
// ciBytecodeStream::get_method
|
||||
//
|
||||
// If this is a method invocation bytecode, get the invoked method.
|
||||
ciMethod* ciBytecodeStream::get_method(bool& will_link) {
|
||||
// Additionally return the declared signature to get more concrete
|
||||
// type information if required (Cf. invokedynamic and invokehandle).
|
||||
ciMethod* ciBytecodeStream::get_method(bool& will_link, ciSignature* *declared_signature_result) {
|
||||
VM_ENTRY_MARK;
|
||||
ciEnv* env = CURRENT_ENV;
|
||||
constantPoolHandle cpool(_method->get_methodOop()->constants());
|
||||
ciMethod* m = CURRENT_ENV->get_method_by_index(cpool, get_method_index(), cur_bc(), _holder);
|
||||
ciMethod* m = env->get_method_by_index(cpool, get_method_index(), cur_bc(), _holder);
|
||||
will_link = m->is_loaded();
|
||||
// Get declared method signature and return it.
|
||||
if (has_optional_appendix()) {
|
||||
const int sig_index = get_method_signature_index();
|
||||
Symbol* sig_sym = cpool->symbol_at(sig_index);
|
||||
ciKlass* pool_holder = env->get_object(cpool->pool_holder())->as_klass();
|
||||
(*declared_signature_result) = new (env->arena()) ciSignature(pool_holder, cpool, env->get_symbol(sig_sym));
|
||||
} else {
|
||||
(*declared_signature_result) = m->signature();
|
||||
}
|
||||
return m;
|
||||
}
|
||||
|
||||
@ -418,24 +430,6 @@ int ciBytecodeStream::get_method_holder_index() {
|
||||
return cpool->klass_ref_index_at(get_method_index());
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------
|
||||
// ciBytecodeStream::get_declared_method_signature
|
||||
//
|
||||
// Get the declared signature of the currently referenced method.
|
||||
//
|
||||
// This is always the same as the signature of the resolved method
|
||||
// itself, except for _invokehandle and _invokedynamic calls.
|
||||
//
|
||||
ciSignature* ciBytecodeStream::get_declared_method_signature() {
|
||||
int sig_index = get_method_signature_index();
|
||||
VM_ENTRY_MARK;
|
||||
ciEnv* env = CURRENT_ENV;
|
||||
constantPoolHandle cpool(_method->get_methodOop()->constants());
|
||||
Symbol* sig_sym = cpool->symbol_at(sig_index);
|
||||
ciKlass* pool_holder = env->get_object(cpool->pool_holder())->as_klass();
|
||||
return new (env->arena()) ciSignature(pool_holder, cpool, env->get_symbol(sig_sym));
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------
|
||||
// ciBytecodeStream::get_method_signature_index
|
||||
//
|
||||
@ -443,11 +437,12 @@ ciSignature* ciBytecodeStream::get_declared_method_signature() {
|
||||
// referenced by the current bytecode. Used for generating
|
||||
// deoptimization information.
|
||||
int ciBytecodeStream::get_method_signature_index() {
|
||||
VM_ENTRY_MARK;
|
||||
constantPoolOop cpool = _holder->get_instanceKlass()->constants();
|
||||
int method_index = get_method_index();
|
||||
int name_and_type_index = cpool->name_and_type_ref_index_at(method_index);
|
||||
return cpool->signature_ref_index_at(name_and_type_index);
|
||||
GUARDED_VM_ENTRY(
|
||||
constantPoolOop cpool = _holder->get_instanceKlass()->constants();
|
||||
const int method_index = get_method_index();
|
||||
const int name_and_type_index = cpool->name_and_type_ref_index_at(method_index);
|
||||
return cpool->signature_ref_index_at(name_and_type_index);
|
||||
)
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------
|
||||
|
@ -151,6 +151,8 @@ public:
|
||||
// Does this instruction contain an index which refes into the CP cache?
|
||||
bool has_cache_index() const { return Bytecodes::uses_cp_cache(cur_bc_raw()); }
|
||||
|
||||
bool has_optional_appendix() { return Bytecodes::has_optional_appendix(cur_bc_raw()); }
|
||||
|
||||
int get_index_u1() const {
|
||||
return bytecode().get_index_u1(cur_bc_raw());
|
||||
}
|
||||
@ -257,13 +259,11 @@ public:
|
||||
int get_field_holder_index();
|
||||
int get_field_signature_index();
|
||||
|
||||
// If this is a method invocation bytecode, get the invoked method.
|
||||
ciMethod* get_method(bool& will_link);
|
||||
ciMethod* get_method(bool& will_link, ciSignature* *declared_signature_result);
|
||||
bool has_appendix();
|
||||
ciObject* get_appendix();
|
||||
ciKlass* get_declared_method_holder();
|
||||
int get_method_holder_index();
|
||||
ciSignature* get_declared_method_signature();
|
||||
int get_method_signature_index();
|
||||
|
||||
ciCPCache* get_cpcache() const;
|
||||
|
@ -643,9 +643,11 @@ void ciTypeFlow::StateVector::do_getstatic(ciBytecodeStream* str) {
|
||||
// ------------------------------------------------------------------
|
||||
// ciTypeFlow::StateVector::do_invoke
|
||||
void ciTypeFlow::StateVector::do_invoke(ciBytecodeStream* str,
|
||||
bool has_receiver_foo) {
|
||||
bool has_receiver) {
|
||||
bool will_link;
|
||||
ciMethod* callee = str->get_method(will_link);
|
||||
ciSignature* declared_signature = NULL;
|
||||
ciMethod* callee = str->get_method(will_link, &declared_signature);
|
||||
assert(declared_signature != NULL, "cannot be null");
|
||||
if (!will_link) {
|
||||
// We weren't able to find the method.
|
||||
if (str->cur_bc() == Bytecodes::_invokedynamic) {
|
||||
@ -658,22 +660,12 @@ void ciTypeFlow::StateVector::do_invoke(ciBytecodeStream* str,
|
||||
trap(str, unloaded_holder, str->get_method_holder_index());
|
||||
}
|
||||
} else {
|
||||
// TODO Use Bytecode_invoke after metadata changes.
|
||||
//Bytecode_invoke inv(str->method(), str->cur_bci());
|
||||
//const bool has_receiver = callee->is_loaded() ? !callee->is_static() : inv.has_receiver();
|
||||
Bytecode inv(str);
|
||||
Bytecodes::Code code = inv.invoke_code();
|
||||
const bool has_receiver = callee->is_loaded() ? !callee->is_static() : code != Bytecodes::_invokestatic && code != Bytecodes::_invokedynamic;
|
||||
|
||||
ciSignature* signature = callee->signature();
|
||||
ciSignatureStream sigstr(signature);
|
||||
// Push appendix argument, if one.
|
||||
if (str->has_appendix()) {
|
||||
ciObject* appendix = str->get_appendix();
|
||||
push_object(appendix->klass());
|
||||
}
|
||||
int arg_size = signature->size();
|
||||
int stack_base = stack_size() - arg_size;
|
||||
// We are using the declared signature here because it might be
|
||||
// different from the callee signature (Cf. invokedynamic and
|
||||
// invokehandle).
|
||||
ciSignatureStream sigstr(declared_signature);
|
||||
const int arg_size = declared_signature->size();
|
||||
const int stack_base = stack_size() - arg_size;
|
||||
int i = 0;
|
||||
for( ; !sigstr.at_return_type(); sigstr.next()) {
|
||||
ciType* type = sigstr.type();
|
||||
@ -689,7 +681,6 @@ void ciTypeFlow::StateVector::do_invoke(ciBytecodeStream* str,
|
||||
for (int j = 0; j < arg_size; j++) {
|
||||
pop();
|
||||
}
|
||||
assert(!callee->is_loaded() || has_receiver == !callee->is_static(), "mismatch");
|
||||
if (has_receiver) {
|
||||
// Check this?
|
||||
pop_object();
|
||||
|
@ -424,6 +424,8 @@ class Bytecodes: AllStatic {
|
||||
|| code == _fconst_0 || code == _dconst_0); }
|
||||
static bool is_invoke (Code code) { return (_invokevirtual <= code && code <= _invokedynamic); }
|
||||
|
||||
static bool has_optional_appendix(Code code) { return code == _invokedynamic || code == _invokehandle; }
|
||||
|
||||
static int compute_flags (const char* format, int more_flags = 0); // compute the flags
|
||||
static int flags (int code, bool is_wide) {
|
||||
assert(code == (u_char)code, "must be a byte");
|
||||
|
@ -353,27 +353,9 @@
|
||||
develop(bool, StressRecompilation, false, \
|
||||
"Recompile each compiled method without subsuming loads or escape analysis.") \
|
||||
\
|
||||
/* controls for tier 1 compilations */ \
|
||||
\
|
||||
develop(bool, Tier1CountInvocations, true, \
|
||||
"Generate code, during tier 1, to update invocation counter") \
|
||||
\
|
||||
product(intx, Tier1Inline, false, \
|
||||
"enable inlining during tier 1") \
|
||||
\
|
||||
product(intx, Tier1MaxInlineSize, 8, \
|
||||
"maximum bytecode size of a method to be inlined, during tier 1") \
|
||||
\
|
||||
product(intx, Tier1FreqInlineSize, 35, \
|
||||
"max bytecode size of a frequent method to be inlined, tier 1") \
|
||||
\
|
||||
develop(intx, ImplicitNullCheckThreshold, 3, \
|
||||
"Don't do implicit null checks if NPE's in a method exceeds limit") \
|
||||
\
|
||||
/* controls for loop optimization */ \
|
||||
product(intx, Tier1LoopOptsCount, 0, \
|
||||
"Set level of loop optimization for tier 1 compiles") \
|
||||
\
|
||||
product(intx, LoopOptsCount, 43, \
|
||||
"Set level of loop optimization for tier 1 compiles") \
|
||||
\
|
||||
@ -505,6 +487,116 @@
|
||||
\
|
||||
product(bool, BlockLayoutRotateLoops, true, \
|
||||
"Allow back branches to be fall throughs in the block layour") \
|
||||
\
|
||||
develop(bool, InlineReflectionGetCallerClass, true, \
|
||||
"inline sun.reflect.Reflection.getCallerClass(), known to be part "\
|
||||
"of base library DLL") \
|
||||
\
|
||||
develop(bool, InlineObjectCopy, true, \
|
||||
"inline Object.clone and Arrays.copyOf[Range] intrinsics") \
|
||||
\
|
||||
develop(bool, SpecialStringCompareTo, true, \
|
||||
"special version of string compareTo") \
|
||||
\
|
||||
develop(bool, SpecialStringIndexOf, true, \
|
||||
"special version of string indexOf") \
|
||||
\
|
||||
develop(bool, SpecialStringEquals, true, \
|
||||
"special version of string equals") \
|
||||
\
|
||||
develop(bool, SpecialArraysEquals, true, \
|
||||
"special version of Arrays.equals(char[],char[])") \
|
||||
\
|
||||
develop(bool, BailoutToInterpreterForThrows, false, \
|
||||
"Compiled methods which throws/catches exceptions will be " \
|
||||
"deopt and intp.") \
|
||||
\
|
||||
develop(bool, ConvertCmpD2CmpF, true, \
|
||||
"Convert cmpD to cmpF when one input is constant in float range") \
|
||||
\
|
||||
develop(bool, ConvertFloat2IntClipping, true, \
|
||||
"Convert float2int clipping idiom to integer clipping") \
|
||||
\
|
||||
develop(bool, Use24BitFPMode, true, \
|
||||
"Set 24-bit FPU mode on a per-compile basis ") \
|
||||
\
|
||||
develop(bool, Use24BitFP, true, \
|
||||
"use FP instructions that produce 24-bit precise results") \
|
||||
\
|
||||
develop(bool, MonomorphicArrayCheck, true, \
|
||||
"Uncommon-trap array store checks that require full type check") \
|
||||
\
|
||||
notproduct(bool, TracePhaseCCP, false, \
|
||||
"Print progress during Conditional Constant Propagation") \
|
||||
\
|
||||
develop(bool, PrintDominators, false, \
|
||||
"Print out dominator trees for GVN") \
|
||||
\
|
||||
notproduct(bool, TraceSpilling, false, \
|
||||
"Trace spilling") \
|
||||
\
|
||||
notproduct(bool, TraceTypeProfile, false, \
|
||||
"Trace type profile") \
|
||||
\
|
||||
develop(bool, PoisonOSREntry, true, \
|
||||
"Detect abnormal calls to OSR code") \
|
||||
\
|
||||
product(bool, UseCondCardMark, false, \
|
||||
"Check for already marked card before updating card table") \
|
||||
\
|
||||
develop(bool, SoftMatchFailure, trueInProduct, \
|
||||
"If the DFA fails to match a node, print a message and bail out") \
|
||||
\
|
||||
develop(bool, InlineAccessors, true, \
|
||||
"inline accessor methods (get/set)") \
|
||||
\
|
||||
product(intx, TypeProfileMajorReceiverPercent, 90, \
|
||||
"% of major receiver type to all profiled receivers") \
|
||||
\
|
||||
notproduct(bool, TimeCompiler2, false, \
|
||||
"detailed time the compiler (requires +TimeCompiler)") \
|
||||
\
|
||||
diagnostic(bool, PrintIntrinsics, false, \
|
||||
"prints attempted and successful inlining of intrinsics") \
|
||||
\
|
||||
diagnostic(ccstrlist, DisableIntrinsic, "", \
|
||||
"do not expand intrinsics whose (internal) names appear here") \
|
||||
\
|
||||
develop(bool, StressReflectiveCode, false, \
|
||||
"Use inexact types at allocations, etc., to test reflection") \
|
||||
\
|
||||
diagnostic(bool, DebugInlinedCalls, true, \
|
||||
"If false, restricts profiled locations to the root method only") \
|
||||
\
|
||||
notproduct(bool, VerifyLoopOptimizations, false, \
|
||||
"verify major loop optimizations") \
|
||||
\
|
||||
diagnostic(bool, ProfileDynamicTypes, true, \
|
||||
"do extra type profiling and use it more aggressively") \
|
||||
\
|
||||
develop(bool, TraceIterativeGVN, false, \
|
||||
"Print progress during Iterative Global Value Numbering") \
|
||||
\
|
||||
develop(bool, VerifyIterativeGVN, false, \
|
||||
"Verify Def-Use modifications during sparse Iterative Global " \
|
||||
"Value Numbering") \
|
||||
\
|
||||
notproduct(bool, TraceCISCSpill, false, \
|
||||
"Trace allocators use of cisc spillable instructions") \
|
||||
\
|
||||
product(bool, SplitIfBlocks, true, \
|
||||
"Clone compares and control flow through merge points to fold " \
|
||||
"some branches") \
|
||||
\
|
||||
develop(intx, FreqCountInvocations, 1, \
|
||||
"Scaling factor for branch frequencies (deprecated)") \
|
||||
\
|
||||
product(intx, AliasLevel, 3, \
|
||||
"0 for no aliasing, 1 for oop/field/static/array split, " \
|
||||
"2 for class split, 3 for unique instances") \
|
||||
\
|
||||
develop(bool, VerifyAliases, false, \
|
||||
"perform extra checks on the results of alias analysis") \
|
||||
|
||||
C2_FLAGS(DECLARE_DEVELOPER_FLAG, DECLARE_PD_DEVELOPER_FLAG, DECLARE_PRODUCT_FLAG, DECLARE_PD_PRODUCT_FLAG, DECLARE_DIAGNOSTIC_FLAG, DECLARE_EXPERIMENTAL_FLAG, DECLARE_NOTPRODUCT_FLAG)
|
||||
|
||||
|
@ -222,6 +222,7 @@ void PhaseChaitin::Register_Allocate() {
|
||||
_alternate = 0;
|
||||
_matcher._allocation_started = true;
|
||||
|
||||
ResourceArea split_arena; // Arena for Split local resources
|
||||
ResourceArea live_arena; // Arena for liveness & IFG info
|
||||
ResourceMark rm(&live_arena);
|
||||
|
||||
@ -324,7 +325,7 @@ void PhaseChaitin::Register_Allocate() {
|
||||
// Bail out if unique gets too large (ie - unique > MaxNodeLimit)
|
||||
C->check_node_count(10*must_spill, "out of nodes before split");
|
||||
if (C->failing()) return;
|
||||
_maxlrg = Split( _maxlrg ); // Split spilling LRG everywhere
|
||||
_maxlrg = Split(_maxlrg, &split_arena); // Split spilling LRG everywhere
|
||||
// Bail out if unique gets too large (ie - unique > MaxNodeLimit - 2*NodeLimitFudgeFactor)
|
||||
// or we failed to split
|
||||
C->check_node_count(2*NodeLimitFudgeFactor, "out of nodes after physical split");
|
||||
@ -390,7 +391,7 @@ void PhaseChaitin::Register_Allocate() {
|
||||
}
|
||||
|
||||
if( !_maxlrg ) return;
|
||||
_maxlrg = Split( _maxlrg ); // Split spilling LRG everywhere
|
||||
_maxlrg = Split(_maxlrg, &split_arena); // Split spilling LRG everywhere
|
||||
// Bail out if unique gets too large (ie - unique > MaxNodeLimit - 2*NodeLimitFudgeFactor)
|
||||
C->check_node_count(2*NodeLimitFudgeFactor, "out of nodes after split");
|
||||
if (C->failing()) return;
|
||||
|
@ -470,7 +470,7 @@ private:
|
||||
|
||||
// Split uncolorable live ranges
|
||||
// Return new number of live ranges
|
||||
uint Split( uint maxlrg );
|
||||
uint Split(uint maxlrg, ResourceArea* split_arena);
|
||||
|
||||
// Copy 'was_spilled'-edness from one Node to another.
|
||||
void copy_was_spilled( Node *src, Node *dst );
|
||||
|
@ -341,25 +341,26 @@ void Parse::do_call() {
|
||||
kill_dead_locals();
|
||||
|
||||
// Set frequently used booleans
|
||||
bool is_virtual = bc() == Bytecodes::_invokevirtual;
|
||||
bool is_virtual_or_interface = is_virtual || bc() == Bytecodes::_invokeinterface;
|
||||
bool has_receiver = is_virtual_or_interface || bc() == Bytecodes::_invokespecial;
|
||||
bool is_invokedynamic = bc() == Bytecodes::_invokedynamic;
|
||||
const bool is_virtual = bc() == Bytecodes::_invokevirtual;
|
||||
const bool is_virtual_or_interface = is_virtual || bc() == Bytecodes::_invokeinterface;
|
||||
const bool has_receiver = is_virtual_or_interface || bc() == Bytecodes::_invokespecial;
|
||||
|
||||
// Find target being called
|
||||
bool will_link;
|
||||
ciMethod* bc_callee = iter().get_method(will_link); // actual callee from bytecode
|
||||
ciInstanceKlass* holder_klass = bc_callee->holder();
|
||||
ciKlass* holder = iter().get_declared_method_holder();
|
||||
ciSignature* declared_signature = NULL;
|
||||
ciMethod* orig_callee = iter().get_method(will_link, &declared_signature); // callee in the bytecode
|
||||
ciInstanceKlass* holder_klass = orig_callee->holder();
|
||||
ciKlass* holder = iter().get_declared_method_holder();
|
||||
ciInstanceKlass* klass = ciEnv::get_instance_klass_for_declared_method_holder(holder);
|
||||
assert(declared_signature != NULL, "cannot be null");
|
||||
|
||||
// uncommon-trap when callee is unloaded, uninitialized or will not link
|
||||
// bailout when too many arguments for register representation
|
||||
if (!will_link || can_not_compile_call_site(bc_callee, klass)) {
|
||||
if (!will_link || can_not_compile_call_site(orig_callee, klass)) {
|
||||
#ifndef PRODUCT
|
||||
if (PrintOpto && (Verbose || WizardMode)) {
|
||||
method()->print_name(); tty->print_cr(" can not compile call at bci %d to:", bci());
|
||||
bc_callee->print_name(); tty->cr();
|
||||
orig_callee->print_name(); tty->cr();
|
||||
}
|
||||
#endif
|
||||
return;
|
||||
@ -372,7 +373,7 @@ void Parse::do_call() {
|
||||
// Note: In the absence of miranda methods, an abstract class K can perform
|
||||
// an invokevirtual directly on an interface method I.m if K implements I.
|
||||
|
||||
const int nargs = bc_callee->arg_size();
|
||||
const int nargs = orig_callee->arg_size();
|
||||
|
||||
// Push appendix argument (MethodType, CallSite, etc.), if one.
|
||||
if (iter().has_appendix()) {
|
||||
@ -392,13 +393,13 @@ void Parse::do_call() {
|
||||
// Choose call strategy.
|
||||
bool call_is_virtual = is_virtual_or_interface;
|
||||
int vtable_index = methodOopDesc::invalid_vtable_index;
|
||||
ciMethod* callee = bc_callee;
|
||||
ciMethod* callee = orig_callee;
|
||||
|
||||
// Try to get the most accurate receiver type
|
||||
if (is_virtual_or_interface) {
|
||||
Node* receiver_node = stack(sp() - nargs);
|
||||
const TypeOopPtr* receiver_type = _gvn.type(receiver_node)->isa_oopptr();
|
||||
ciMethod* optimized_virtual_method = optimize_inlining(method(), bci(), klass, bc_callee, receiver_type);
|
||||
ciMethod* optimized_virtual_method = optimize_inlining(method(), bci(), klass, orig_callee, receiver_type);
|
||||
|
||||
// Have the call been sufficiently improved such that it is no longer a virtual?
|
||||
if (optimized_virtual_method != NULL) {
|
||||
@ -425,7 +426,8 @@ void Parse::do_call() {
|
||||
// It decides whether inlining is desirable or not.
|
||||
CallGenerator* cg = C->call_generator(callee, vtable_index, call_is_virtual, jvms, try_inline, prof_factor());
|
||||
|
||||
bc_callee = callee = NULL; // don't use bc_callee and callee after this point
|
||||
// NOTE: Don't use orig_callee and callee after this point! Use cg->method() instead.
|
||||
orig_callee = callee = NULL;
|
||||
|
||||
// ---------------------
|
||||
// Round double arguments before call
|
||||
@ -497,9 +499,9 @@ void Parse::do_call() {
|
||||
round_double_result(cg->method());
|
||||
|
||||
ciType* rtype = cg->method()->return_type();
|
||||
if (iter().cur_bc_raw() == Bytecodes::_invokehandle || is_invokedynamic) {
|
||||
if (Bytecodes::has_optional_appendix(iter().cur_bc_raw())) {
|
||||
// Be careful here with return types.
|
||||
ciType* ctype = iter().get_declared_method_signature()->return_type();
|
||||
ciType* ctype = declared_signature->return_type();
|
||||
if (ctype != rtype) {
|
||||
BasicType rt = rtype->basic_type();
|
||||
BasicType ct = ctype->basic_type();
|
||||
@ -528,15 +530,13 @@ void Parse::do_call() {
|
||||
} else if (rt == T_OBJECT || rt == T_ARRAY) {
|
||||
assert(ct == T_OBJECT || ct == T_ARRAY, err_msg_res("rt=%s, ct=%s", type2name(rt), type2name(ct)));
|
||||
if (ctype->is_loaded()) {
|
||||
Node* if_fail = top();
|
||||
retnode = gen_checkcast(retnode, makecon(TypeKlassPtr::make(ctype->as_klass())), &if_fail);
|
||||
if (if_fail != top()) {
|
||||
PreserveJVMState pjvms(this);
|
||||
set_control(if_fail);
|
||||
builtin_throw(Deoptimization::Reason_class_check);
|
||||
const TypeOopPtr* arg_type = TypeOopPtr::make_from_klass(rtype->as_klass());
|
||||
const Type* sig_type = TypeOopPtr::make_from_klass(ctype->as_klass());
|
||||
if (arg_type != NULL && !arg_type->higher_equal(sig_type)) {
|
||||
Node* cast_obj = _gvn.transform(new (C, 2) CheckCastPPNode(control(), retnode, sig_type));
|
||||
pop();
|
||||
push(cast_obj);
|
||||
}
|
||||
pop();
|
||||
push(retnode);
|
||||
}
|
||||
} else {
|
||||
assert(ct == rt, err_msg_res("unexpected mismatch rt=%d, ct=%d", rt, ct));
|
||||
|
@ -1006,11 +1006,11 @@ bool GraphKit::compute_stack_effects(int& inputs, int& depth, bool for_parse) {
|
||||
case Bytecodes::_putfield:
|
||||
{
|
||||
bool is_get = (depth >= 0), is_static = (depth & 1);
|
||||
bool ignore;
|
||||
ciBytecodeStream iter(method());
|
||||
iter.reset_to_bci(bci());
|
||||
iter.next();
|
||||
ciField* field = iter.get_field(ignore);
|
||||
bool ignored_will_link;
|
||||
ciField* field = iter.get_field(ignored_will_link);
|
||||
int size = field->type()->size();
|
||||
inputs = (is_static ? 0 : 1);
|
||||
if (is_get) {
|
||||
@ -1028,11 +1028,13 @@ bool GraphKit::compute_stack_effects(int& inputs, int& depth, bool for_parse) {
|
||||
case Bytecodes::_invokedynamic:
|
||||
case Bytecodes::_invokeinterface:
|
||||
{
|
||||
bool ignore;
|
||||
ciBytecodeStream iter(method());
|
||||
iter.reset_to_bci(bci());
|
||||
iter.next();
|
||||
ciMethod* callee = iter.get_method(ignore);
|
||||
bool ignored_will_link;
|
||||
ciSignature* declared_signature = NULL;
|
||||
ciMethod* callee = iter.get_method(ignored_will_link, &declared_signature);
|
||||
assert(declared_signature != NULL, "cannot be null");
|
||||
// (Do not use ciMethod::arg_size(), because
|
||||
// it might be an unloaded method, which doesn't
|
||||
// know whether it is static or not.)
|
||||
@ -1046,7 +1048,7 @@ bool GraphKit::compute_stack_effects(int& inputs, int& depth, bool for_parse) {
|
||||
// remove any appendix arguments that were popped.
|
||||
inputs = callee->invoke_arg_size(code) - (callee->has_member_arg() ? 1 : 0);
|
||||
}
|
||||
int size = callee->return_type()->size();
|
||||
int size = declared_signature->return_type()->size();
|
||||
depth = size - inputs;
|
||||
}
|
||||
break;
|
||||
|
@ -547,11 +547,6 @@ void PhaseIdealLoop::do_peeling( IdealLoopTree *loop, Node_List &old_new ) {
|
||||
Node *nnn = old_new[old->_idx];
|
||||
if (!has_ctrl(nnn))
|
||||
set_idom(nnn, idom(nnn), dd-1);
|
||||
// While we're at it, remove any SafePoints from the peeled code
|
||||
if (old->Opcode() == Op_SafePoint) {
|
||||
Node *nnn = old_new[old->_idx];
|
||||
lazy_replace(nnn,nnn->in(TypeFunc::Control));
|
||||
}
|
||||
}
|
||||
|
||||
// Now force out all loop-invariant dominating tests. The optimizer
|
||||
|
@ -577,6 +577,9 @@ bool PhaseIdealLoop::is_counted_loop( Node *x, IdealLoopTree *loop ) {
|
||||
Node *sfpt = x->in(LoopNode::LoopBackControl);
|
||||
if (sfpt->Opcode() == Op_SafePoint && is_deleteable_safept(sfpt)) {
|
||||
lazy_replace( sfpt, iftrue );
|
||||
if (loop->_safepts != NULL) {
|
||||
loop->_safepts->yank(sfpt);
|
||||
}
|
||||
loop->_tail = iftrue;
|
||||
}
|
||||
|
||||
@ -668,8 +671,12 @@ bool PhaseIdealLoop::is_counted_loop( Node *x, IdealLoopTree *loop ) {
|
||||
|
||||
// Check for immediately preceding SafePoint and remove
|
||||
Node *sfpt2 = le->in(0);
|
||||
if (sfpt2->Opcode() == Op_SafePoint && is_deleteable_safept(sfpt2))
|
||||
if (sfpt2->Opcode() == Op_SafePoint && is_deleteable_safept(sfpt2)) {
|
||||
lazy_replace( sfpt2, sfpt2->in(TypeFunc::Control));
|
||||
if (loop->_safepts != NULL) {
|
||||
loop->_safepts->yank(sfpt2);
|
||||
}
|
||||
}
|
||||
|
||||
// Free up intermediate goo
|
||||
_igvn.remove_dead_node(hook);
|
||||
@ -1526,10 +1533,8 @@ void IdealLoopTree::allpaths_check_safepts(VectorSet &visited, Node_List &stack)
|
||||
void IdealLoopTree::check_safepts(VectorSet &visited, Node_List &stack) {
|
||||
// Bottom up traversal
|
||||
IdealLoopTree* ch = _child;
|
||||
while (ch != NULL) {
|
||||
ch->check_safepts(visited, stack);
|
||||
ch = ch->_next;
|
||||
}
|
||||
if (_child) _child->check_safepts(visited, stack);
|
||||
if (_next) _next ->check_safepts(visited, stack);
|
||||
|
||||
if (!_head->is_CountedLoop() && !_has_sfpt && _parent != NULL && !_irreducible) {
|
||||
bool has_call = false; // call on dom-path
|
||||
@ -1702,29 +1707,39 @@ void IdealLoopTree::counted_loop( PhaseIdealLoop *phase ) {
|
||||
phase->is_counted_loop(_head, this)) {
|
||||
_has_sfpt = 1; // Indicate we do not need a safepoint here
|
||||
|
||||
// Look for a safepoint to remove
|
||||
for (Node* n = tail(); n != _head; n = phase->idom(n))
|
||||
if (n->Opcode() == Op_SafePoint && phase->get_loop(n) == this &&
|
||||
phase->is_deleteable_safept(n))
|
||||
phase->lazy_replace(n,n->in(TypeFunc::Control));
|
||||
// Look for safepoints to remove.
|
||||
Node_List* sfpts = _safepts;
|
||||
if (sfpts != NULL) {
|
||||
for (uint i = 0; i < sfpts->size(); i++) {
|
||||
Node* n = sfpts->at(i);
|
||||
assert(phase->get_loop(n) == this, "");
|
||||
if (phase->is_deleteable_safept(n)) {
|
||||
phase->lazy_replace(n, n->in(TypeFunc::Control));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Look for induction variables
|
||||
phase->replace_parallel_iv(this);
|
||||
|
||||
} else if (_parent != NULL && !_irreducible) {
|
||||
// Not a counted loop.
|
||||
// Look for a safepoint on the idom-path to remove, preserving the first one
|
||||
bool found = false;
|
||||
Node* n = tail();
|
||||
for (; n != _head && !found; n = phase->idom(n)) {
|
||||
if (n->Opcode() == Op_SafePoint && phase->get_loop(n) == this)
|
||||
found = true; // Found one
|
||||
// Look for a safepoint on the idom-path.
|
||||
Node* sfpt = tail();
|
||||
for (; sfpt != _head; sfpt = phase->idom(sfpt)) {
|
||||
if (sfpt->Opcode() == Op_SafePoint && phase->get_loop(sfpt) == this)
|
||||
break; // Found one
|
||||
}
|
||||
// Skip past it and delete the others
|
||||
for (; n != _head; n = phase->idom(n)) {
|
||||
if (n->Opcode() == Op_SafePoint && phase->get_loop(n) == this &&
|
||||
phase->is_deleteable_safept(n))
|
||||
phase->lazy_replace(n,n->in(TypeFunc::Control));
|
||||
// Delete other safepoints in this loop.
|
||||
Node_List* sfpts = _safepts;
|
||||
if (sfpts != NULL && sfpt != _head && sfpt->Opcode() == Op_SafePoint) {
|
||||
for (uint i = 0; i < sfpts->size(); i++) {
|
||||
Node* n = sfpts->at(i);
|
||||
assert(phase->get_loop(n) == this, "");
|
||||
if (n != sfpt && phase->is_deleteable_safept(n)) {
|
||||
phase->lazy_replace(n, n->in(TypeFunc::Control));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -2766,6 +2781,10 @@ int PhaseIdealLoop::build_loop_tree_impl( Node *n, int pre_order ) {
|
||||
// if the allocation is not eliminated for some reason.
|
||||
innermost->_allow_optimizations = false;
|
||||
innermost->_has_call = 1; // = true
|
||||
} else if (n->Opcode() == Op_SafePoint) {
|
||||
// Record all safepoints in this loop.
|
||||
if (innermost->_safepts == NULL) innermost->_safepts = new Node_List();
|
||||
innermost->_safepts->push(n);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -2816,6 +2835,9 @@ void PhaseIdealLoop::build_loop_early( VectorSet &visited, Node_List &worklist,
|
||||
is_deleteable_safept(n)) {
|
||||
Node *in = n->in(TypeFunc::Control);
|
||||
lazy_replace(n,in); // Pull safepoint now
|
||||
if (ilt->_safepts != NULL) {
|
||||
ilt->_safepts->yank(n);
|
||||
}
|
||||
// Carry on with the recursion "as if" we are walking
|
||||
// only the control input
|
||||
if( !visited.test_set( in->_idx ) ) {
|
||||
|
@ -336,6 +336,7 @@ public:
|
||||
_has_sfpt:1, // True if has non-call safepoint
|
||||
_rce_candidate:1; // True if candidate for range check elimination
|
||||
|
||||
Node_List* _safepts; // List of safepoints in this loop
|
||||
Node_List* _required_safept; // A inner loop cannot delete these safepts;
|
||||
bool _allow_optimizations; // Allow loop optimizations
|
||||
|
||||
@ -343,6 +344,7 @@ public:
|
||||
: _parent(0), _next(0), _child(0),
|
||||
_head(head), _tail(tail),
|
||||
_phase(phase),
|
||||
_safepts(NULL),
|
||||
_required_safept(NULL),
|
||||
_allow_optimizations(true),
|
||||
_nest(0), _irreducible(0), _has_call(0), _has_sfpt(0), _rce_candidate(0)
|
||||
|
@ -449,9 +449,12 @@ bool PhaseChaitin::prompt_use( Block *b, uint lidx ) {
|
||||
// USES: If USE is in HRP, split at use to leave main LRG on stack.
|
||||
// Else, hoist LRG back up to register only (ie - split is also DEF)
|
||||
// We will compute a new maxlrg as we go
|
||||
uint PhaseChaitin::Split( uint maxlrg ) {
|
||||
uint PhaseChaitin::Split(uint maxlrg, ResourceArea* split_arena) {
|
||||
NOT_PRODUCT( Compile::TracePhase t3("regAllocSplit", &_t_regAllocSplit, TimeCompiler); )
|
||||
|
||||
// Free thread local resources used by this method on exit.
|
||||
ResourceMark rm(split_arena);
|
||||
|
||||
uint bidx, pidx, slidx, insidx, inpidx, twoidx;
|
||||
uint non_phi = 1, spill_cnt = 0;
|
||||
Node **Reachblock;
|
||||
@ -461,14 +464,17 @@ uint PhaseChaitin::Split( uint maxlrg ) {
|
||||
bool u1, u2, u3;
|
||||
Block *b, *pred;
|
||||
PhiNode *phi;
|
||||
GrowableArray<uint> lidxs;
|
||||
GrowableArray<uint> lidxs(split_arena, _maxlrg, 0, 0);
|
||||
|
||||
// Array of counters to count splits per live range
|
||||
GrowableArray<uint> splits;
|
||||
GrowableArray<uint> splits(split_arena, _maxlrg, 0, 0);
|
||||
|
||||
#define NEW_SPLIT_ARRAY(type, size)\
|
||||
(type*) split_arena->allocate_bytes((size) * sizeof(type))
|
||||
|
||||
//----------Setup Code----------
|
||||
// Create a convenient mapping from lrg numbers to reaches/leaves indices
|
||||
uint *lrg2reach = NEW_RESOURCE_ARRAY( uint, _maxlrg );
|
||||
uint *lrg2reach = NEW_SPLIT_ARRAY( uint, _maxlrg );
|
||||
// Keep track of DEFS & Phis for later passes
|
||||
defs = new Node_List();
|
||||
phis = new Node_List();
|
||||
@ -500,15 +506,15 @@ uint PhaseChaitin::Split( uint maxlrg ) {
|
||||
// a Def is UP or DOWN. UP means that it should get a register (ie -
|
||||
// it is always in LRP regions), and DOWN means that it is probably
|
||||
// on the stack (ie - it crosses HRP regions).
|
||||
Node ***Reaches = NEW_RESOURCE_ARRAY( Node**, _cfg._num_blocks+1 );
|
||||
bool **UP = NEW_RESOURCE_ARRAY( bool*, _cfg._num_blocks+1 );
|
||||
Node **debug_defs = NEW_RESOURCE_ARRAY( Node*, spill_cnt );
|
||||
VectorSet **UP_entry= NEW_RESOURCE_ARRAY( VectorSet*, spill_cnt );
|
||||
Node ***Reaches = NEW_SPLIT_ARRAY( Node**, _cfg._num_blocks+1 );
|
||||
bool **UP = NEW_SPLIT_ARRAY( bool*, _cfg._num_blocks+1 );
|
||||
Node **debug_defs = NEW_SPLIT_ARRAY( Node*, spill_cnt );
|
||||
VectorSet **UP_entry= NEW_SPLIT_ARRAY( VectorSet*, spill_cnt );
|
||||
|
||||
// Initialize Reaches & UP
|
||||
for( bidx = 0; bidx < _cfg._num_blocks+1; bidx++ ) {
|
||||
Reaches[bidx] = NEW_RESOURCE_ARRAY( Node*, spill_cnt );
|
||||
UP[bidx] = NEW_RESOURCE_ARRAY( bool, spill_cnt );
|
||||
Reaches[bidx] = NEW_SPLIT_ARRAY( Node*, spill_cnt );
|
||||
UP[bidx] = NEW_SPLIT_ARRAY( bool, spill_cnt );
|
||||
Node **Reachblock = Reaches[bidx];
|
||||
bool *UPblock = UP[bidx];
|
||||
for( slidx = 0; slidx < spill_cnt; slidx++ ) {
|
||||
@ -517,9 +523,11 @@ uint PhaseChaitin::Split( uint maxlrg ) {
|
||||
}
|
||||
}
|
||||
|
||||
#undef NEW_SPLIT_ARRAY
|
||||
|
||||
// Initialize to array of empty vectorsets
|
||||
for( slidx = 0; slidx < spill_cnt; slidx++ )
|
||||
UP_entry[slidx] = new VectorSet(Thread::current()->resource_area());
|
||||
UP_entry[slidx] = new VectorSet(split_arena);
|
||||
|
||||
//----------PASS 1----------
|
||||
//----------Propagation & Node Insertion Code----------
|
||||
|
@ -880,46 +880,6 @@ JRT_LEAF(void, OptoRuntime::profile_receiver_type_C(DataLayout* data, oopDesc* r
|
||||
}
|
||||
JRT_END
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// implicit exception support.
|
||||
|
||||
static void report_null_exception_in_code_cache(address exception_pc) {
|
||||
ResourceMark rm;
|
||||
CodeBlob* n = CodeCache::find_blob(exception_pc);
|
||||
if (n != NULL) {
|
||||
tty->print_cr("#");
|
||||
tty->print_cr("# HotSpot Runtime Error, null exception in generated code");
|
||||
tty->print_cr("#");
|
||||
tty->print_cr("# pc where exception happened = " INTPTR_FORMAT, exception_pc);
|
||||
|
||||
if (n->is_nmethod()) {
|
||||
methodOop method = ((nmethod*)n)->method();
|
||||
tty->print_cr("# Method where it happened %s.%s ", Klass::cast(method->method_holder())->name()->as_C_string(), method->name()->as_C_string());
|
||||
tty->print_cr("#");
|
||||
if (ShowMessageBoxOnError && UpdateHotSpotCompilerFileOnError &&
|
||||
CompilerOracle::has_command_file()) {
|
||||
const char* title = "HotSpot Runtime Error";
|
||||
const char* question = "Do you want to exclude compilation of this method in future runs?";
|
||||
if (os::message_box(title, question)) {
|
||||
CompilerOracle::append_comment_to_file("");
|
||||
CompilerOracle::append_comment_to_file("Null exception in compiled code resulted in the following exclude");
|
||||
CompilerOracle::append_comment_to_file("");
|
||||
CompilerOracle::append_exclude_to_file(method);
|
||||
tty->print_cr("#");
|
||||
tty->print_cr("# %s has been updated to exclude the specified method", CompileCommandFile);
|
||||
tty->print_cr("#");
|
||||
}
|
||||
}
|
||||
fatal("Implicit null exception happened in compiled method");
|
||||
} else {
|
||||
n->print();
|
||||
fatal("Implicit null exception happened in generated stub");
|
||||
}
|
||||
}
|
||||
fatal("Implicit null exception at wrong place");
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------------------------------------------
|
||||
// register policy
|
||||
|
||||
|
@ -43,7 +43,6 @@
|
||||
#include "shark/shark_globals.hpp"
|
||||
#endif
|
||||
|
||||
|
||||
RUNTIME_FLAGS(MATERIALIZE_DEVELOPER_FLAG, MATERIALIZE_PD_DEVELOPER_FLAG, \
|
||||
MATERIALIZE_PRODUCT_FLAG, MATERIALIZE_PD_PRODUCT_FLAG, \
|
||||
MATERIALIZE_DIAGNOSTIC_FLAG, MATERIALIZE_EXPERIMENTAL_FLAG, \
|
||||
@ -55,6 +54,10 @@ RUNTIME_OS_FLAGS(MATERIALIZE_DEVELOPER_FLAG, MATERIALIZE_PD_DEVELOPER_FLAG, \
|
||||
MATERIALIZE_PRODUCT_FLAG, MATERIALIZE_PD_PRODUCT_FLAG, \
|
||||
MATERIALIZE_DIAGNOSTIC_FLAG, MATERIALIZE_NOTPRODUCT_FLAG)
|
||||
|
||||
ARCH_FLAGS(MATERIALIZE_DEVELOPER_FLAG, MATERIALIZE_PRODUCT_FLAG, \
|
||||
MATERIALIZE_DIAGNOSTIC_FLAG, MATERIALIZE_EXPERIMENTAL_FLAG, \
|
||||
MATERIALIZE_NOTPRODUCT_FLAG)
|
||||
|
||||
MATERIALIZE_FLAGS_EXT
|
||||
|
||||
|
||||
@ -212,7 +215,6 @@ void Flag::print_as_flag(outputStream* st) {
|
||||
#define C1_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, doc, "{C1 notproduct}", DEFAULT },
|
||||
#endif
|
||||
|
||||
|
||||
#define C2_PRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{C2 product}", DEFAULT },
|
||||
#define C2_PD_PRODUCT_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{C2 pd product}", DEFAULT },
|
||||
#define C2_DIAGNOSTIC_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{C2 diagnostic}", DEFAULT },
|
||||
@ -227,6 +229,17 @@ void Flag::print_as_flag(outputStream* st) {
|
||||
#define C2_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, doc, "{C2 notproduct}", DEFAULT },
|
||||
#endif
|
||||
|
||||
#define ARCH_PRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{ARCH product}", DEFAULT },
|
||||
#define ARCH_DIAGNOSTIC_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{ARCH diagnostic}", DEFAULT },
|
||||
#define ARCH_EXPERIMENTAL_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{ARCH experimental}", DEFAULT },
|
||||
#ifdef PRODUCT
|
||||
#define ARCH_DEVELOP_FLAG_STRUCT(type, name, value, doc) /* flag is constant */
|
||||
#define ARCH_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc)
|
||||
#else
|
||||
#define ARCH_DEVELOP_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, doc, "{ARCH}", DEFAULT },
|
||||
#define ARCH_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, doc, "{ARCH notproduct}", DEFAULT },
|
||||
#endif
|
||||
|
||||
#define SHARK_PRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{Shark product}", DEFAULT },
|
||||
#define SHARK_PD_PRODUCT_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{Shark pd product}", DEFAULT },
|
||||
#define SHARK_DIAGNOSTIC_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{Shark diagnostic}", DEFAULT },
|
||||
@ -255,6 +268,7 @@ static Flag flagTable[] = {
|
||||
#ifdef SHARK
|
||||
SHARK_FLAGS(SHARK_DEVELOP_FLAG_STRUCT, SHARK_PD_DEVELOP_FLAG_STRUCT, SHARK_PRODUCT_FLAG_STRUCT, SHARK_PD_PRODUCT_FLAG_STRUCT, SHARK_DIAGNOSTIC_FLAG_STRUCT, SHARK_NOTPRODUCT_FLAG_STRUCT)
|
||||
#endif
|
||||
ARCH_FLAGS(ARCH_DEVELOP_FLAG_STRUCT, ARCH_PRODUCT_FLAG_STRUCT, ARCH_DIAGNOSTIC_FLAG_STRUCT, ARCH_EXPERIMENTAL_FLAG_STRUCT, ARCH_NOTPRODUCT_FLAG_STRUCT)
|
||||
FLAGTABLE_EXT
|
||||
{0, NULL, NULL}
|
||||
};
|
||||
|
@ -530,12 +530,6 @@ class CommandLineFlags {
|
||||
product(intx, UseSSE, 99, \
|
||||
"Highest supported SSE instructions set on x86/x64") \
|
||||
\
|
||||
product(intx, UseAVX, 99, \
|
||||
"Highest supported AVX instructions set on x86/x64") \
|
||||
\
|
||||
product(intx, UseVIS, 99, \
|
||||
"Highest supported VIS instructions set on Sparc") \
|
||||
\
|
||||
product(uintx, LargePageSizeInBytes, 0, \
|
||||
"Large page size (0 to let VM choose the page size") \
|
||||
\
|
||||
@ -572,10 +566,6 @@ class CommandLineFlags {
|
||||
product(bool, PrintVMQWaitTime, false, \
|
||||
"Prints out the waiting time in VM operation queue") \
|
||||
\
|
||||
develop(bool, BailoutToInterpreterForThrows, false, \
|
||||
"Compiled methods which throws/catches exceptions will be " \
|
||||
"deopt and intp.") \
|
||||
\
|
||||
develop(bool, NoYieldsInMicrolock, false, \
|
||||
"Disable yields in microlock") \
|
||||
\
|
||||
@ -618,9 +608,6 @@ class CommandLineFlags {
|
||||
"inline Object::hashCode() native that is known to be part " \
|
||||
"of base library DLL") \
|
||||
\
|
||||
develop(bool, InlineObjectCopy, true, \
|
||||
"inline Object.clone and Arrays.copyOf[Range] intrinsics") \
|
||||
\
|
||||
develop(bool, InlineNatives, true, \
|
||||
"inline natives that are known to be part of base library DLL") \
|
||||
\
|
||||
@ -633,31 +620,9 @@ class CommandLineFlags {
|
||||
develop(bool, InlineThreadNatives, true, \
|
||||
"inline Thread.currentThread, etc") \
|
||||
\
|
||||
develop(bool, InlineReflectionGetCallerClass, true, \
|
||||
"inline sun.reflect.Reflection.getCallerClass(), known to be part "\
|
||||
"of base library DLL") \
|
||||
\
|
||||
develop(bool, InlineUnsafeOps, true, \
|
||||
"inline memory ops (native methods) from sun.misc.Unsafe") \
|
||||
\
|
||||
develop(bool, ConvertCmpD2CmpF, true, \
|
||||
"Convert cmpD to cmpF when one input is constant in float range") \
|
||||
\
|
||||
develop(bool, ConvertFloat2IntClipping, true, \
|
||||
"Convert float2int clipping idiom to integer clipping") \
|
||||
\
|
||||
develop(bool, SpecialStringCompareTo, true, \
|
||||
"special version of string compareTo") \
|
||||
\
|
||||
develop(bool, SpecialStringIndexOf, true, \
|
||||
"special version of string indexOf") \
|
||||
\
|
||||
develop(bool, SpecialStringEquals, true, \
|
||||
"special version of string equals") \
|
||||
\
|
||||
develop(bool, SpecialArraysEquals, true, \
|
||||
"special version of Arrays.equals(char[],char[])") \
|
||||
\
|
||||
product(bool, CriticalJNINatives, true, \
|
||||
"check for critical JNI entry points") \
|
||||
\
|
||||
@ -667,9 +632,6 @@ class CommandLineFlags {
|
||||
product(bool, UseSSE42Intrinsics, false, \
|
||||
"SSE4.2 versions of intrinsics") \
|
||||
\
|
||||
product(bool, UseCondCardMark, false, \
|
||||
"Check for already marked card before updating card table") \
|
||||
\
|
||||
develop(bool, TraceCallFixup, false, \
|
||||
"traces all call fixups") \
|
||||
\
|
||||
@ -756,9 +718,6 @@ class CommandLineFlags {
|
||||
develop(bool, ForceFloatExceptions, trueInDebug, \
|
||||
"Force exceptions on FP stack under/overflow") \
|
||||
\
|
||||
develop(bool, SoftMatchFailure, trueInProduct, \
|
||||
"If the DFA fails to match a node, print a message and bail out") \
|
||||
\
|
||||
develop(bool, VerifyStackAtCalls, false, \
|
||||
"Verify that the stack pointer is unchanged after calls") \
|
||||
\
|
||||
@ -915,15 +874,6 @@ class CommandLineFlags {
|
||||
"1: allow scavenging from the code cache; " \
|
||||
"2: emit as many constants as the compiler can see") \
|
||||
\
|
||||
diagnostic(bool, TraceOSRBreakpoint, false, \
|
||||
"Trace OSR Breakpoint ") \
|
||||
\
|
||||
diagnostic(bool, TraceCompileTriggered, false, \
|
||||
"Trace compile triggered") \
|
||||
\
|
||||
diagnostic(bool, TraceTriggers, false, \
|
||||
"Trace triggers") \
|
||||
\
|
||||
product(bool, AlwaysRestoreFPU, false, \
|
||||
"Restore the FPU control word after every JNI call (expensive)") \
|
||||
\
|
||||
@ -1037,9 +987,6 @@ class CommandLineFlags {
|
||||
develop(bool, UsePrivilegedStack, true, \
|
||||
"Enable the security JVM functions") \
|
||||
\
|
||||
develop(bool, IEEEPrecision, true, \
|
||||
"Enables IEEE precision (for INTEL only)") \
|
||||
\
|
||||
develop(bool, ProtectionDomainVerification, true, \
|
||||
"Verifies protection domain before resolution in system " \
|
||||
"dictionary") \
|
||||
@ -1109,8 +1056,6 @@ class CommandLineFlags {
|
||||
"(Unsafe,Unstable) " \
|
||||
" Controls emission of inline sync fast-path code") \
|
||||
\
|
||||
product(intx, AlwaysInflate, 0, "(Unstable) Force inflation") \
|
||||
\
|
||||
product(intx, MonitorBound, 0, "Bound Monitor population") \
|
||||
\
|
||||
product(bool, MonitorInUseLists, false, "Track Monitors for Deflation") \
|
||||
@ -1118,9 +1063,6 @@ class CommandLineFlags {
|
||||
product(intx, Atomics, 0, \
|
||||
"(Unsafe,Unstable) Diagnostic - Controls emission of atomics") \
|
||||
\
|
||||
product(intx, FenceInstruction, 0, \
|
||||
"(Unsafe,Unstable) Experimental") \
|
||||
\
|
||||
product(intx, SyncFlags, 0, "(Unsafe,Unstable) Experimental Sync flags" ) \
|
||||
\
|
||||
product(intx, SyncVerbose, 0, "(Unstable)" ) \
|
||||
@ -1150,10 +1092,6 @@ class CommandLineFlags {
|
||||
"call thr_setconcurrency at thread create time to avoid " \
|
||||
"LWP starvation on MP systems (For Solaris Only)") \
|
||||
\
|
||||
develop(bool, UpdateHotSpotCompilerFileOnError, true, \
|
||||
"Should the system attempt to update the compiler file when " \
|
||||
"an error occurs?") \
|
||||
\
|
||||
product(bool, ReduceSignalUsage, false, \
|
||||
"Reduce the use of OS signals in Java and/or the VM") \
|
||||
\
|
||||
@ -1188,15 +1126,6 @@ class CommandLineFlags {
|
||||
"Use alternate signals instead of SIGUSR1 & SIGUSR2 for VM " \
|
||||
"internal signals (Solaris only)") \
|
||||
\
|
||||
product(bool, UseSpinning, false, \
|
||||
"Use spinning in monitor inflation and before entry") \
|
||||
\
|
||||
product(bool, PreSpinYield, false, \
|
||||
"Yield before inner spinning loop") \
|
||||
\
|
||||
product(bool, PostSpinYield, true, \
|
||||
"Yield after inner spinning loop") \
|
||||
\
|
||||
product(bool, AllowJNIEnvProxy, false, \
|
||||
"Allow JNIEnv proxies for jdbx") \
|
||||
\
|
||||
@ -1225,39 +1154,9 @@ class CommandLineFlags {
|
||||
product(bool, LazyBootClassLoader, true, \
|
||||
"Enable/disable lazy opening of boot class path entries") \
|
||||
\
|
||||
diagnostic(bool, UseIncDec, true, \
|
||||
"Use INC, DEC instructions on x86") \
|
||||
\
|
||||
product(bool, UseNewLongLShift, false, \
|
||||
"Use optimized bitwise shift left") \
|
||||
\
|
||||
product(bool, UseStoreImmI16, true, \
|
||||
"Use store immediate 16-bits value instruction on x86") \
|
||||
\
|
||||
product(bool, UseAddressNop, false, \
|
||||
"Use '0F 1F [addr]' NOP instructions on x86 cpus") \
|
||||
\
|
||||
product(bool, UseXmmLoadAndClearUpper, true, \
|
||||
"Load low part of XMM register and clear upper part") \
|
||||
\
|
||||
product(bool, UseXmmRegToRegMoveAll, false, \
|
||||
"Copy all XMM register bits when moving value between registers") \
|
||||
\
|
||||
product(bool, UseXmmI2D, false, \
|
||||
"Use SSE2 CVTDQ2PD instruction to convert Integer to Double") \
|
||||
\
|
||||
product(bool, UseXmmI2F, false, \
|
||||
"Use SSE2 CVTDQ2PS instruction to convert Integer to Float") \
|
||||
\
|
||||
product(bool, UseXMMForArrayCopy, false, \
|
||||
"Use SSE2 MOVQ instruction for Arraycopy") \
|
||||
\
|
||||
product(bool, UseUnalignedLoadStores, false, \
|
||||
"Use SSE2 MOVDQU instruction for Arraycopy") \
|
||||
\
|
||||
product(bool, UseCBCond, false, \
|
||||
"Use compare and branch instruction on SPARC") \
|
||||
\
|
||||
product(intx, FieldsAllocationStyle, 1, \
|
||||
"0 - type based with oops first, 1 - with oops last, " \
|
||||
"2 - oops in super and sub classes are together") \
|
||||
@ -1387,9 +1286,6 @@ class CommandLineFlags {
|
||||
develop(bool, TraceStartupTime, false, \
|
||||
"Trace setup time") \
|
||||
\
|
||||
product(ccstr, HPILibPath, NULL, \
|
||||
"Specify alternate path to HPI library") \
|
||||
\
|
||||
develop(bool, TraceProtectionDomainVerification, false, \
|
||||
"Trace protection domain verifcation") \
|
||||
\
|
||||
@ -1405,10 +1301,6 @@ class CommandLineFlags {
|
||||
product(bool, TraceMonitorInflation, false, \
|
||||
"Trace monitor inflation in JVM") \
|
||||
\
|
||||
/* assembler */ \
|
||||
product(bool, Use486InstrsOnly, false, \
|
||||
"Use 80486 Compliant instruction subset") \
|
||||
\
|
||||
/* gc */ \
|
||||
\
|
||||
product(bool, UseSerialGC, false, \
|
||||
@ -1467,9 +1359,6 @@ class CommandLineFlags {
|
||||
develop(uintx, ParallelOldGCSplitInterval, 3, \
|
||||
"How often to provoke splitting a young gen space") \
|
||||
\
|
||||
develop(bool, TraceRegionTasksQueuing, false, \
|
||||
"Trace the queuing of the region tasks") \
|
||||
\
|
||||
product(uintx, ConcGCThreads, 0, \
|
||||
"Number of threads concurrent gc will use") \
|
||||
\
|
||||
@ -1621,10 +1510,6 @@ class CommandLineFlags {
|
||||
"The gain in the feedback loop for on-the-fly PLAB resizing" \
|
||||
" during a scavenge") \
|
||||
\
|
||||
product(uintx, CMSOldPLABReactivityCeiling, 10, \
|
||||
"The clamping of the gain in the feedback loop for on-the-fly" \
|
||||
" PLAB resizing during a scavenge") \
|
||||
\
|
||||
product(bool, AlwaysPreTouch, false, \
|
||||
"It forces all freshly committed pages to be pre-touched.") \
|
||||
\
|
||||
@ -1632,12 +1517,6 @@ class CommandLineFlags {
|
||||
"The maximum size of young gen chosen by default per GC worker " \
|
||||
"thread available") \
|
||||
\
|
||||
product(bool, GCOverheadReporting, false, \
|
||||
"Enables the GC overhead reporting facility") \
|
||||
\
|
||||
product(intx, GCOverheadReportingPeriodMS, 100, \
|
||||
"Reporting period for conc GC overhead reporting, in ms ") \
|
||||
\
|
||||
product(bool, CMSIncrementalMode, false, \
|
||||
"Whether CMS GC should operate in \"incremental\" mode") \
|
||||
\
|
||||
@ -2017,9 +1896,6 @@ class CommandLineFlags {
|
||||
experimental(uintx, WorkStealingSpinToYieldRatio, 10, \
|
||||
"Ratio of hard spins to calls to yield") \
|
||||
\
|
||||
product(uintx, PreserveMarkStackSize, 1024, \
|
||||
"Size for stack used in promotion failure handling") \
|
||||
\
|
||||
develop(uintx, ObjArrayMarkingStride, 512, \
|
||||
"Number of ObjArray elements to push onto the marking stack" \
|
||||
"before pushing a continuation entry") \
|
||||
@ -2044,18 +1920,6 @@ class CommandLineFlags {
|
||||
product(bool, TLABStats, true, \
|
||||
"Print various TLAB related information") \
|
||||
\
|
||||
product(bool, UseBlockZeroing, false, \
|
||||
"Use special cpu instructions for block zeroing") \
|
||||
\
|
||||
product(intx, BlockZeroingLowLimit, 2048, \
|
||||
"Minimum size in bytes when block zeroing will be used") \
|
||||
\
|
||||
product(bool, UseBlockCopy, false, \
|
||||
"Use special cpu instructions for block copy") \
|
||||
\
|
||||
product(intx, BlockCopyLowLimit, 2048, \
|
||||
"Minimum size in bytes when block copy will be used") \
|
||||
\
|
||||
product(bool, PrintRevisitStats, false, \
|
||||
"Print revisit (klass and MDO) stack related information") \
|
||||
\
|
||||
@ -2248,9 +2112,6 @@ class CommandLineFlags {
|
||||
product(intx, PrefetchFieldsAhead, -1, \
|
||||
"How many fields ahead to prefetch in oop scan (<= 0 means off)") \
|
||||
\
|
||||
develop(bool, UsePrefetchQueue, true, \
|
||||
"Use the prefetch queue during PS promotion") \
|
||||
\
|
||||
diagnostic(bool, VerifyBeforeExit, trueInDebug, \
|
||||
"Verify system before exiting") \
|
||||
\
|
||||
@ -2486,27 +2347,9 @@ class CommandLineFlags {
|
||||
develop(bool, CITraceTypeFlow, false, \
|
||||
"detailed per-bytecode tracing of ciTypeFlow analysis") \
|
||||
\
|
||||
develop(intx, CICloneLoopTestLimit, 100, \
|
||||
"size limit for blocks heuristically cloned in ciTypeFlow") \
|
||||
\
|
||||
develop(intx, OSROnlyBCI, -1, \
|
||||
"OSR only at this bci. Negative values mean exclude that bci") \
|
||||
\
|
||||
/* temp diagnostics */ \
|
||||
\
|
||||
diagnostic(bool, TraceRedundantCompiles, false, \
|
||||
"Have compile broker print when a request already in the queue is"\
|
||||
" requested again") \
|
||||
\
|
||||
diagnostic(bool, InitialCompileFast, false, \
|
||||
"Initial compile at CompLevel_fast_compile") \
|
||||
\
|
||||
diagnostic(bool, InitialCompileReallyFast, false, \
|
||||
"Initial compile at CompLevel_really_fast_compile (no profile)") \
|
||||
\
|
||||
diagnostic(bool, FullProfileOnReInterpret, true, \
|
||||
"On re-interpret unc-trap compile next at CompLevel_fast_compile")\
|
||||
\
|
||||
/* compiler */ \
|
||||
\
|
||||
product(intx, CICompilerCount, CI_COMPILER_COUNT, \
|
||||
@ -2520,12 +2363,6 @@ class CommandLineFlags {
|
||||
"proper StackOverflow handling; disable only to measure cost " \
|
||||
"of stackbanging)") \
|
||||
\
|
||||
develop(bool, Use24BitFPMode, true, \
|
||||
"Set 24-bit FPU mode on a per-compile basis ") \
|
||||
\
|
||||
develop(bool, Use24BitFP, true, \
|
||||
"use FP instructions that produce 24-bit precise results") \
|
||||
\
|
||||
develop(bool, UseStrictFP, true, \
|
||||
"use strict fp if modifier strictfp is set") \
|
||||
\
|
||||
@ -2557,9 +2394,6 @@ class CommandLineFlags {
|
||||
"print the break down of clean up tasks performed during" \
|
||||
" safepoint") \
|
||||
\
|
||||
develop(bool, InlineAccessors, true, \
|
||||
"inline accessor methods (get/set)") \
|
||||
\
|
||||
product(bool, Inline, true, \
|
||||
"enable inlining") \
|
||||
\
|
||||
@ -2572,33 +2406,15 @@ class CommandLineFlags {
|
||||
product(bool, UseTypeProfile, true, \
|
||||
"Check interpreter profile for historically monomorphic calls") \
|
||||
\
|
||||
product(intx, TypeProfileMajorReceiverPercent, 90, \
|
||||
"% of major receiver type to all profiled receivers") \
|
||||
\
|
||||
notproduct(bool, TimeCompiler, false, \
|
||||
"time the compiler") \
|
||||
\
|
||||
notproduct(bool, TimeCompiler2, false, \
|
||||
"detailed time the compiler (requires +TimeCompiler)") \
|
||||
\
|
||||
diagnostic(bool, PrintInlining, false, \
|
||||
"prints inlining optimizations") \
|
||||
\
|
||||
diagnostic(bool, PrintIntrinsics, false, \
|
||||
"prints attempted and successful inlining of intrinsics") \
|
||||
\
|
||||
product(bool, UseCountLeadingZerosInstruction, false, \
|
||||
"Use count leading zeros instruction") \
|
||||
\
|
||||
product(bool, UsePopCountInstruction, false, \
|
||||
"Use population count instruction") \
|
||||
\
|
||||
diagnostic(ccstrlist, DisableIntrinsic, "", \
|
||||
"do not expand intrinsics whose (internal) names appear here") \
|
||||
\
|
||||
develop(bool, StressReflectiveCode, false, \
|
||||
"Use inexact types at allocations, etc., to test reflection") \
|
||||
\
|
||||
develop(bool, EagerInitialization, false, \
|
||||
"Eagerly initialize classes if possible") \
|
||||
\
|
||||
@ -2608,10 +2424,6 @@ class CommandLineFlags {
|
||||
develop(bool, PrintMethodFlushing, false, \
|
||||
"print the nmethods being flushed") \
|
||||
\
|
||||
notproduct(bool, LogMultipleMutexLocking, false, \
|
||||
"log locking and unlocking of mutexes (only if multiple locks " \
|
||||
"are held)") \
|
||||
\
|
||||
develop(bool, UseRelocIndex, false, \
|
||||
"use an index to speed random access to relocations") \
|
||||
\
|
||||
@ -2621,9 +2433,6 @@ class CommandLineFlags {
|
||||
diagnostic(bool, DebugNonSafepoints, trueInDebug, \
|
||||
"Generate extra debugging info for non-safepoints in nmethods") \
|
||||
\
|
||||
diagnostic(bool, DebugInlinedCalls, true, \
|
||||
"If false, restricts profiled locations to the root method only") \
|
||||
\
|
||||
product(bool, PrintVMOptions, false, \
|
||||
"Print flags that appeared on the command line") \
|
||||
\
|
||||
@ -2700,9 +2509,6 @@ class CommandLineFlags {
|
||||
notproduct(bool, IgnoreLockingAssertions, false, \
|
||||
"disable locking assertions (for speed)") \
|
||||
\
|
||||
notproduct(bool, VerifyLoopOptimizations, false, \
|
||||
"verify major loop optimizations") \
|
||||
\
|
||||
product(bool, RangeCheckElimination, true, \
|
||||
"Split loop iterations to eliminate range checks") \
|
||||
\
|
||||
@ -2712,12 +2518,6 @@ class CommandLineFlags {
|
||||
develop(bool, TypeProfileCasts, true, \
|
||||
"treat casts like calls for purposes of type profiling") \
|
||||
\
|
||||
develop(bool, MonomorphicArrayCheck, true, \
|
||||
"Uncommon-trap array store checks that require full type check") \
|
||||
\
|
||||
diagnostic(bool, ProfileDynamicTypes, true, \
|
||||
"do extra type profiling and use it more aggressively") \
|
||||
\
|
||||
develop(bool, DelayCompilationDuringStartup, true, \
|
||||
"Delay invoking the compiler until main application class is " \
|
||||
"loaded") \
|
||||
@ -2732,19 +2532,9 @@ class CommandLineFlags {
|
||||
notproduct(intx, CompileTheWorldSafepointInterval, 100, \
|
||||
"Force a safepoint every n compiles so sweeper can keep up") \
|
||||
\
|
||||
develop(bool, TraceIterativeGVN, false, \
|
||||
"Print progress during Iterative Global Value Numbering") \
|
||||
\
|
||||
develop(bool, FillDelaySlots, true, \
|
||||
"Fill delay slots (on SPARC only)") \
|
||||
\
|
||||
develop(bool, VerifyIterativeGVN, false, \
|
||||
"Verify Def-Use modifications during sparse Iterative Global " \
|
||||
"Value Numbering") \
|
||||
\
|
||||
notproduct(bool, TracePhaseCCP, false, \
|
||||
"Print progress during Conditional Constant Propagation") \
|
||||
\
|
||||
develop(bool, TimeLivenessAnalysis, false, \
|
||||
"Time computation of bytecode liveness analysis") \
|
||||
\
|
||||
@ -2757,22 +2547,9 @@ class CommandLineFlags {
|
||||
notproduct(bool, CollectIndexSetStatistics, false, \
|
||||
"Collect information about IndexSets") \
|
||||
\
|
||||
develop(bool, PrintDominators, false, \
|
||||
"Print out dominator trees for GVN") \
|
||||
\
|
||||
develop(bool, UseLoopSafepoints, true, \
|
||||
"Generate Safepoint nodes in every loop") \
|
||||
\
|
||||
notproduct(bool, TraceCISCSpill, false, \
|
||||
"Trace allocators use of cisc spillable instructions") \
|
||||
\
|
||||
notproduct(bool, TraceSpilling, false, \
|
||||
"Trace spilling") \
|
||||
\
|
||||
product(bool, SplitIfBlocks, true, \
|
||||
"Clone compares and control flow through merge points to fold " \
|
||||
"some branches") \
|
||||
\
|
||||
develop(intx, FastAllocateSizeLimit, 128*K, \
|
||||
/* Note: This value is zero mod 1<<13 for a cheap sparc set. */ \
|
||||
"Inline allocations larger than this in doublewords must go slow")\
|
||||
@ -2829,15 +2606,6 @@ class CommandLineFlags {
|
||||
develop(bool, UseFastSignatureHandlers, true, \
|
||||
"Use fast signature handlers for native calls") \
|
||||
\
|
||||
develop(bool, UseV8InstrsOnly, false, \
|
||||
"Use SPARC-V8 Compliant instruction subset") \
|
||||
\
|
||||
product(bool, UseNiagaraInstrs, false, \
|
||||
"Use Niagara-efficient instruction subset") \
|
||||
\
|
||||
develop(bool, UseCASForSwap, false, \
|
||||
"Do not use swap instructions, but only CAS (in a loop) on SPARC")\
|
||||
\
|
||||
product(bool, UseLoopCounter, true, \
|
||||
"Increment invocation counter on backward branch") \
|
||||
\
|
||||
@ -2854,9 +2622,6 @@ class CommandLineFlags {
|
||||
notproduct(bool, TraceOnStackReplacement, false, \
|
||||
"Trace on stack replacement") \
|
||||
\
|
||||
develop(bool, PoisonOSREntry, true, \
|
||||
"Detect abnormal calls to OSR code") \
|
||||
\
|
||||
product_pd(bool, PreferInterpreterNativeStubs, \
|
||||
"Use always interpreter stubs for native methods invoked via " \
|
||||
"interpreter") \
|
||||
@ -2899,9 +2664,6 @@ class CommandLineFlags {
|
||||
develop(bool, TraceFrequencyInlining, false, \
|
||||
"Trace frequency based inlining") \
|
||||
\
|
||||
notproduct(bool, TraceTypeProfile, false, \
|
||||
"Trace type profile") \
|
||||
\
|
||||
develop_pd(bool, InlineIntrinsics, \
|
||||
"Inline intrinsics that can be statically resolved") \
|
||||
\
|
||||
@ -2989,15 +2751,6 @@ class CommandLineFlags {
|
||||
product(intx, AllocatePrefetchInstr, 0, \
|
||||
"Prefetch instruction to prefetch ahead of allocation pointer") \
|
||||
\
|
||||
product(intx, ReadPrefetchInstr, 0, \
|
||||
"Prefetch instruction to prefetch ahead") \
|
||||
\
|
||||
product(uintx, ArraycopySrcPrefetchDistance, 0, \
|
||||
"Distance to prefetch source array in arracopy") \
|
||||
\
|
||||
product(uintx, ArraycopyDstPrefetchDistance, 0, \
|
||||
"Distance to prefetch destination array in arracopy") \
|
||||
\
|
||||
/* deoptimization */ \
|
||||
develop(bool, TraceDeoptimization, false, \
|
||||
"Trace deoptimization") \
|
||||
@ -3088,9 +2841,6 @@ class CommandLineFlags {
|
||||
product(intx, MinInliningThreshold, 250, \
|
||||
"min. invocation count a method needs to have to be inlined") \
|
||||
\
|
||||
develop(intx, AlignEntryCode, 4, \
|
||||
"aligns entry code to specified value (in bytes)") \
|
||||
\
|
||||
develop(intx, MethodHistogramCutoff, 100, \
|
||||
"cutoff value for method invoc. histogram (+CountCalls)") \
|
||||
\
|
||||
@ -3130,9 +2880,6 @@ class CommandLineFlags {
|
||||
"Minimum sleep() interval (milliseconds) when " \
|
||||
"ConvertSleepToYield is off (used for SOLARIS)") \
|
||||
\
|
||||
product(intx, EventLogLength, 2000, \
|
||||
"maximum nof events in event log") \
|
||||
\
|
||||
develop(intx, ProfilerPCTickThreshold, 15, \
|
||||
"Number of ticks in a PC buckets to be a hotspot") \
|
||||
\
|
||||
@ -3171,9 +2918,6 @@ class CommandLineFlags {
|
||||
product(intx, PerBytecodeTrapLimit, 4, \
|
||||
"Limit on traps (of one kind) at a particular BCI") \
|
||||
\
|
||||
develop(intx, FreqCountInvocations, 1, \
|
||||
"Scaling factor for branch frequencies (deprecated)") \
|
||||
\
|
||||
develop(intx, InlineFrequencyRatio, 20, \
|
||||
"Ratio of call site execution to caller method invocation") \
|
||||
\
|
||||
@ -3187,29 +2931,12 @@ class CommandLineFlags {
|
||||
develop(intx, InlineThrowMaxSize, 200, \
|
||||
"Force inlining of throwing methods smaller than this") \
|
||||
\
|
||||
product(intx, AliasLevel, 3, \
|
||||
"0 for no aliasing, 1 for oop/field/static/array split, " \
|
||||
"2 for class split, 3 for unique instances") \
|
||||
\
|
||||
develop(bool, VerifyAliases, false, \
|
||||
"perform extra checks on the results of alias analysis") \
|
||||
\
|
||||
develop(intx, ProfilerNodeSize, 1024, \
|
||||
"Size in K to allocate for the Profile Nodes of each thread") \
|
||||
\
|
||||
develop(intx, V8AtomicOperationUnderLockSpinCount, 50, \
|
||||
"Number of times to spin wait on a v8 atomic operation lock") \
|
||||
\
|
||||
product(intx, ReadSpinIterations, 100, \
|
||||
"Number of read attempts before a yield (spin inner loop)") \
|
||||
\
|
||||
product_pd(intx, PreInflateSpin, \
|
||||
"Number of times to spin wait before inflation") \
|
||||
\
|
||||
product(intx, PreBlockSpin, 10, \
|
||||
"Number of times to spin in an inflated lock before going to " \
|
||||
"an OS lock") \
|
||||
\
|
||||
/* gc parameters */ \
|
||||
product(uintx, InitialHeapSize, 0, \
|
||||
"Initial heap size (in bytes); zero means OldSize + NewSize") \
|
||||
@ -3466,10 +3193,6 @@ class CommandLineFlags {
|
||||
"(non-negative value throws OOM after this many CI accesses " \
|
||||
"in each compile)") \
|
||||
\
|
||||
develop(intx, CIFireOOMAtDelay, -1, \
|
||||
"Wait for this many CI accesses to occur in all compiles before " \
|
||||
"beginning to throw OutOfMemoryErrors in each compile") \
|
||||
\
|
||||
notproduct(bool, CIObjectFactoryVerify, false, \
|
||||
"enable potentially expensive verification in ciObjectFactory") \
|
||||
\
|
||||
@ -3663,9 +3386,6 @@ class CommandLineFlags {
|
||||
product(bool, PrintTieredEvents, false, \
|
||||
"Print tiered events notifications") \
|
||||
\
|
||||
product(bool, StressTieredRuntime, false, \
|
||||
"Alternate client and server compiler on compile requests") \
|
||||
\
|
||||
product_pd(intx, OnStackReplacePercentage, \
|
||||
"NON_TIERED number of method invocations/branches (expressed as %"\
|
||||
"of CompileThreshold) before (re-)compiling OSR code") \
|
||||
@ -3835,9 +3555,6 @@ class CommandLineFlags {
|
||||
"support JSR 292 (method handles, invokedynamic, " \
|
||||
"anonymous classes") \
|
||||
\
|
||||
product(bool, AnonymousClasses, false, \
|
||||
"support sun.misc.Unsafe.defineAnonymousClass (deprecated)") \
|
||||
\
|
||||
diagnostic(bool, PrintMethodHandleStubs, false, \
|
||||
"Print generated stub code for method handles") \
|
||||
\
|
||||
@ -3952,6 +3669,8 @@ RUNTIME_FLAGS(DECLARE_DEVELOPER_FLAG, DECLARE_PD_DEVELOPER_FLAG, DECLARE_PRODUCT
|
||||
|
||||
RUNTIME_OS_FLAGS(DECLARE_DEVELOPER_FLAG, DECLARE_PD_DEVELOPER_FLAG, DECLARE_PRODUCT_FLAG, DECLARE_PD_PRODUCT_FLAG, DECLARE_DIAGNOSTIC_FLAG, DECLARE_NOTPRODUCT_FLAG)
|
||||
|
||||
ARCH_FLAGS(DECLARE_DEVELOPER_FLAG, DECLARE_PRODUCT_FLAG, DECLARE_DIAGNOSTIC_FLAG, DECLARE_EXPERIMENTAL_FLAG, DECLARE_NOTPRODUCT_FLAG)
|
||||
|
||||
// Extensions
|
||||
|
||||
#include "runtime/globals_ext.hpp"
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 2012, 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
|
||||
@ -66,7 +66,6 @@
|
||||
#define C1_NOTPRODUCT_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
|
||||
#endif
|
||||
|
||||
|
||||
#define C2_PRODUCT_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
|
||||
#define C2_PD_PRODUCT_FLAG_MEMBER(type, name, doc) FLAG_MEMBER(name),
|
||||
#define C2_DIAGNOSTIC_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
|
||||
@ -81,6 +80,17 @@
|
||||
#define C2_NOTPRODUCT_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
|
||||
#endif
|
||||
|
||||
#define ARCH_PRODUCT_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
|
||||
#define ARCH_DIAGNOSTIC_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
|
||||
#define ARCH_EXPERIMENTAL_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
|
||||
#ifdef PRODUCT
|
||||
#define ARCH_DEVELOP_FLAG_MEMBER(type, name, value, doc) /* flag is constant */
|
||||
#define ARCH_NOTPRODUCT_FLAG_MEMBER(type, name, value, doc)
|
||||
#else
|
||||
#define ARCH_DEVELOP_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
|
||||
#define ARCH_NOTPRODUCT_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
|
||||
#endif
|
||||
|
||||
typedef enum {
|
||||
RUNTIME_FLAGS(RUNTIME_DEVELOP_FLAG_MEMBER, RUNTIME_PD_DEVELOP_FLAG_MEMBER, RUNTIME_PRODUCT_FLAG_MEMBER, RUNTIME_PD_PRODUCT_FLAG_MEMBER, RUNTIME_DIAGNOSTIC_FLAG_MEMBER, RUNTIME_EXPERIMENTAL_FLAG_MEMBER, RUNTIME_NOTPRODUCT_FLAG_MEMBER, RUNTIME_MANAGEABLE_FLAG_MEMBER, RUNTIME_PRODUCT_RW_FLAG_MEMBER, RUNTIME_LP64_PRODUCT_FLAG_MEMBER)
|
||||
RUNTIME_OS_FLAGS(RUNTIME_DEVELOP_FLAG_MEMBER, RUNTIME_PD_DEVELOP_FLAG_MEMBER, RUNTIME_PRODUCT_FLAG_MEMBER, RUNTIME_PD_PRODUCT_FLAG_MEMBER, RUNTIME_DIAGNOSTIC_FLAG_MEMBER, RUNTIME_NOTPRODUCT_FLAG_MEMBER)
|
||||
@ -93,6 +103,7 @@ typedef enum {
|
||||
#ifdef COMPILER2
|
||||
C2_FLAGS(C2_DEVELOP_FLAG_MEMBER, C2_PD_DEVELOP_FLAG_MEMBER, C2_PRODUCT_FLAG_MEMBER, C2_PD_PRODUCT_FLAG_MEMBER, C2_DIAGNOSTIC_FLAG_MEMBER, C2_EXPERIMENTAL_FLAG_MEMBER, C2_NOTPRODUCT_FLAG_MEMBER)
|
||||
#endif
|
||||
ARCH_FLAGS(ARCH_DEVELOP_FLAG_MEMBER, ARCH_PRODUCT_FLAG_MEMBER, ARCH_DIAGNOSTIC_FLAG_MEMBER, ARCH_EXPERIMENTAL_FLAG_MEMBER, ARCH_NOTPRODUCT_FLAG_MEMBER)
|
||||
COMMANDLINEFLAG_EXT
|
||||
NUM_CommandLineFlag
|
||||
} CommandLineFlag;
|
||||
@ -134,7 +145,6 @@ typedef enum {
|
||||
#define RUNTIME_LP64_PRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) /* flag is constant */
|
||||
#endif // _LP64
|
||||
|
||||
|
||||
#define C2_PRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
|
||||
#define C2_PD_PRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, doc) FLAG_MEMBER_WITH_TYPE(name,type),
|
||||
#define C2_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
|
||||
@ -149,6 +159,17 @@ typedef enum {
|
||||
#define C2_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
|
||||
#endif
|
||||
|
||||
#define ARCH_PRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
|
||||
#define ARCH_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
|
||||
#define ARCH_EXPERIMENTAL_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
|
||||
#ifdef PRODUCT
|
||||
#define ARCH_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) /* flag is constant */
|
||||
#define ARCH_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc)
|
||||
#else
|
||||
#define ARCH_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
|
||||
#define ARCH_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
|
||||
#endif
|
||||
|
||||
typedef enum {
|
||||
RUNTIME_FLAGS(RUNTIME_DEVELOP_FLAG_MEMBER_WITH_TYPE,
|
||||
RUNTIME_PD_DEVELOP_FLAG_MEMBER_WITH_TYPE,
|
||||
@ -193,6 +214,11 @@ typedef enum {
|
||||
C2_EXPERIMENTAL_FLAG_MEMBER_WITH_TYPE,
|
||||
C2_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE)
|
||||
#endif
|
||||
ARCH_FLAGS(ARCH_DEVELOP_FLAG_MEMBER_WITH_TYPE,
|
||||
ARCH_PRODUCT_FLAG_MEMBER_WITH_TYPE,
|
||||
ARCH_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE,
|
||||
ARCH_EXPERIMENTAL_FLAG_MEMBER_WITH_TYPE,
|
||||
ARCH_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE)
|
||||
COMMANDLINEFLAGWITHTYPE_EXT
|
||||
NUM_CommandLineFlagWithType
|
||||
} CommandLineFlagWithType;
|
||||
|
@ -31,6 +31,11 @@ case "$OS" in
|
||||
PS=";"
|
||||
FS="\\"
|
||||
;;
|
||||
CYGWIN_* )
|
||||
NULL=/dev/null
|
||||
PS=";"
|
||||
FS="/"
|
||||
;;
|
||||
* )
|
||||
echo "Unrecognized system!"
|
||||
exit 1;
|
||||
|
@ -14,7 +14,7 @@ case "$OS" in
|
||||
PS=":"
|
||||
FS="/"
|
||||
;;
|
||||
Windows_* )
|
||||
Windows_* | CYGWIN_* )
|
||||
echo "Test skipped for Windows"
|
||||
exit 0
|
||||
;;
|
||||
|
@ -65,6 +65,14 @@ case "$OS" in
|
||||
CP=cp
|
||||
MV=mv
|
||||
;;
|
||||
CYGWIN_* )
|
||||
NULL=/dev/null
|
||||
PS=";"
|
||||
FS="/"
|
||||
RM=rm
|
||||
CP=cp
|
||||
MV=mv
|
||||
;;
|
||||
* )
|
||||
echo "Unrecognized system!"
|
||||
exit 1;
|
||||
|
@ -38,6 +38,11 @@ case "$OS" in
|
||||
PS=";"
|
||||
FS="\\"
|
||||
;;
|
||||
CYGWIN_* )
|
||||
NULL=/dev/null
|
||||
PS=";"
|
||||
FS="/"
|
||||
;;
|
||||
* )
|
||||
echo "Unrecognized system!"
|
||||
exit 1;
|
||||
|
@ -40,6 +40,11 @@ case "$OS" in
|
||||
PS=";"
|
||||
FS="\\"
|
||||
;;
|
||||
CYGWIN_* )
|
||||
NULL=/dev/null
|
||||
PS=";"
|
||||
FS="/"
|
||||
;;
|
||||
* )
|
||||
echo "Unrecognized system!"
|
||||
exit 1;
|
||||
|
@ -46,7 +46,7 @@ case "$OS" in
|
||||
SunOS | Linux | Darwin )
|
||||
FS="/"
|
||||
;;
|
||||
Windows_* )
|
||||
Windows_* | CYGWIN_* )
|
||||
printf "Not testing libjsig.so on Windows. PASSED.\n "
|
||||
exit 0
|
||||
;;
|
||||
|
@ -55,6 +55,12 @@ case "$OS" in
|
||||
CP=cp
|
||||
MV=mv
|
||||
;;
|
||||
CYGWIN_* )
|
||||
FS="/"
|
||||
RM=rm
|
||||
CP=cp
|
||||
MV=mv
|
||||
;;
|
||||
* )
|
||||
echo "Unrecognized system!"
|
||||
exit 1;
|
||||
|
@ -56,6 +56,11 @@ case "$OS" in
|
||||
PS=";"
|
||||
FS="\\"
|
||||
;;
|
||||
CYGWIN_* )
|
||||
NULL=/dev/null
|
||||
PS=";"
|
||||
FS="/"
|
||||
;;
|
||||
* )
|
||||
echo "Unrecognized system!"
|
||||
exit 1;
|
||||
|
@ -38,6 +38,18 @@ case "$OS" in
|
||||
PS=";"
|
||||
FS="\\"
|
||||
;;
|
||||
CYGWIN_NT* )
|
||||
NULL=/dev/null
|
||||
PS=";"
|
||||
FS="/"
|
||||
;;
|
||||
CYGWIN_* )
|
||||
NULL=/dev/null
|
||||
PS=";"
|
||||
FS="/"
|
||||
echo "Test skipped, only for WinNT"
|
||||
exit 0
|
||||
;;
|
||||
* )
|
||||
echo "Unrecognized system!"
|
||||
exit 1;
|
||||
|
Loading…
x
Reference in New Issue
Block a user