mirror of
https://github.com/openjdk/jdk.git
synced 2026-02-10 18:38:27 +00:00
Merge
This commit is contained in:
commit
2fa26393fb
@ -81,7 +81,7 @@ define_pd_global(intx, InitialCodeCacheSize, 2048*K); // Integral multip
|
||||
define_pd_global(intx, ReservedCodeCacheSize, 256*M);
|
||||
define_pd_global(intx, NonProfiledCodeHeapSize, 125*M);
|
||||
define_pd_global(intx, ProfiledCodeHeapSize, 126*M);
|
||||
define_pd_global(intx, NonMethodCodeHeapSize, 5*M );
|
||||
define_pd_global(intx, NonNMethodCodeHeapSize, 5*M );
|
||||
define_pd_global(intx, CodeCacheExpansionSize, 64*K);
|
||||
|
||||
// Ergonomics related flags
|
||||
|
||||
@ -49,7 +49,7 @@ define_pd_global(bool, ResizeTLAB, true );
|
||||
define_pd_global(intx, ReservedCodeCacheSize, 32*M );
|
||||
define_pd_global(intx, NonProfiledCodeHeapSize, 13*M );
|
||||
define_pd_global(intx, ProfiledCodeHeapSize, 14*M );
|
||||
define_pd_global(intx, NonMethodCodeHeapSize, 5*M );
|
||||
define_pd_global(intx, NonNMethodCodeHeapSize, 5*M );
|
||||
define_pd_global(intx, CodeCacheExpansionSize, 32*K );
|
||||
define_pd_global(uintx, CodeCacheMinBlockLength, 1);
|
||||
define_pd_global(uintx, CodeCacheMinimumUseSpace, 400*K);
|
||||
|
||||
@ -76,7 +76,7 @@ define_pd_global(intx, InitialCodeCacheSize, 2048*K); // Integral multip
|
||||
define_pd_global(intx, ReservedCodeCacheSize, 48*M);
|
||||
define_pd_global(intx, NonProfiledCodeHeapSize, 21*M);
|
||||
define_pd_global(intx, ProfiledCodeHeapSize, 22*M);
|
||||
define_pd_global(intx, NonMethodCodeHeapSize, 5*M );
|
||||
define_pd_global(intx, NonNMethodCodeHeapSize, 5*M );
|
||||
define_pd_global(intx, CodeCacheExpansionSize, 64*K);
|
||||
|
||||
// Ergonomics related flags
|
||||
@ -87,7 +87,7 @@ define_pd_global(intx, InitialCodeCacheSize, 1536*K); // Integral multip
|
||||
define_pd_global(intx, ReservedCodeCacheSize, 32*M);
|
||||
define_pd_global(intx, NonProfiledCodeHeapSize, 13*M);
|
||||
define_pd_global(intx, ProfiledCodeHeapSize, 14*M);
|
||||
define_pd_global(intx, NonMethodCodeHeapSize, 5*M );
|
||||
define_pd_global(intx, NonNMethodCodeHeapSize, 5*M );
|
||||
define_pd_global(intx, CodeCacheExpansionSize, 32*K);
|
||||
// Ergonomics related flags
|
||||
define_pd_global(uint64_t,MaxRAM, 4ULL*G);
|
||||
|
||||
@ -49,7 +49,7 @@ define_pd_global(intx, InitialCodeCacheSize, 160*K);
|
||||
define_pd_global(intx, ReservedCodeCacheSize, 32*M );
|
||||
define_pd_global(intx, NonProfiledCodeHeapSize, 13*M );
|
||||
define_pd_global(intx, ProfiledCodeHeapSize, 14*M );
|
||||
define_pd_global(intx, NonMethodCodeHeapSize, 5*M );
|
||||
define_pd_global(intx, NonNMethodCodeHeapSize, 5*M );
|
||||
define_pd_global(bool, ProfileInterpreter, false);
|
||||
define_pd_global(intx, CodeCacheExpansionSize, 32*K );
|
||||
define_pd_global(uintx, CodeCacheMinBlockLength, 1);
|
||||
|
||||
@ -86,7 +86,7 @@ define_pd_global(bool, OptoBundling, false);
|
||||
define_pd_global(intx, ReservedCodeCacheSize, 48*M);
|
||||
define_pd_global(intx, NonProfiledCodeHeapSize, 21*M);
|
||||
define_pd_global(intx, ProfiledCodeHeapSize, 22*M);
|
||||
define_pd_global(intx, NonMethodCodeHeapSize, 5*M );
|
||||
define_pd_global(intx, NonNMethodCodeHeapSize, 5*M );
|
||||
define_pd_global(uintx, CodeCacheMinBlockLength, 4);
|
||||
define_pd_global(uintx, CodeCacheMinimumUseSpace, 400*K);
|
||||
|
||||
|
||||
@ -55,7 +55,7 @@ define_pd_global(intx, InitialCodeCacheSize, 160*K);
|
||||
define_pd_global(intx, ReservedCodeCacheSize, 32*M );
|
||||
define_pd_global(intx, NonProfiledCodeHeapSize, 13*M );
|
||||
define_pd_global(intx, ProfiledCodeHeapSize, 14*M );
|
||||
define_pd_global(intx, NonMethodCodeHeapSize, 5*M );
|
||||
define_pd_global(intx, NonNMethodCodeHeapSize, 5*M );
|
||||
define_pd_global(bool, ProfileInterpreter, false);
|
||||
define_pd_global(intx, CodeCacheExpansionSize, 32*K );
|
||||
define_pd_global(uintx, CodeCacheMinBlockLength, 1 );
|
||||
|
||||
@ -38,17 +38,18 @@
|
||||
|
||||
typedef enum {
|
||||
_t_compile,
|
||||
_t_setup,
|
||||
_t_buildIR,
|
||||
_t_optimize_blocks,
|
||||
_t_optimize_null_checks,
|
||||
_t_rangeCheckElimination,
|
||||
_t_emit_lir,
|
||||
_t_linearScan,
|
||||
_t_lirGeneration,
|
||||
_t_lir_schedule,
|
||||
_t_codeemit,
|
||||
_t_codeinstall,
|
||||
_t_setup,
|
||||
_t_buildIR,
|
||||
_t_hir_parse,
|
||||
_t_gvn,
|
||||
_t_optimize_blocks,
|
||||
_t_optimize_null_checks,
|
||||
_t_rangeCheckElimination,
|
||||
_t_emit_lir,
|
||||
_t_linearScan,
|
||||
_t_lirGeneration,
|
||||
_t_codeemit,
|
||||
_t_codeinstall,
|
||||
max_phase_timers
|
||||
} TimerName;
|
||||
|
||||
@ -56,13 +57,14 @@ static const char * timer_name[] = {
|
||||
"compile",
|
||||
"setup",
|
||||
"buildIR",
|
||||
"parse_hir",
|
||||
"gvn",
|
||||
"optimize_blocks",
|
||||
"optimize_null_checks",
|
||||
"rangeCheckElimination",
|
||||
"emit_lir",
|
||||
"linearScan",
|
||||
"lirGeneration",
|
||||
"lir_schedule",
|
||||
"codeemit",
|
||||
"codeinstall"
|
||||
};
|
||||
@ -144,7 +146,10 @@ void Compilation::build_hir() {
|
||||
log->stamp();
|
||||
log->end_head();
|
||||
}
|
||||
_hir = new IR(this, method(), osr_bci());
|
||||
{
|
||||
PhaseTraceTime timeit(_t_hir_parse);
|
||||
_hir = new IR(this, method(), osr_bci());
|
||||
}
|
||||
if (log) log->done("parse");
|
||||
if (!_hir->is_valid()) {
|
||||
bailout("invalid parsing");
|
||||
@ -189,6 +194,7 @@ void Compilation::build_hir() {
|
||||
|
||||
if (UseGlobalValueNumbering) {
|
||||
// No resource mark here! LoopInvariantCodeMotion can allocate ValueStack objects.
|
||||
PhaseTraceTime timeit(_t_gvn);
|
||||
int instructions = Instruction::number_of_instructions();
|
||||
GlobalValueNumbering gvn(_hir);
|
||||
assert(instructions == Instruction::number_of_instructions(),
|
||||
@ -419,8 +425,12 @@ void Compilation::install_code(int frame_size) {
|
||||
|
||||
|
||||
void Compilation::compile_method() {
|
||||
// setup compilation
|
||||
initialize();
|
||||
{
|
||||
PhaseTraceTime timeit(_t_setup);
|
||||
|
||||
// setup compilation
|
||||
initialize();
|
||||
}
|
||||
|
||||
if (!method()->can_be_compiled()) {
|
||||
// Prevent race condition 6328518.
|
||||
@ -615,24 +625,54 @@ ciKlass* Compilation::cha_exact_type(ciType* type) {
|
||||
}
|
||||
|
||||
void Compilation::print_timers() {
|
||||
// tty->print_cr(" Native methods : %6.3f s, Average : %2.3f", CompileBroker::_t_native_compilation.seconds(), CompileBroker::_t_native_compilation.seconds() / CompileBroker::_total_native_compile_count);
|
||||
float total = timers[_t_setup].seconds() + timers[_t_buildIR].seconds() + timers[_t_emit_lir].seconds() + timers[_t_lir_schedule].seconds() + timers[_t_codeemit].seconds() + timers[_t_codeinstall].seconds();
|
||||
tty->print_cr(" C1 Compile Time: %7.3f s", timers[_t_compile].seconds());
|
||||
tty->print_cr(" Setup time: %7.3f s", timers[_t_setup].seconds());
|
||||
|
||||
{
|
||||
tty->print_cr(" Build HIR: %7.3f s", timers[_t_buildIR].seconds());
|
||||
tty->print_cr(" Parse: %7.3f s", timers[_t_hir_parse].seconds());
|
||||
tty->print_cr(" Optimize blocks: %7.3f s", timers[_t_optimize_blocks].seconds());
|
||||
tty->print_cr(" GVN: %7.3f s", timers[_t_gvn].seconds());
|
||||
tty->print_cr(" Null checks elim: %7.3f s", timers[_t_optimize_null_checks].seconds());
|
||||
tty->print_cr(" Range checks elim: %7.3f s", timers[_t_rangeCheckElimination].seconds());
|
||||
|
||||
tty->print_cr(" Detailed C1 Timings");
|
||||
tty->print_cr(" Setup time: %6.3f s (%4.1f%%)", timers[_t_setup].seconds(), (timers[_t_setup].seconds() / total) * 100.0);
|
||||
tty->print_cr(" Build IR: %6.3f s (%4.1f%%)", timers[_t_buildIR].seconds(), (timers[_t_buildIR].seconds() / total) * 100.0);
|
||||
float t_optimizeIR = timers[_t_optimize_blocks].seconds() + timers[_t_optimize_null_checks].seconds();
|
||||
tty->print_cr(" Optimize: %6.3f s (%4.1f%%)", t_optimizeIR, (t_optimizeIR / total) * 100.0);
|
||||
tty->print_cr(" RCE: %6.3f s (%4.1f%%)", timers[_t_rangeCheckElimination].seconds(), (timers[_t_rangeCheckElimination].seconds() / total) * 100.0);
|
||||
tty->print_cr(" Emit LIR: %6.3f s (%4.1f%%)", timers[_t_emit_lir].seconds(), (timers[_t_emit_lir].seconds() / total) * 100.0);
|
||||
tty->print_cr(" LIR Gen: %6.3f s (%4.1f%%)", timers[_t_lirGeneration].seconds(), (timers[_t_lirGeneration].seconds() / total) * 100.0);
|
||||
tty->print_cr(" Linear Scan: %6.3f s (%4.1f%%)", timers[_t_linearScan].seconds(), (timers[_t_linearScan].seconds() / total) * 100.0);
|
||||
NOT_PRODUCT(LinearScan::print_timers(timers[_t_linearScan].seconds()));
|
||||
tty->print_cr(" LIR Schedule: %6.3f s (%4.1f%%)", timers[_t_lir_schedule].seconds(), (timers[_t_lir_schedule].seconds() / total) * 100.0);
|
||||
tty->print_cr(" Code Emission: %6.3f s (%4.1f%%)", timers[_t_codeemit].seconds(), (timers[_t_codeemit].seconds() / total) * 100.0);
|
||||
tty->print_cr(" Code Installation: %6.3f s (%4.1f%%)", timers[_t_codeinstall].seconds(), (timers[_t_codeinstall].seconds() / total) * 100.0);
|
||||
tty->print_cr(" Instruction Nodes: %6d nodes", totalInstructionNodes);
|
||||
double other = timers[_t_buildIR].seconds() -
|
||||
(timers[_t_hir_parse].seconds() +
|
||||
timers[_t_optimize_blocks].seconds() +
|
||||
timers[_t_gvn].seconds() +
|
||||
timers[_t_optimize_null_checks].seconds() +
|
||||
timers[_t_rangeCheckElimination].seconds());
|
||||
if (other > 0) {
|
||||
tty->print_cr(" Other: %7.3f s", other);
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
tty->print_cr(" Emit LIR: %7.3f s", timers[_t_emit_lir].seconds());
|
||||
tty->print_cr(" LIR Gen: %7.3f s", timers[_t_lirGeneration].seconds());
|
||||
tty->print_cr(" Linear Scan: %7.3f s", timers[_t_linearScan].seconds());
|
||||
NOT_PRODUCT(LinearScan::print_timers(timers[_t_linearScan].seconds()));
|
||||
|
||||
double other = timers[_t_emit_lir].seconds() -
|
||||
(timers[_t_lirGeneration].seconds() +
|
||||
timers[_t_linearScan].seconds());
|
||||
if (other > 0) {
|
||||
tty->print_cr(" Other: %7.3f s", other);
|
||||
}
|
||||
}
|
||||
|
||||
tty->print_cr(" Code Emission: %7.3f s", timers[_t_codeemit].seconds());
|
||||
tty->print_cr(" Code Installation: %7.3f s", timers[_t_codeinstall].seconds());
|
||||
|
||||
double other = timers[_t_compile].seconds() -
|
||||
(timers[_t_setup].seconds() +
|
||||
timers[_t_buildIR].seconds() +
|
||||
timers[_t_emit_lir].seconds() +
|
||||
timers[_t_codeemit].seconds() +
|
||||
timers[_t_codeinstall].seconds());
|
||||
if (other > 0) {
|
||||
tty->print_cr(" Other: %7.3f s", other);
|
||||
}
|
||||
|
||||
NOT_PRODUCT(LinearScan::print_statistics());
|
||||
}
|
||||
|
||||
@ -2273,12 +2273,14 @@ methodHandle SystemDictionary::find_method_handle_intrinsic(vmIntrinsics::ID iid
|
||||
spe = NULL;
|
||||
// Must create lots of stuff here, but outside of the SystemDictionary lock.
|
||||
m = Method::make_method_handle_intrinsic(iid, signature, CHECK_(empty));
|
||||
CompileBroker::compile_method(m, InvocationEntryBci, CompLevel_highest_tier,
|
||||
methodHandle(), CompileThreshold, "MH", CHECK_(empty));
|
||||
// Check if we need to have compiled code but we don't.
|
||||
if (!Arguments::is_interpreter_only() && !m->has_compiled_code()) {
|
||||
THROW_MSG_(vmSymbols::java_lang_VirtualMachineError(),
|
||||
"out of space in CodeCache for method handle intrinsic", empty);
|
||||
if (!Arguments::is_interpreter_only()) {
|
||||
// Generate a compiled form of the MH intrinsic.
|
||||
AdapterHandlerLibrary::create_native_wrapper(m);
|
||||
// Check if have the compiled code.
|
||||
if (!m->has_compiled_code()) {
|
||||
THROW_MSG_(vmSymbols::java_lang_VirtualMachineError(),
|
||||
"out of space in CodeCache for method handle intrinsic", empty);
|
||||
}
|
||||
}
|
||||
// Now grab the lock. We might have to throw away the new method,
|
||||
// if a racing thread has managed to install one at the same time.
|
||||
|
||||
@ -230,7 +230,7 @@ BufferBlob* BufferBlob::create(const char* name, CodeBuffer* cb) {
|
||||
}
|
||||
|
||||
void* BufferBlob::operator new(size_t s, unsigned size, bool is_critical) throw() {
|
||||
return CodeCache::allocate(size, CodeBlobType::NonMethod, is_critical);
|
||||
return CodeCache::allocate(size, CodeBlobType::NonNMethod, is_critical);
|
||||
}
|
||||
|
||||
void BufferBlob::free(BufferBlob *blob) {
|
||||
@ -336,14 +336,14 @@ RuntimeStub* RuntimeStub::new_runtime_stub(const char* stub_name,
|
||||
|
||||
|
||||
void* RuntimeStub::operator new(size_t s, unsigned size) throw() {
|
||||
void* p = CodeCache::allocate(size, CodeBlobType::NonMethod, true);
|
||||
void* p = CodeCache::allocate(size, CodeBlobType::NonNMethod, true);
|
||||
if (!p) fatal("Initial size of CodeCache is too small");
|
||||
return p;
|
||||
}
|
||||
|
||||
// operator new shared by all singletons:
|
||||
void* SingletonBlob::operator new(size_t s, unsigned size) throw() {
|
||||
void* p = CodeCache::allocate(size, CodeBlobType::NonMethod, true);
|
||||
void* p = CodeCache::allocate(size, CodeBlobType::NonNMethod, true);
|
||||
if (!p) fatal("Initial size of CodeCache is too small");
|
||||
return p;
|
||||
}
|
||||
|
||||
@ -36,7 +36,7 @@ struct CodeBlobType {
|
||||
enum {
|
||||
MethodNonProfiled = 0, // Execution level 1 and 4 (non-profiled) nmethods (including native nmethods)
|
||||
MethodProfiled = 1, // Execution level 2 and 3 (profiled) nmethods
|
||||
NonMethod = 2, // Non-methods like Buffers, Adapters and Runtime Stubs
|
||||
NonNMethod = 2, // Non-nmethods like Buffers, Adapters and Runtime Stubs
|
||||
All = 3, // All types (No code cache segmentation)
|
||||
NumTypes = 4 // Number of CodeBlobTypes
|
||||
};
|
||||
|
||||
@ -158,23 +158,23 @@ void CodeCache::initialize_heaps() {
|
||||
#endif
|
||||
|
||||
// Calculate default CodeHeap sizes if not set by user
|
||||
if (!FLAG_IS_CMDLINE(NonMethodCodeHeapSize) && !FLAG_IS_CMDLINE(ProfiledCodeHeapSize)
|
||||
if (!FLAG_IS_CMDLINE(NonNMethodCodeHeapSize) && !FLAG_IS_CMDLINE(ProfiledCodeHeapSize)
|
||||
&& !FLAG_IS_CMDLINE(NonProfiledCodeHeapSize)) {
|
||||
// Increase default NonMethodCodeHeapSize to account for compiler buffers
|
||||
FLAG_SET_ERGO(uintx, NonMethodCodeHeapSize, NonMethodCodeHeapSize + code_buffers_size);
|
||||
// Increase default NonNMethodCodeHeapSize to account for compiler buffers
|
||||
FLAG_SET_ERGO(uintx, NonNMethodCodeHeapSize, NonNMethodCodeHeapSize + code_buffers_size);
|
||||
|
||||
// Check if we have enough space for the non-method code heap
|
||||
if (ReservedCodeCacheSize > NonMethodCodeHeapSize) {
|
||||
// Use the default value for NonMethodCodeHeapSize and one half of the
|
||||
// Check if we have enough space for the non-nmethod code heap
|
||||
if (ReservedCodeCacheSize > NonNMethodCodeHeapSize) {
|
||||
// Use the default value for NonNMethodCodeHeapSize and one half of the
|
||||
// remaining size for non-profiled methods and one half for profiled methods
|
||||
size_t remaining_size = ReservedCodeCacheSize - NonMethodCodeHeapSize;
|
||||
size_t remaining_size = ReservedCodeCacheSize - NonNMethodCodeHeapSize;
|
||||
size_t profiled_size = remaining_size / 2;
|
||||
size_t non_profiled_size = remaining_size - profiled_size;
|
||||
FLAG_SET_ERGO(uintx, ProfiledCodeHeapSize, profiled_size);
|
||||
FLAG_SET_ERGO(uintx, NonProfiledCodeHeapSize, non_profiled_size);
|
||||
} else {
|
||||
// Use all space for the non-method heap and set other heaps to minimal size
|
||||
FLAG_SET_ERGO(uintx, NonMethodCodeHeapSize, ReservedCodeCacheSize - os::vm_page_size() * 2);
|
||||
// Use all space for the non-nmethod heap and set other heaps to minimal size
|
||||
FLAG_SET_ERGO(uintx, NonNMethodCodeHeapSize, ReservedCodeCacheSize - os::vm_page_size() * 2);
|
||||
FLAG_SET_ERGO(uintx, ProfiledCodeHeapSize, os::vm_page_size());
|
||||
FLAG_SET_ERGO(uintx, NonProfiledCodeHeapSize, os::vm_page_size());
|
||||
}
|
||||
@ -185,21 +185,21 @@ void CodeCache::initialize_heaps() {
|
||||
FLAG_SET_ERGO(uintx, NonProfiledCodeHeapSize, NonProfiledCodeHeapSize + ProfiledCodeHeapSize);
|
||||
FLAG_SET_ERGO(uintx, ProfiledCodeHeapSize, 0);
|
||||
}
|
||||
// We do not need the non-profiled CodeHeap, use all space for the non-method CodeHeap
|
||||
// We do not need the non-profiled CodeHeap, use all space for the non-nmethod CodeHeap
|
||||
if(!heap_available(CodeBlobType::MethodNonProfiled)) {
|
||||
FLAG_SET_ERGO(uintx, NonMethodCodeHeapSize, NonMethodCodeHeapSize + NonProfiledCodeHeapSize);
|
||||
FLAG_SET_ERGO(uintx, NonNMethodCodeHeapSize, NonNMethodCodeHeapSize + NonProfiledCodeHeapSize);
|
||||
FLAG_SET_ERGO(uintx, NonProfiledCodeHeapSize, 0);
|
||||
}
|
||||
|
||||
// Make sure we have enough space for VM internal code
|
||||
uint min_code_cache_size = (CodeCacheMinimumUseSpace DEBUG_ONLY(* 3)) + CodeCacheMinimumFreeSpace;
|
||||
if (NonMethodCodeHeapSize < (min_code_cache_size + code_buffers_size)) {
|
||||
vm_exit_during_initialization("Not enough space in non-method code heap to run VM.");
|
||||
if (NonNMethodCodeHeapSize < (min_code_cache_size + code_buffers_size)) {
|
||||
vm_exit_during_initialization("Not enough space in non-nmethod code heap to run VM.");
|
||||
}
|
||||
guarantee(NonProfiledCodeHeapSize + ProfiledCodeHeapSize + NonMethodCodeHeapSize <= ReservedCodeCacheSize, "Size check");
|
||||
guarantee(NonProfiledCodeHeapSize + ProfiledCodeHeapSize + NonNMethodCodeHeapSize <= ReservedCodeCacheSize, "Size check");
|
||||
|
||||
// Align reserved sizes of CodeHeaps
|
||||
size_t non_method_size = ReservedCodeSpace::allocation_align_size_up(NonMethodCodeHeapSize);
|
||||
size_t non_method_size = ReservedCodeSpace::allocation_align_size_up(NonNMethodCodeHeapSize);
|
||||
size_t profiled_size = ReservedCodeSpace::allocation_align_size_up(ProfiledCodeHeapSize);
|
||||
size_t non_profiled_size = ReservedCodeSpace::allocation_align_size_up(NonProfiledCodeHeapSize);
|
||||
|
||||
@ -213,7 +213,7 @@ void CodeCache::initialize_heaps() {
|
||||
// ---------- high -----------
|
||||
// Non-profiled nmethods
|
||||
// Profiled nmethods
|
||||
// Non-methods
|
||||
// Non-nmethods
|
||||
// ---------- low ------------
|
||||
ReservedCodeSpace rs = reserve_heap_memory(non_profiled_size + profiled_size + non_method_size);
|
||||
ReservedSpace non_method_space = rs.first_part(non_method_size);
|
||||
@ -221,12 +221,12 @@ void CodeCache::initialize_heaps() {
|
||||
ReservedSpace profiled_space = rest.first_part(profiled_size);
|
||||
ReservedSpace non_profiled_space = rest.last_part(profiled_size);
|
||||
|
||||
// Non-methods (stubs, adapters, ...)
|
||||
add_heap(non_method_space, "non-methods", init_non_method_size, CodeBlobType::NonMethod);
|
||||
// Non-nmethods (stubs, adapters, ...)
|
||||
add_heap(non_method_space, "CodeHeap 'non-nmethods'", init_non_method_size, CodeBlobType::NonNMethod);
|
||||
// Tier 2 and tier 3 (profiled) methods
|
||||
add_heap(profiled_space, "profiled nmethods", init_profiled_size, CodeBlobType::MethodProfiled);
|
||||
add_heap(profiled_space, "CodeHeap 'profiled nmethods'", init_profiled_size, CodeBlobType::MethodProfiled);
|
||||
// Tier 1 and tier 4 (non-profiled) methods and native methods
|
||||
add_heap(non_profiled_space, "non-profiled nmethods", init_non_profiled_size, CodeBlobType::MethodNonProfiled);
|
||||
add_heap(non_profiled_space, "CodeHeap 'non-profiled nmethods'", init_non_profiled_size, CodeBlobType::MethodNonProfiled);
|
||||
}
|
||||
|
||||
ReservedCodeSpace CodeCache::reserve_heap_memory(size_t size) {
|
||||
@ -257,13 +257,13 @@ bool CodeCache::heap_available(int code_blob_type) {
|
||||
} else if ((Arguments::mode() == Arguments::_int) ||
|
||||
(TieredStopAtLevel == CompLevel_none)) {
|
||||
// Interpreter only: we don't need any method code heaps
|
||||
return (code_blob_type == CodeBlobType::NonMethod);
|
||||
return (code_blob_type == CodeBlobType::NonNMethod);
|
||||
} else if (TieredCompilation && (TieredStopAtLevel > CompLevel_simple)) {
|
||||
// Tiered compilation: use all code heaps
|
||||
return (code_blob_type < CodeBlobType::All);
|
||||
} else {
|
||||
// No TieredCompilation: we only need the non-method and non-profiled code heap
|
||||
return (code_blob_type == CodeBlobType::NonMethod) ||
|
||||
// No TieredCompilation: we only need the non-nmethod and non-profiled code heap
|
||||
return (code_blob_type == CodeBlobType::NonNMethod) ||
|
||||
(code_blob_type == CodeBlobType::MethodNonProfiled);
|
||||
}
|
||||
}
|
||||
@ -355,8 +355,8 @@ CodeBlob* CodeCache::allocate(int size, int code_blob_type, bool is_critical) {
|
||||
if (cb != NULL) break;
|
||||
if (!heap->expand_by(CodeCacheExpansionSize)) {
|
||||
// Expansion failed
|
||||
if (SegmentedCodeCache && (code_blob_type == CodeBlobType::NonMethod)) {
|
||||
// Fallback solution: Store non-method code in the non-profiled code heap
|
||||
if (SegmentedCodeCache && (code_blob_type == CodeBlobType::NonNMethod)) {
|
||||
// Fallback solution: Store non-nmethod code in the non-profiled code heap
|
||||
return allocate(size, CodeBlobType::MethodNonProfiled, is_critical);
|
||||
}
|
||||
return NULL;
|
||||
@ -364,9 +364,9 @@ CodeBlob* CodeCache::allocate(int size, int code_blob_type, bool is_critical) {
|
||||
if (PrintCodeCacheExtension) {
|
||||
ResourceMark rm;
|
||||
if (SegmentedCodeCache) {
|
||||
tty->print("Code heap '%s'", heap->name());
|
||||
tty->print("%s", heap->name());
|
||||
} else {
|
||||
tty->print("Code cache");
|
||||
tty->print("CodeCache");
|
||||
}
|
||||
tty->print_cr(" extended to [" INTPTR_FORMAT ", " INTPTR_FORMAT "] (" SSIZE_FORMAT " bytes)",
|
||||
(intptr_t)heap->low_boundary(), (intptr_t)heap->high(),
|
||||
@ -820,7 +820,7 @@ void CodeCache::initialize() {
|
||||
} else {
|
||||
// Use a single code heap
|
||||
ReservedCodeSpace rs = reserve_heap_memory(ReservedCodeCacheSize);
|
||||
add_heap(rs, "Code heap", InitialCodeCacheSize, CodeBlobType::All);
|
||||
add_heap(rs, "CodeCache", InitialCodeCacheSize, CodeBlobType::All);
|
||||
}
|
||||
|
||||
// Initialize ICache flush mechanism
|
||||
@ -1006,7 +1006,7 @@ void CodeCache::report_codemem_full(int code_blob_type, bool print) {
|
||||
// Not yet reported for this heap, report
|
||||
heap->report_full();
|
||||
if (SegmentedCodeCache) {
|
||||
warning("CodeHeap for %s is full. Compiler has been disabled.", CodeCache::get_code_heap_name(code_blob_type));
|
||||
warning("%s is full. Compiler has been disabled.", CodeCache::get_code_heap_name(code_blob_type));
|
||||
warning("Try increasing the code heap size using -XX:%s=",
|
||||
(code_blob_type == CodeBlobType::MethodNonProfiled) ? "NonProfiledCodeHeapSize" : "ProfiledCodeHeapSize");
|
||||
} else {
|
||||
@ -1090,7 +1090,7 @@ void CodeCache::print_internals() {
|
||||
int i = 0;
|
||||
FOR_ALL_HEAPS(heap) {
|
||||
if (SegmentedCodeCache && Verbose) {
|
||||
tty->print_cr("-- Code heap '%s' --", (*heap)->name());
|
||||
tty->print_cr("-- %s --", (*heap)->name());
|
||||
}
|
||||
FOR_ALL_BLOBS(cb, *heap) {
|
||||
total++;
|
||||
@ -1239,7 +1239,7 @@ void CodeCache::print_summary(outputStream* st, bool detailed) {
|
||||
CodeHeap* heap = (*heap_iterator);
|
||||
size_t total = (heap->high_boundary() - heap->low_boundary());
|
||||
if (SegmentedCodeCache) {
|
||||
st->print("CodeHeap '%s':", heap->name());
|
||||
st->print("%s:", heap->name());
|
||||
} else {
|
||||
st->print("CodeCache:");
|
||||
}
|
||||
|
||||
@ -41,14 +41,14 @@
|
||||
// The CodeCache consists of one or more CodeHeaps, each of which contains
|
||||
// CodeBlobs of a specific CodeBlobType. Currently heaps for the following
|
||||
// types are available:
|
||||
// - Non-methods: Non-methods like Buffers, Adapters and Runtime Stubs
|
||||
// - Non-nmethods: Non-nmethods like Buffers, Adapters and Runtime Stubs
|
||||
// - Profiled nmethods: nmethods that are profiled, i.e., those
|
||||
// executed at level 2 or 3
|
||||
// - Non-Profiled nmethods: nmethods that are not profiled, i.e., those
|
||||
// executed at level 1 or 4 and native methods
|
||||
// - All: Used for code of all types if code cache segmentation is disabled.
|
||||
//
|
||||
// In the rare case of the non-method code heap getting full, non-method code
|
||||
// In the rare case of the non-nmethod code heap getting full, non-nmethod code
|
||||
// will be stored in the non-profiled code heap as a fallback solution.
|
||||
//
|
||||
// Depending on the availability of compilers and TieredCompilation there
|
||||
|
||||
@ -155,6 +155,14 @@ address CompiledIC::stub_address() const {
|
||||
return _ic_call->destination();
|
||||
}
|
||||
|
||||
// Clears the IC stub if the compiled IC is in transition state
|
||||
void CompiledIC::clear_ic_stub() {
|
||||
if (is_in_transition_state()) {
|
||||
ICStub* stub = ICStub_from_destination_address(stub_address());
|
||||
stub->clear();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// High-level access to an inline cache. Guaranteed to be MT-safe.
|
||||
@ -333,10 +341,7 @@ void CompiledIC::set_to_clean() {
|
||||
|
||||
if (safe_transition) {
|
||||
// Kill any leftover stub we might have too
|
||||
if (is_in_transition_state()) {
|
||||
ICStub* old_stub = ICStub_from_destination_address(stub_address());
|
||||
old_stub->clear();
|
||||
}
|
||||
clear_ic_stub();
|
||||
if (is_optimized()) {
|
||||
set_ic_destination(entry);
|
||||
} else {
|
||||
|
||||
@ -216,6 +216,7 @@ class CompiledIC: public ResourceObj {
|
||||
//
|
||||
void set_to_clean(); // Can only be called during a safepoint operation
|
||||
void set_to_monomorphic(CompiledICInfo& info);
|
||||
void clear_ic_stub();
|
||||
|
||||
// Returns true if successful and false otherwise. The call can fail if memory
|
||||
// allocation in the code cache fails.
|
||||
|
||||
@ -567,12 +567,16 @@ void Dependencies::print_dependency(DepType dept, GrowableArray<DepArgument>* ar
|
||||
what = "object ";
|
||||
}
|
||||
tty->print(" %s = %s", what, (put_star? "*": ""));
|
||||
if (arg.is_klass())
|
||||
if (arg.is_klass()) {
|
||||
tty->print("%s", ((Klass*)arg.metadata_value())->external_name());
|
||||
else if (arg.is_method())
|
||||
} else if (arg.is_method()) {
|
||||
((Method*)arg.metadata_value())->print_value();
|
||||
else
|
||||
} else if (arg.is_oop()) {
|
||||
arg.oop_value()->print_value_on(tty);
|
||||
} else {
|
||||
ShouldNotReachHere(); // Provide impl for this type.
|
||||
}
|
||||
|
||||
tty->cr();
|
||||
}
|
||||
if (witness != NULL) {
|
||||
@ -609,7 +613,11 @@ void Dependencies::DepStream::print_dependency(Klass* witness, bool verbose) {
|
||||
int nargs = argument_count();
|
||||
GrowableArray<DepArgument>* args = new GrowableArray<DepArgument>(nargs);
|
||||
for (int j = 0; j < nargs; j++) {
|
||||
args->push(argument(j));
|
||||
if (type() == call_site_target_value) {
|
||||
args->push(argument_oop(j));
|
||||
} else {
|
||||
args->push(argument(j));
|
||||
}
|
||||
}
|
||||
int argslen = args->length();
|
||||
Dependencies::print_dependency(type(), args, witness);
|
||||
|
||||
@ -1130,6 +1130,18 @@ void nmethod::clear_inline_caches() {
|
||||
}
|
||||
}
|
||||
|
||||
// Clear ICStubs of all compiled ICs
|
||||
void nmethod::clear_ic_stubs() {
|
||||
assert_locked_or_safepoint(CompiledIC_lock);
|
||||
RelocIterator iter(this);
|
||||
while(iter.next()) {
|
||||
if (iter.type() == relocInfo::virtual_call_type) {
|
||||
CompiledIC* ic = CompiledIC_at(&iter);
|
||||
ic->clear_ic_stub();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void nmethod::cleanup_inline_caches() {
|
||||
|
||||
|
||||
@ -577,6 +577,7 @@ public:
|
||||
|
||||
// Inline cache support
|
||||
void clear_inline_caches();
|
||||
void clear_ic_stubs();
|
||||
void cleanup_inline_caches();
|
||||
bool inlinecache_check_contains(address addr) const {
|
||||
return (addr >= code_begin() && addr < verified_entry_point());
|
||||
|
||||
@ -63,7 +63,7 @@ void* VtableStub::operator new(size_t size, int code_size) throw() {
|
||||
// If changing the name, update the other file accordingly.
|
||||
BufferBlob* blob = BufferBlob::create("vtable chunks", bytes);
|
||||
if (blob == NULL) {
|
||||
CompileBroker::handle_full_code_cache(CodeBlobType::NonMethod);
|
||||
CompileBroker::handle_full_code_cache(CodeBlobType::NonNMethod);
|
||||
return NULL;
|
||||
}
|
||||
_chunk = blob->content_begin();
|
||||
|
||||
@ -137,6 +137,8 @@ PerfVariable* CompileBroker::_perf_last_invalidated_type = NULL;
|
||||
elapsedTimer CompileBroker::_t_total_compilation;
|
||||
elapsedTimer CompileBroker::_t_osr_compilation;
|
||||
elapsedTimer CompileBroker::_t_standard_compilation;
|
||||
elapsedTimer CompileBroker::_t_invalidated_compilation;
|
||||
elapsedTimer CompileBroker::_t_bailedout_compilation;
|
||||
|
||||
int CompileBroker::_total_bailout_count = 0;
|
||||
int CompileBroker::_total_invalidated_count = 0;
|
||||
@ -2236,6 +2238,11 @@ void CompileBroker::collect_statistics(CompilerThread* thread, elapsedTimer time
|
||||
// _perf variables are production performance counters which are
|
||||
// updated regardless of the setting of the CITime and CITimeEach flags
|
||||
//
|
||||
|
||||
// account all time, including bailouts and failures in this counter;
|
||||
// C1 and C2 counters are counting both successful and unsuccessful compiles
|
||||
_t_total_compilation.add(time);
|
||||
|
||||
if (!success) {
|
||||
_total_bailout_count++;
|
||||
if (UsePerfData) {
|
||||
@ -2243,6 +2250,7 @@ void CompileBroker::collect_statistics(CompilerThread* thread, elapsedTimer time
|
||||
_perf_last_failed_type->set_value(counters->compile_type());
|
||||
_perf_total_bailout_count->inc();
|
||||
}
|
||||
_t_bailedout_compilation.add(time);
|
||||
} else if (code == NULL) {
|
||||
if (UsePerfData) {
|
||||
_perf_last_invalidated_method->set_value(counters->current_method());
|
||||
@ -2250,14 +2258,13 @@ void CompileBroker::collect_statistics(CompilerThread* thread, elapsedTimer time
|
||||
_perf_total_invalidated_count->inc();
|
||||
}
|
||||
_total_invalidated_count++;
|
||||
_t_invalidated_compilation.add(time);
|
||||
} else {
|
||||
// Compilation succeeded
|
||||
|
||||
// update compilation ticks - used by the implementation of
|
||||
// java.lang.management.CompilationMBean
|
||||
_perf_total_compilation->inc(time.ticks());
|
||||
|
||||
_t_total_compilation.add(time);
|
||||
_peak_compilation_time = time.milliseconds() > _peak_compilation_time ? time.milliseconds() : _peak_compilation_time;
|
||||
|
||||
if (CITime) {
|
||||
@ -2325,37 +2332,47 @@ const char* CompileBroker::compiler_name(int comp_level) {
|
||||
|
||||
void CompileBroker::print_times() {
|
||||
tty->cr();
|
||||
tty->print_cr("Accumulated compiler times (for compiled methods only)");
|
||||
tty->print_cr("------------------------------------------------");
|
||||
tty->print_cr("Accumulated compiler times");
|
||||
tty->print_cr("----------------------------------------------------------");
|
||||
//0000000000111111111122222222223333333333444444444455555555556666666666
|
||||
//0123456789012345678901234567890123456789012345678901234567890123456789
|
||||
tty->print_cr(" Total compilation time : %6.3f s", CompileBroker::_t_total_compilation.seconds());
|
||||
tty->print_cr(" Standard compilation : %6.3f s, Average : %2.3f",
|
||||
tty->print_cr(" Total compilation time : %7.3f s", CompileBroker::_t_total_compilation.seconds());
|
||||
tty->print_cr(" Standard compilation : %7.3f s, Average : %2.3f s",
|
||||
CompileBroker::_t_standard_compilation.seconds(),
|
||||
CompileBroker::_t_standard_compilation.seconds() / CompileBroker::_total_standard_compile_count);
|
||||
tty->print_cr(" On stack replacement : %6.3f s, Average : %2.3f", CompileBroker::_t_osr_compilation.seconds(), CompileBroker::_t_osr_compilation.seconds() / CompileBroker::_total_osr_compile_count);
|
||||
tty->print_cr(" Bailed out compilation : %7.3f s, Average : %2.3f s",
|
||||
CompileBroker::_t_bailedout_compilation.seconds(),
|
||||
CompileBroker::_t_bailedout_compilation.seconds() / CompileBroker::_total_bailout_count);
|
||||
tty->print_cr(" On stack replacement : %7.3f s, Average : %2.3f s",
|
||||
CompileBroker::_t_osr_compilation.seconds(),
|
||||
CompileBroker::_t_osr_compilation.seconds() / CompileBroker::_total_osr_compile_count);
|
||||
tty->print_cr(" Invalidated : %7.3f s, Average : %2.3f s",
|
||||
CompileBroker::_t_invalidated_compilation.seconds(),
|
||||
CompileBroker::_t_invalidated_compilation.seconds() / CompileBroker::_total_invalidated_count);
|
||||
|
||||
AbstractCompiler *comp = compiler(CompLevel_simple);
|
||||
if (comp != NULL) {
|
||||
tty->cr();
|
||||
comp->print_timers();
|
||||
}
|
||||
comp = compiler(CompLevel_full_optimization);
|
||||
if (comp != NULL) {
|
||||
tty->cr();
|
||||
comp->print_timers();
|
||||
}
|
||||
tty->cr();
|
||||
tty->print_cr(" Total compiled methods : %6d methods", CompileBroker::_total_compile_count);
|
||||
tty->print_cr(" Standard compilation : %6d methods", CompileBroker::_total_standard_compile_count);
|
||||
tty->print_cr(" On stack replacement : %6d methods", CompileBroker::_total_osr_compile_count);
|
||||
tty->print_cr(" Total compiled methods : %8d methods", CompileBroker::_total_compile_count);
|
||||
tty->print_cr(" Standard compilation : %8d methods", CompileBroker::_total_standard_compile_count);
|
||||
tty->print_cr(" On stack replacement : %8d methods", CompileBroker::_total_osr_compile_count);
|
||||
int tcb = CompileBroker::_sum_osr_bytes_compiled + CompileBroker::_sum_standard_bytes_compiled;
|
||||
tty->print_cr(" Total compiled bytecodes : %6d bytes", tcb);
|
||||
tty->print_cr(" Standard compilation : %6d bytes", CompileBroker::_sum_standard_bytes_compiled);
|
||||
tty->print_cr(" On stack replacement : %6d bytes", CompileBroker::_sum_osr_bytes_compiled);
|
||||
tty->print_cr(" Total compiled bytecodes : %8d bytes", tcb);
|
||||
tty->print_cr(" Standard compilation : %8d bytes", CompileBroker::_sum_standard_bytes_compiled);
|
||||
tty->print_cr(" On stack replacement : %8d bytes", CompileBroker::_sum_osr_bytes_compiled);
|
||||
int bps = (int)(tcb / CompileBroker::_t_total_compilation.seconds());
|
||||
tty->print_cr(" Average compilation speed: %6d bytes/s", bps);
|
||||
tty->print_cr(" Average compilation speed : %8d bytes/s", bps);
|
||||
tty->cr();
|
||||
tty->print_cr(" nmethod code size : %6d bytes", CompileBroker::_sum_nmethod_code_size);
|
||||
tty->print_cr(" nmethod total size : %6d bytes", CompileBroker::_sum_nmethod_size);
|
||||
tty->print_cr(" nmethod code size : %8d bytes", CompileBroker::_sum_nmethod_code_size);
|
||||
tty->print_cr(" nmethod total size : %8d bytes", CompileBroker::_sum_nmethod_size);
|
||||
}
|
||||
|
||||
// Debugging output for failure
|
||||
|
||||
@ -322,6 +322,8 @@ class CompileBroker: AllStatic {
|
||||
static elapsedTimer _t_total_compilation;
|
||||
static elapsedTimer _t_osr_compilation;
|
||||
static elapsedTimer _t_standard_compilation;
|
||||
static elapsedTimer _t_invalidated_compilation;
|
||||
static elapsedTimer _t_bailedout_compilation;
|
||||
|
||||
static int _total_compile_count;
|
||||
static int _total_bailout_count;
|
||||
|
||||
@ -1077,7 +1077,7 @@ IRT_END
|
||||
address SignatureHandlerLibrary::set_handler_blob() {
|
||||
BufferBlob* handler_blob = BufferBlob::create("native signature handlers", blob_size);
|
||||
if (handler_blob == NULL) {
|
||||
CompileBroker::handle_full_code_cache(CodeBlobType::NonMethod);
|
||||
CompileBroker::handle_full_code_cache(CodeBlobType::NonNMethod);
|
||||
return NULL;
|
||||
}
|
||||
address handler = handler_blob->code_begin();
|
||||
|
||||
@ -555,7 +555,7 @@ static void do_liveness(PhaseRegAlloc* regalloc, PhaseCFG* cfg, Block_List* work
|
||||
|
||||
// Collect GC mask info - where are all the OOPs?
|
||||
void Compile::BuildOopMaps() {
|
||||
NOT_PRODUCT( TracePhase t3("bldOopMaps", &_t_buildOopMaps, TimeCompiler); )
|
||||
TracePhase tp("bldOopMaps", &timers[_t_buildOopMaps]);
|
||||
// Can't resource-mark because I need to leave all those OopMaps around,
|
||||
// or else I need to resource-mark some arena other than the default.
|
||||
// ResourceMark rm; // Reclaim all OopFlows when done
|
||||
|
||||
@ -590,9 +590,6 @@
|
||||
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") \
|
||||
\
|
||||
|
||||
@ -147,7 +147,7 @@ void C2Compiler::compile_method(ciEnv* env, ciMethod* target, int entry_bci) {
|
||||
|
||||
|
||||
void C2Compiler::print_timers() {
|
||||
// do nothing
|
||||
Compile::print_timers();
|
||||
}
|
||||
|
||||
int C2Compiler::initial_code_buffer_size() {
|
||||
|
||||
@ -209,7 +209,7 @@ PhaseChaitin::PhaseChaitin(uint unique, PhaseCFG &cfg, Matcher &matcher)
|
||||
, _trace_spilling(TraceSpilling || C->method_has_option("TraceSpilling"))
|
||||
#endif
|
||||
{
|
||||
NOT_PRODUCT( Compile::TracePhase t3("ctorChaitin", &_t_ctorChaitin, TimeCompiler); )
|
||||
Compile::TracePhase tp("ctorChaitin", &timers[_t_ctorChaitin]);
|
||||
|
||||
_high_frequency_lrg = MIN2(double(OPTO_LRG_HIGH_FREQ), _cfg.get_outer_loop_frequency());
|
||||
|
||||
@ -295,6 +295,8 @@ int PhaseChaitin::clone_projs(Block* b, uint idx, Node* orig, Node* copy, uint&
|
||||
|
||||
// Renumber the live ranges to compact them. Makes the IFG smaller.
|
||||
void PhaseChaitin::compact() {
|
||||
Compile::TracePhase tp("chaitinCompact", &timers[_t_chaitinCompact]);
|
||||
|
||||
// Current the _uf_map contains a series of short chains which are headed
|
||||
// by a self-cycle. All the chains run from big numbers to little numbers.
|
||||
// The Find() call chases the chains & shortens them for the next Find call.
|
||||
@ -369,7 +371,7 @@ void PhaseChaitin::Register_Allocate() {
|
||||
#endif
|
||||
|
||||
{
|
||||
NOT_PRODUCT( Compile::TracePhase t3("computeLive", &_t_computeLive, TimeCompiler); )
|
||||
Compile::TracePhase tp("computeLive", &timers[_t_computeLive]);
|
||||
_live = NULL; // Mark live as being not available
|
||||
rm.reset_to_mark(); // Reclaim working storage
|
||||
IndexSet::reset_memory(C, &live_arena);
|
||||
@ -386,7 +388,7 @@ void PhaseChaitin::Register_Allocate() {
|
||||
// at all the GC points, and "stretches" the live range of any base pointer
|
||||
// to the GC point.
|
||||
if (stretch_base_pointer_live_ranges(&live_arena)) {
|
||||
NOT_PRODUCT(Compile::TracePhase t3("computeLive (sbplr)", &_t_computeLive, TimeCompiler);)
|
||||
Compile::TracePhase tp("computeLive (sbplr)", &timers[_t_computeLive]);
|
||||
// Since some live range stretched, I need to recompute live
|
||||
_live = NULL;
|
||||
rm.reset_to_mark(); // Reclaim working storage
|
||||
@ -399,17 +401,19 @@ void PhaseChaitin::Register_Allocate() {
|
||||
// Create the interference graph using virtual copies
|
||||
build_ifg_virtual(); // Include stack slots this time
|
||||
|
||||
// The IFG is/was triangular. I am 'squaring it up' so Union can run
|
||||
// faster. Union requires a 'for all' operation which is slow on the
|
||||
// triangular adjacency matrix (quick reminder: the IFG is 'sparse' -
|
||||
// meaning I can visit all the Nodes neighbors less than a Node in time
|
||||
// O(# of neighbors), but I have to visit all the Nodes greater than a
|
||||
// given Node and search them for an instance, i.e., time O(#MaxLRG)).
|
||||
_ifg->SquareUp();
|
||||
|
||||
// Aggressive (but pessimistic) copy coalescing.
|
||||
// This pass works on virtual copies. Any virtual copies which are not
|
||||
// coalesced get manifested as actual copies
|
||||
{
|
||||
// The IFG is/was triangular. I am 'squaring it up' so Union can run
|
||||
// faster. Union requires a 'for all' operation which is slow on the
|
||||
// triangular adjacency matrix (quick reminder: the IFG is 'sparse' -
|
||||
// meaning I can visit all the Nodes neighbors less than a Node in time
|
||||
// O(# of neighbors), but I have to visit all the Nodes greater than a
|
||||
// given Node and search them for an instance, i.e., time O(#MaxLRG)).
|
||||
_ifg->SquareUp();
|
||||
Compile::TracePhase tp("chaitinCoalesce1", &timers[_t_chaitinCoalesce1]);
|
||||
|
||||
PhaseAggressiveCoalesce coalesce(*this);
|
||||
coalesce.coalesce_driver();
|
||||
@ -424,7 +428,7 @@ void PhaseChaitin::Register_Allocate() {
|
||||
// After aggressive coalesce, attempt a first cut at coloring.
|
||||
// To color, we need the IFG and for that we need LIVE.
|
||||
{
|
||||
NOT_PRODUCT( Compile::TracePhase t3("computeLive", &_t_computeLive, TimeCompiler); )
|
||||
Compile::TracePhase tp("computeLive", &timers[_t_computeLive]);
|
||||
_live = NULL;
|
||||
rm.reset_to_mark(); // Reclaim working storage
|
||||
IndexSet::reset_memory(C, &live_arena);
|
||||
@ -462,7 +466,7 @@ void PhaseChaitin::Register_Allocate() {
|
||||
compact(); // Compact LRGs; return new lower max lrg
|
||||
|
||||
{
|
||||
NOT_PRODUCT( Compile::TracePhase t3("computeLive", &_t_computeLive, TimeCompiler); )
|
||||
Compile::TracePhase tp("computeLive", &timers[_t_computeLive]);
|
||||
_live = NULL;
|
||||
rm.reset_to_mark(); // Reclaim working storage
|
||||
IndexSet::reset_memory(C, &live_arena);
|
||||
@ -476,6 +480,7 @@ void PhaseChaitin::Register_Allocate() {
|
||||
_ifg->Compute_Effective_Degree();
|
||||
// Only do conservative coalescing if requested
|
||||
if (OptoCoalesce) {
|
||||
Compile::TracePhase tp("chaitinCoalesce2", &timers[_t_chaitinCoalesce2]);
|
||||
// Conservative (and pessimistic) copy coalescing of those spills
|
||||
PhaseConservativeCoalesce coalesce(*this);
|
||||
// If max live ranges greater than cutoff, don't color the stack.
|
||||
@ -531,7 +536,7 @@ void PhaseChaitin::Register_Allocate() {
|
||||
|
||||
// Nuke the live-ness and interference graph and LiveRanGe info
|
||||
{
|
||||
NOT_PRODUCT( Compile::TracePhase t3("computeLive", &_t_computeLive, TimeCompiler); )
|
||||
Compile::TracePhase tp("computeLive", &timers[_t_computeLive]);
|
||||
_live = NULL;
|
||||
rm.reset_to_mark(); // Reclaim working storage
|
||||
IndexSet::reset_memory(C, &live_arena);
|
||||
@ -549,6 +554,7 @@ void PhaseChaitin::Register_Allocate() {
|
||||
|
||||
// Only do conservative coalescing if requested
|
||||
if (OptoCoalesce) {
|
||||
Compile::TracePhase tp("chaitinCoalesce3", &timers[_t_chaitinCoalesce3]);
|
||||
// Conservative (and pessimistic) copy coalescing
|
||||
PhaseConservativeCoalesce coalesce(*this);
|
||||
// Check for few live ranges determines how aggressive coalesce is.
|
||||
@ -1054,6 +1060,7 @@ void PhaseChaitin::set_was_low() {
|
||||
|
||||
// Compute cost/area ratio, in case we spill. Build the lo-degree list.
|
||||
void PhaseChaitin::cache_lrg_info( ) {
|
||||
Compile::TracePhase tp("chaitinCacheLRG", &timers[_t_chaitinCacheLRG]);
|
||||
|
||||
for (uint i = 1; i < _lrg_map.max_lrg_id(); i++) {
|
||||
LRG &lrg = lrgs(i);
|
||||
@ -1137,6 +1144,7 @@ void PhaseChaitin::Pre_Simplify( ) {
|
||||
|
||||
// Simplify the IFG by removing LRGs of low degree.
|
||||
void PhaseChaitin::Simplify( ) {
|
||||
Compile::TracePhase tp("chaitinSimplify", &timers[_t_chaitinSimplify]);
|
||||
|
||||
while( 1 ) { // Repeat till simplified it all
|
||||
// May want to explore simplifying lo_degree before _lo_stk_degree.
|
||||
@ -1384,6 +1392,8 @@ OptoReg::Name PhaseChaitin::choose_color( LRG &lrg, int chunk ) {
|
||||
// everything going back is guaranteed a color. Select that color. If some
|
||||
// hi-degree LRG cannot get a color then we record that we must spill.
|
||||
uint PhaseChaitin::Select( ) {
|
||||
Compile::TracePhase tp("chaitinSelect", &timers[_t_chaitinSelect]);
|
||||
|
||||
uint spill_reg = LRG::SPILL_REG;
|
||||
_max_reg = OptoReg::Name(0); // Past max register used
|
||||
while( _simplified ) {
|
||||
@ -1577,7 +1587,7 @@ void PhaseChaitin::fixup_spills() {
|
||||
// This function does only cisc spill work.
|
||||
if( !UseCISCSpill ) return;
|
||||
|
||||
NOT_PRODUCT( Compile::TracePhase t3("fixupSpills", &_t_fixupSpills, TimeCompiler); )
|
||||
Compile::TracePhase tp("fixupSpills", &timers[_t_fixupSpills]);
|
||||
|
||||
// Grab the Frame Pointer
|
||||
Node *fp = _cfg.get_root_block()->head()->in(1)->in(TypeFunc::FramePtr);
|
||||
|
||||
@ -535,7 +535,7 @@ void Compile::init_scratch_buffer_blob(int const_size) {
|
||||
if (scratch_buffer_blob() == NULL) {
|
||||
// Let CompilerBroker disable further compilations.
|
||||
record_failure("Not enough space for scratch buffer in CodeCache");
|
||||
CompileBroker::handle_full_code_cache(CodeBlobType::NonMethod);
|
||||
CompileBroker::handle_full_code_cache(CodeBlobType::NonNMethod);
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -667,16 +667,18 @@ Compile::Compile( ciEnv* ci_env, C2Compiler* compiler, ciMethod* target, int osr
|
||||
C = this;
|
||||
|
||||
CompileWrapper cw(this);
|
||||
#ifndef PRODUCT
|
||||
if (TimeCompiler2) {
|
||||
|
||||
if (CITimeVerbose) {
|
||||
tty->print(" ");
|
||||
target->holder()->name()->print();
|
||||
tty->print(".");
|
||||
target->print_short_name();
|
||||
tty->print(" ");
|
||||
}
|
||||
TraceTime t1("Total compilation time", &_t_totalCompilation, TimeCompiler, TimeCompiler2);
|
||||
TraceTime t2(NULL, &_t_methodCompilation, TimeCompiler, false);
|
||||
TraceTime t1("Total compilation time", &_t_totalCompilation, CITime, CITimeVerbose);
|
||||
TraceTime t2(NULL, &_t_methodCompilation, CITime, false);
|
||||
|
||||
#ifndef PRODUCT
|
||||
bool print_opto_assembly = PrintOptoAssembly || _method->has_option("PrintOptoAssembly");
|
||||
if (!print_opto_assembly) {
|
||||
bool print_assembly = (PrintAssembly || _method->should_print_assembly());
|
||||
@ -726,7 +728,7 @@ Compile::Compile( ciEnv* ci_env, C2Compiler* compiler, ciMethod* target, int osr
|
||||
|
||||
print_inlining_init();
|
||||
{ // Scope for timing the parser
|
||||
TracePhase t3("parse", &_t_parser, true);
|
||||
TracePhase tp("parse", &timers[_t_parser]);
|
||||
|
||||
// Put top into the hash table ASAP.
|
||||
initial_gvn()->transform_no_reclaim(top());
|
||||
@ -888,8 +890,8 @@ Compile::Compile( ciEnv* ci_env, C2Compiler* compiler, ciMethod* target, int osr
|
||||
record_method_not_compilable("+OptoNoExecute"); // Flag as failed
|
||||
return;
|
||||
}
|
||||
TracePhase t2("install_code", &_t_registerMethod, TimeCompiler);
|
||||
#endif
|
||||
TracePhase tp("install_code", &timers[_t_registerMethod]);
|
||||
|
||||
if (is_osr_compilation()) {
|
||||
_code_offsets.set_value(CodeOffsets::Verified_Entry, 0);
|
||||
@ -977,9 +979,10 @@ Compile::Compile( ciEnv* ci_env,
|
||||
_interpreter_frame_size(0) {
|
||||
C = this;
|
||||
|
||||
TraceTime t1(NULL, &_t_totalCompilation, CITime, false);
|
||||
TraceTime t2(NULL, &_t_stubCompilation, CITime, false);
|
||||
|
||||
#ifndef PRODUCT
|
||||
TraceTime t1(NULL, &_t_totalCompilation, TimeCompiler, false);
|
||||
TraceTime t2(NULL, &_t_stubCompilation, TimeCompiler, false);
|
||||
set_print_assembly(PrintFrameConverterAssembly);
|
||||
set_parsed_irreducible_loop(false);
|
||||
#endif
|
||||
@ -1949,30 +1952,38 @@ void Compile::inline_incrementally_one(PhaseIterGVN& igvn) {
|
||||
for_igvn()->clear();
|
||||
gvn->replace_with(&igvn);
|
||||
|
||||
int i = 0;
|
||||
|
||||
for (; i <_late_inlines.length() && !inlining_progress(); i++) {
|
||||
CallGenerator* cg = _late_inlines.at(i);
|
||||
_late_inlines_pos = i+1;
|
||||
cg->do_late_inline();
|
||||
if (failing()) return;
|
||||
{
|
||||
TracePhase tp("incrementalInline_inline", &timers[_t_incrInline_inline]);
|
||||
int i = 0;
|
||||
for (; i <_late_inlines.length() && !inlining_progress(); i++) {
|
||||
CallGenerator* cg = _late_inlines.at(i);
|
||||
_late_inlines_pos = i+1;
|
||||
cg->do_late_inline();
|
||||
if (failing()) return;
|
||||
}
|
||||
int j = 0;
|
||||
for (; i < _late_inlines.length(); i++, j++) {
|
||||
_late_inlines.at_put(j, _late_inlines.at(i));
|
||||
}
|
||||
_late_inlines.trunc_to(j);
|
||||
}
|
||||
int j = 0;
|
||||
for (; i < _late_inlines.length(); i++, j++) {
|
||||
_late_inlines.at_put(j, _late_inlines.at(i));
|
||||
}
|
||||
_late_inlines.trunc_to(j);
|
||||
|
||||
{
|
||||
TracePhase tp("incrementalInline_pru", &timers[_t_incrInline_pru]);
|
||||
ResourceMark rm;
|
||||
PhaseRemoveUseless pru(gvn, for_igvn());
|
||||
}
|
||||
|
||||
igvn = PhaseIterGVN(gvn);
|
||||
{
|
||||
TracePhase tp("incrementalInline_igvn", &timers[_t_incrInline_igvn]);
|
||||
igvn = PhaseIterGVN(gvn);
|
||||
}
|
||||
}
|
||||
|
||||
// Perform incremental inlining until bound on number of live nodes is reached
|
||||
void Compile::inline_incrementally(PhaseIterGVN& igvn) {
|
||||
TracePhase tp("incrementalInline", &timers[_t_incrInline]);
|
||||
|
||||
PhaseGVN* gvn = initial_gvn();
|
||||
|
||||
set_inlining_incrementally(true);
|
||||
@ -1983,6 +1994,7 @@ void Compile::inline_incrementally(PhaseIterGVN& igvn) {
|
||||
|
||||
if (live_nodes() > (uint)LiveNodeCountInliningCutoff) {
|
||||
if (low_live_nodes < (uint)LiveNodeCountInliningCutoff * 8 / 10) {
|
||||
TracePhase tp("incrementalInline_ideal", &timers[_t_incrInline_ideal]);
|
||||
// PhaseIdealLoop is expensive so we only try it once we are
|
||||
// out of live nodes and we only try it again if the previous
|
||||
// helped got the number of nodes down significantly
|
||||
@ -2001,7 +2013,10 @@ void Compile::inline_incrementally(PhaseIterGVN& igvn) {
|
||||
|
||||
if (failing()) return;
|
||||
|
||||
igvn.optimize();
|
||||
{
|
||||
TracePhase tp("incrementalInline_igvn", &timers[_t_incrInline_igvn]);
|
||||
igvn.optimize();
|
||||
}
|
||||
|
||||
if (failing()) return;
|
||||
}
|
||||
@ -2018,13 +2033,16 @@ void Compile::inline_incrementally(PhaseIterGVN& igvn) {
|
||||
if (failing()) return;
|
||||
|
||||
{
|
||||
TracePhase tp("incrementalInline_pru", &timers[_t_incrInline_pru]);
|
||||
ResourceMark rm;
|
||||
PhaseRemoveUseless pru(initial_gvn(), for_igvn());
|
||||
}
|
||||
|
||||
igvn = PhaseIterGVN(gvn);
|
||||
|
||||
igvn.optimize();
|
||||
{
|
||||
TracePhase tp("incrementalInline_igvn", &timers[_t_incrInline_igvn]);
|
||||
igvn = PhaseIterGVN(gvn);
|
||||
igvn.optimize();
|
||||
}
|
||||
}
|
||||
|
||||
set_inlining_incrementally(false);
|
||||
@ -2034,7 +2052,7 @@ void Compile::inline_incrementally(PhaseIterGVN& igvn) {
|
||||
//------------------------------Optimize---------------------------------------
|
||||
// Given a graph, optimize it.
|
||||
void Compile::Optimize() {
|
||||
TracePhase t1("optimizer", &_t_optimizer, true);
|
||||
TracePhase tp("optimizer", &timers[_t_optimizer]);
|
||||
|
||||
#ifndef PRODUCT
|
||||
if (env()->break_at_compile()) {
|
||||
@ -2060,7 +2078,7 @@ void Compile::Optimize() {
|
||||
_modified_nodes = new (comp_arena()) Unique_Node_List(comp_arena());
|
||||
#endif
|
||||
{
|
||||
NOT_PRODUCT( TracePhase t2("iterGVN", &_t_iterGVN, TimeCompiler); )
|
||||
TracePhase tp("iterGVN", &timers[_t_iterGVN]);
|
||||
igvn.optimize();
|
||||
}
|
||||
|
||||
@ -2068,17 +2086,13 @@ void Compile::Optimize() {
|
||||
|
||||
if (failing()) return;
|
||||
|
||||
{
|
||||
NOT_PRODUCT( TracePhase t2("incrementalInline", &_t_incrInline, TimeCompiler); )
|
||||
inline_incrementally(igvn);
|
||||
}
|
||||
inline_incrementally(igvn);
|
||||
|
||||
print_method(PHASE_INCREMENTAL_INLINE, 2);
|
||||
|
||||
if (failing()) return;
|
||||
|
||||
if (eliminate_boxing()) {
|
||||
NOT_PRODUCT( TracePhase t2("incrementalInline", &_t_incrInline, TimeCompiler); )
|
||||
// Inline valueOf() methods now.
|
||||
inline_boxing_calls(igvn);
|
||||
|
||||
@ -2105,7 +2119,7 @@ void Compile::Optimize() {
|
||||
if (_do_escape_analysis && ConnectionGraph::has_candidates(this)) {
|
||||
if (has_loops()) {
|
||||
// Cleanup graph (remove dead nodes).
|
||||
TracePhase t2("idealLoop", &_t_idealLoop, true);
|
||||
TracePhase tp("idealLoop", &timers[_t_idealLoop]);
|
||||
PhaseIdealLoop ideal_loop( igvn, false, true );
|
||||
if (major_progress()) print_method(PHASE_PHASEIDEAL_BEFORE_EA, 2);
|
||||
if (failing()) return;
|
||||
@ -2121,7 +2135,7 @@ void Compile::Optimize() {
|
||||
if (failing()) return;
|
||||
|
||||
if (congraph() != NULL && macro_count() > 0) {
|
||||
NOT_PRODUCT( TracePhase t2("macroEliminate", &_t_macroEliminate, TimeCompiler); )
|
||||
TracePhase tp("macroEliminate", &timers[_t_macroEliminate]);
|
||||
PhaseMacroExpand mexp(igvn);
|
||||
mexp.eliminate_macro_nodes();
|
||||
igvn.set_delay_transform(false);
|
||||
@ -2140,7 +2154,7 @@ void Compile::Optimize() {
|
||||
loop_opts_cnt = num_loop_opts();
|
||||
if((loop_opts_cnt > 0) && (has_loops() || has_split_ifs())) {
|
||||
{
|
||||
TracePhase t2("idealLoop", &_t_idealLoop, true);
|
||||
TracePhase tp("idealLoop", &timers[_t_idealLoop]);
|
||||
PhaseIdealLoop ideal_loop( igvn, true );
|
||||
loop_opts_cnt--;
|
||||
if (major_progress()) print_method(PHASE_PHASEIDEALLOOP1, 2);
|
||||
@ -2148,7 +2162,7 @@ void Compile::Optimize() {
|
||||
}
|
||||
// Loop opts pass if partial peeling occurred in previous pass
|
||||
if(PartialPeelLoop && major_progress() && (loop_opts_cnt > 0)) {
|
||||
TracePhase t3("idealLoop", &_t_idealLoop, true);
|
||||
TracePhase tp("idealLoop", &timers[_t_idealLoop]);
|
||||
PhaseIdealLoop ideal_loop( igvn, false );
|
||||
loop_opts_cnt--;
|
||||
if (major_progress()) print_method(PHASE_PHASEIDEALLOOP2, 2);
|
||||
@ -2156,14 +2170,14 @@ void Compile::Optimize() {
|
||||
}
|
||||
// Loop opts pass for loop-unrolling before CCP
|
||||
if(major_progress() && (loop_opts_cnt > 0)) {
|
||||
TracePhase t4("idealLoop", &_t_idealLoop, true);
|
||||
TracePhase tp("idealLoop", &timers[_t_idealLoop]);
|
||||
PhaseIdealLoop ideal_loop( igvn, false );
|
||||
loop_opts_cnt--;
|
||||
if (major_progress()) print_method(PHASE_PHASEIDEALLOOP3, 2);
|
||||
}
|
||||
if (!failing()) {
|
||||
// Verify that last round of loop opts produced a valid graph
|
||||
NOT_PRODUCT( TracePhase t2("idealLoopVerify", &_t_idealLoopVerify, TimeCompiler); )
|
||||
TracePhase tp("idealLoopVerify", &timers[_t_idealLoopVerify]);
|
||||
PhaseIdealLoop::verify(igvn);
|
||||
}
|
||||
}
|
||||
@ -2173,7 +2187,7 @@ void Compile::Optimize() {
|
||||
PhaseCCP ccp( &igvn );
|
||||
assert( true, "Break here to ccp.dump_nodes_and_types(_root,999,1)");
|
||||
{
|
||||
TracePhase t2("ccp", &_t_ccp, true);
|
||||
TracePhase tp("ccp", &timers[_t_ccp]);
|
||||
ccp.do_transform();
|
||||
}
|
||||
print_method(PHASE_CPP1, 2);
|
||||
@ -2182,7 +2196,7 @@ void Compile::Optimize() {
|
||||
|
||||
// Iterative Global Value Numbering, including ideal transforms
|
||||
{
|
||||
NOT_PRODUCT( TracePhase t2("iterGVN2", &_t_iterGVN2, TimeCompiler); )
|
||||
TracePhase tp("iterGVN2", &timers[_t_iterGVN2]);
|
||||
igvn = ccp;
|
||||
igvn.optimize();
|
||||
}
|
||||
@ -2196,7 +2210,7 @@ void Compile::Optimize() {
|
||||
if(loop_opts_cnt > 0) {
|
||||
debug_only( int cnt = 0; );
|
||||
while(major_progress() && (loop_opts_cnt > 0)) {
|
||||
TracePhase t2("idealLoop", &_t_idealLoop, true);
|
||||
TracePhase tp("idealLoop", &timers[_t_idealLoop]);
|
||||
assert( cnt++ < 40, "infinite cycle in loop optimization" );
|
||||
PhaseIdealLoop ideal_loop( igvn, true);
|
||||
loop_opts_cnt--;
|
||||
@ -2208,12 +2222,12 @@ void Compile::Optimize() {
|
||||
{
|
||||
// Verify that all previous optimizations produced a valid graph
|
||||
// at least to this point, even if no loop optimizations were done.
|
||||
NOT_PRODUCT( TracePhase t2("idealLoopVerify", &_t_idealLoopVerify, TimeCompiler); )
|
||||
TracePhase tp("idealLoopVerify", &timers[_t_idealLoopVerify]);
|
||||
PhaseIdealLoop::verify(igvn);
|
||||
}
|
||||
|
||||
{
|
||||
NOT_PRODUCT( TracePhase t2("macroExpand", &_t_macroExpand, TimeCompiler); )
|
||||
TracePhase tp("macroExpand", &timers[_t_macroExpand]);
|
||||
PhaseMacroExpand mex(igvn);
|
||||
if (mex.expand_macro_nodes()) {
|
||||
assert(failing(), "must bail out w/ explicit message");
|
||||
@ -2227,7 +2241,7 @@ void Compile::Optimize() {
|
||||
process_print_inlining();
|
||||
// A method with only infinite loops has no edges entering loops from root
|
||||
{
|
||||
NOT_PRODUCT( TracePhase t2("graphReshape", &_t_graphReshaping, TimeCompiler); )
|
||||
TracePhase tp("graphReshape", &timers[_t_graphReshaping]);
|
||||
if (final_graph_reshaping()) {
|
||||
assert(failing(), "must bail out w/ explicit message");
|
||||
return;
|
||||
@ -2258,7 +2272,7 @@ void Compile::Code_Gen() {
|
||||
Matcher matcher;
|
||||
_matcher = &matcher;
|
||||
{
|
||||
TracePhase t2("matcher", &_t_matcher, true);
|
||||
TracePhase tp("matcher", &timers[_t_matcher]);
|
||||
matcher.match();
|
||||
}
|
||||
// In debug mode can dump m._nodes.dump() for mapping of ideal to machine
|
||||
@ -2275,7 +2289,7 @@ void Compile::Code_Gen() {
|
||||
PhaseCFG cfg(node_arena(), root(), matcher);
|
||||
_cfg = &cfg;
|
||||
{
|
||||
NOT_PRODUCT( TracePhase t2("scheduler", &_t_scheduler, TimeCompiler); )
|
||||
TracePhase tp("scheduler", &timers[_t_scheduler]);
|
||||
bool success = cfg.do_global_code_motion();
|
||||
if (!success) {
|
||||
return;
|
||||
@ -2289,7 +2303,7 @@ void Compile::Code_Gen() {
|
||||
PhaseChaitin regalloc(unique(), cfg, matcher);
|
||||
_regalloc = ®alloc;
|
||||
{
|
||||
TracePhase t2("regalloc", &_t_registerAllocation, true);
|
||||
TracePhase tp("regalloc", &timers[_t_registerAllocation]);
|
||||
// Perform register allocation. After Chaitin, use-def chains are
|
||||
// no longer accurate (at spill code) and so must be ignored.
|
||||
// Node->LRG->reg mappings are still accurate.
|
||||
@ -2306,7 +2320,7 @@ void Compile::Code_Gen() {
|
||||
// are not adding any new instructions. If any basic block is empty, we
|
||||
// can now safely remove it.
|
||||
{
|
||||
NOT_PRODUCT( TracePhase t2("blockOrdering", &_t_blockOrdering, TimeCompiler); )
|
||||
TracePhase tp("blockOrdering", &timers[_t_blockOrdering]);
|
||||
cfg.remove_empty_blocks();
|
||||
if (do_freq_based_layout()) {
|
||||
PhaseBlockLayout layout(cfg);
|
||||
@ -2318,22 +2332,20 @@ void Compile::Code_Gen() {
|
||||
|
||||
// Apply peephole optimizations
|
||||
if( OptoPeephole ) {
|
||||
NOT_PRODUCT( TracePhase t2("peephole", &_t_peephole, TimeCompiler); )
|
||||
TracePhase tp("peephole", &timers[_t_peephole]);
|
||||
PhasePeephole peep( _regalloc, cfg);
|
||||
peep.do_transform();
|
||||
}
|
||||
|
||||
// Do late expand if CPU requires this.
|
||||
if (Matcher::require_postalloc_expand) {
|
||||
NOT_PRODUCT(TracePhase t2c("postalloc_expand", &_t_postalloc_expand, true));
|
||||
TracePhase tp("postalloc_expand", &timers[_t_postalloc_expand]);
|
||||
cfg.postalloc_expand(_regalloc);
|
||||
}
|
||||
|
||||
// Convert Nodes to instruction bits in a buffer
|
||||
{
|
||||
// %%%% workspace merge brought two timers together for one job
|
||||
TracePhase t2a("output", &_t_output, true);
|
||||
NOT_PRODUCT( TraceTime t2b(NULL, &_t_codeGeneration, TimeCompiler, false); )
|
||||
TraceTime tp("output", &timers[_t_output], CITime);
|
||||
Output();
|
||||
}
|
||||
|
||||
@ -3538,11 +3550,11 @@ void Compile::record_failure(const char* reason) {
|
||||
_root = NULL; // flush the graph, too
|
||||
}
|
||||
|
||||
Compile::TracePhase::TracePhase(const char* name, elapsedTimer* accumulator, bool dolog)
|
||||
: TraceTime(NULL, accumulator, false NOT_PRODUCT( || TimeCompiler ), false),
|
||||
_phase_name(name), _dolog(dolog)
|
||||
Compile::TracePhase::TracePhase(const char* name, elapsedTimer* accumulator)
|
||||
: TraceTime(name, accumulator, CITime, CITimeVerbose),
|
||||
_phase_name(name), _dolog(CITimeVerbose)
|
||||
{
|
||||
if (dolog) {
|
||||
if (_dolog) {
|
||||
C = Compile::current();
|
||||
_log = C->log();
|
||||
} else {
|
||||
|
||||
@ -97,10 +97,10 @@ class Compile : public Phase {
|
||||
AliasIdxRaw = 3 // hard-wired index for TypeRawPtr::BOTTOM
|
||||
};
|
||||
|
||||
// Variant of TraceTime(NULL, &_t_accumulator, TimeCompiler);
|
||||
// Integrated with logging. If logging is turned on, and dolog is true,
|
||||
// Variant of TraceTime(NULL, &_t_accumulator, CITime);
|
||||
// Integrated with logging. If logging is turned on, and CITimeVerbose is true,
|
||||
// then brackets are put into the log, with time stamps and node counts.
|
||||
// (The time collection itself is always conditionalized on TimeCompiler.)
|
||||
// (The time collection itself is always conditionalized on CITime.)
|
||||
class TracePhase : public TraceTime {
|
||||
private:
|
||||
Compile* C;
|
||||
@ -108,7 +108,7 @@ class Compile : public Phase {
|
||||
const char* _phase_name;
|
||||
bool _dolog;
|
||||
public:
|
||||
TracePhase(const char* name, elapsedTimer* accumulator, bool dolog);
|
||||
TracePhase(const char* name, elapsedTimer* accumulator);
|
||||
~TracePhase();
|
||||
};
|
||||
|
||||
|
||||
@ -82,7 +82,7 @@ bool ConnectionGraph::has_candidates(Compile *C) {
|
||||
}
|
||||
|
||||
void ConnectionGraph::do_analysis(Compile *C, PhaseIterGVN *igvn) {
|
||||
Compile::TracePhase t2("escapeAnalysis", &Phase::_t_escapeAnalysis, true);
|
||||
Compile::TracePhase tp("escapeAnalysis", &Phase::timers[Phase::_t_escapeAnalysis]);
|
||||
ResourceMark rm;
|
||||
|
||||
// Add ConP#NULL and ConN#NULL nodes before ConnectionGraph construction
|
||||
@ -117,7 +117,7 @@ bool ConnectionGraph::compute_escape() {
|
||||
GrowableArray<FieldNode*> oop_fields_worklist;
|
||||
DEBUG_ONLY( GrowableArray<Node*> addp_worklist; )
|
||||
|
||||
{ Compile::TracePhase t3("connectionGraph", &Phase::_t_connectionGraph, true);
|
||||
{ Compile::TracePhase tp("connectionGraph", &Phase::timers[Phase::_t_connectionGraph]);
|
||||
|
||||
// 1. Populate Connection Graph (CG) with PointsTo nodes.
|
||||
ideal_nodes.map(C->live_nodes(), NULL); // preallocate space
|
||||
@ -2839,6 +2839,13 @@ void ConnectionGraph::split_unique_types(GrowableArray<Node *> &alloc_worklist)
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
const TypeOopPtr *t = igvn->type(n)->isa_oopptr();
|
||||
if (t == NULL)
|
||||
continue; // not a TypeOopPtr
|
||||
if (!t->klass_is_exact())
|
||||
continue; // not an unique type
|
||||
|
||||
if (alloc->is_Allocate()) {
|
||||
// Set the scalar_replaceable flag for allocation
|
||||
// so it could be eliminated.
|
||||
@ -2857,10 +2864,7 @@ void ConnectionGraph::split_unique_types(GrowableArray<Node *> &alloc_worklist)
|
||||
// - not determined to be ineligible by escape analysis
|
||||
set_map(alloc, n);
|
||||
set_map(n, alloc);
|
||||
const TypeOopPtr *t = igvn->type(n)->isa_oopptr();
|
||||
if (t == NULL)
|
||||
continue; // not a TypeOopPtr
|
||||
const TypeOopPtr* tinst = t->cast_to_exactness(true)->is_oopptr()->cast_to_instance_id(ni);
|
||||
const TypeOopPtr* tinst = t->cast_to_instance_id(ni);
|
||||
igvn->hash_delete(n);
|
||||
igvn->set_type(n, tinst);
|
||||
n->raise_bottom_type(tinst);
|
||||
|
||||
@ -306,6 +306,7 @@ void PhaseChaitin::interfere_with_live(uint lid, IndexSet* liveout) {
|
||||
// at this point can end up in bad places). Copies I re-insert later I have
|
||||
// more opportunity to insert them in low-frequency locations.
|
||||
void PhaseChaitin::build_ifg_virtual( ) {
|
||||
Compile::TracePhase tp("buildIFG_virt", &timers[_t_buildIFGvirtual]);
|
||||
|
||||
// For all blocks (in any order) do...
|
||||
for (uint i = 0; i < _cfg.number_of_blocks(); i++) {
|
||||
@ -739,7 +740,7 @@ void PhaseChaitin::adjust_high_pressure_index(Block* b, uint& block_hrp_index, P
|
||||
* low to high register pressure transition within the block (if any).
|
||||
*/
|
||||
uint PhaseChaitin::build_ifg_physical( ResourceArea *a ) {
|
||||
NOT_PRODUCT(Compile::TracePhase t3("buildIFG", &_t_buildIFGphysical, TimeCompiler);)
|
||||
Compile::TracePhase tp("buildIFG", &timers[_t_buildIFGphysical]);
|
||||
|
||||
uint must_spill = 0;
|
||||
for (uint i = 0; i < _cfg.number_of_blocks(); i++) {
|
||||
|
||||
@ -1166,7 +1166,7 @@ CodeBuffer* Compile::init_buffer(uint* blk_starts) {
|
||||
// Have we run out of code space?
|
||||
if ((cb->blob() == NULL) || (!CompileBroker::should_compile_new_jobs())) {
|
||||
C->record_failure("CodeCache is full");
|
||||
CompileBroker::handle_full_code_cache(CodeBlobType::NonMethod);
|
||||
CompileBroker::handle_full_code_cache(CodeBlobType::NonNMethod);
|
||||
return NULL;
|
||||
}
|
||||
// Configure the code buffer.
|
||||
@ -1491,7 +1491,7 @@ void Compile::fill_buffer(CodeBuffer* cb, uint* blk_starts) {
|
||||
cb->insts()->maybe_expand_to_ensure_remaining(MAX_inst_size);
|
||||
if ((cb->blob() == NULL) || (!CompileBroker::should_compile_new_jobs())) {
|
||||
C->record_failure("CodeCache is full");
|
||||
CompileBroker::handle_full_code_cache(CodeBlobType::NonMethod);
|
||||
CompileBroker::handle_full_code_cache(CodeBlobType::NonNMethod);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -1648,7 +1648,7 @@ void Compile::fill_buffer(CodeBuffer* cb, uint* blk_starts) {
|
||||
// One last check for failed CodeBuffer::expand:
|
||||
if ((cb->blob() == NULL) || (!CompileBroker::should_compile_new_jobs())) {
|
||||
C->record_failure("CodeCache is full");
|
||||
CompileBroker::handle_full_code_cache(CodeBlobType::NonMethod);
|
||||
CompileBroker::handle_full_code_cache(CodeBlobType::NonNMethod);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -1887,7 +1887,7 @@ void Compile::ScheduleAndBundle() {
|
||||
if (max_vector_size() > 8)
|
||||
return;
|
||||
|
||||
NOT_PRODUCT( TracePhase t2("isched", &_t_instrSched, TimeCompiler); )
|
||||
TracePhase tp("isched", &timers[_t_instrSched]);
|
||||
|
||||
// Create a data structure for all the scheduling information
|
||||
Scheduling scheduling(Thread::current()->resource_area(), *this);
|
||||
|
||||
@ -528,7 +528,7 @@ Parse::Parse(JVMState* caller, ciMethod* parse_method, float expected_uses)
|
||||
methods_parsed++;
|
||||
#ifndef PRODUCT
|
||||
// add method size here to guarantee that inlined methods are added too
|
||||
if (TimeCompiler)
|
||||
if (CITime)
|
||||
_total_bytes_compiled += method()->code_size();
|
||||
|
||||
show_parse_info();
|
||||
|
||||
@ -30,56 +30,14 @@
|
||||
#include "opto/node.hpp"
|
||||
#include "opto/phase.hpp"
|
||||
|
||||
#ifndef PRODUCT
|
||||
int Phase::_total_bytes_compiled = 0;
|
||||
|
||||
elapsedTimer Phase::_t_totalCompilation;
|
||||
elapsedTimer Phase::_t_methodCompilation;
|
||||
elapsedTimer Phase::_t_stubCompilation;
|
||||
#endif
|
||||
|
||||
// The next timers used for LogCompilation
|
||||
elapsedTimer Phase::_t_parser;
|
||||
elapsedTimer Phase::_t_optimizer;
|
||||
elapsedTimer Phase::_t_escapeAnalysis;
|
||||
elapsedTimer Phase::_t_connectionGraph;
|
||||
elapsedTimer Phase::_t_idealLoop;
|
||||
elapsedTimer Phase::_t_ccp;
|
||||
elapsedTimer Phase::_t_matcher;
|
||||
elapsedTimer Phase::_t_registerAllocation;
|
||||
elapsedTimer Phase::_t_output;
|
||||
|
||||
#ifndef PRODUCT
|
||||
elapsedTimer Phase::_t_graphReshaping;
|
||||
elapsedTimer Phase::_t_scheduler;
|
||||
elapsedTimer Phase::_t_blockOrdering;
|
||||
elapsedTimer Phase::_t_macroEliminate;
|
||||
elapsedTimer Phase::_t_macroExpand;
|
||||
elapsedTimer Phase::_t_peephole;
|
||||
elapsedTimer Phase::_t_postalloc_expand;
|
||||
elapsedTimer Phase::_t_codeGeneration;
|
||||
elapsedTimer Phase::_t_registerMethod;
|
||||
elapsedTimer Phase::_t_temporaryTimer1;
|
||||
elapsedTimer Phase::_t_temporaryTimer2;
|
||||
elapsedTimer Phase::_t_idealLoopVerify;
|
||||
|
||||
// Subtimers for _t_optimizer
|
||||
elapsedTimer Phase::_t_iterGVN;
|
||||
elapsedTimer Phase::_t_iterGVN2;
|
||||
elapsedTimer Phase::_t_incrInline;
|
||||
|
||||
// Subtimers for _t_registerAllocation
|
||||
elapsedTimer Phase::_t_ctorChaitin;
|
||||
elapsedTimer Phase::_t_buildIFGphysical;
|
||||
elapsedTimer Phase::_t_computeLive;
|
||||
elapsedTimer Phase::_t_regAllocSplit;
|
||||
elapsedTimer Phase::_t_postAllocCopyRemoval;
|
||||
elapsedTimer Phase::_t_fixupSpills;
|
||||
|
||||
// Subtimers for _t_output
|
||||
elapsedTimer Phase::_t_instrSched;
|
||||
elapsedTimer Phase::_t_buildOopMaps;
|
||||
#endif
|
||||
// The counters to use for LogCompilation
|
||||
elapsedTimer Phase::timers[max_phase_timers];
|
||||
|
||||
//------------------------------Phase------------------------------------------
|
||||
Phase::Phase( PhaseNumber pnum ) : _pnum(pnum), C( pnum == Compiler ? NULL : Compile::current()) {
|
||||
@ -89,93 +47,132 @@ Phase::Phase( PhaseNumber pnum ) : _pnum(pnum), C( pnum == Compiler ? NULL : Com
|
||||
CompileBroker::maybe_block();
|
||||
}
|
||||
|
||||
#ifndef PRODUCT
|
||||
static const double minimum_reported_time = 0.0001; // seconds
|
||||
static const double expected_method_compile_coverage = 0.97; // %
|
||||
static const double minimum_meaningful_method_compile = 2.00; // seconds
|
||||
|
||||
void Phase::print_timers() {
|
||||
tty->print_cr ("Accumulated compiler times:");
|
||||
tty->print_cr ("---------------------------");
|
||||
tty->print_cr (" Total compilation: %3.3f sec.", Phase::_t_totalCompilation.seconds());
|
||||
tty->print (" method compilation : %3.3f sec", Phase::_t_methodCompilation.seconds());
|
||||
tty->print ("/%d bytes",_total_bytes_compiled);
|
||||
tty->print_cr (" (%3.0f bytes per sec) ", Phase::_total_bytes_compiled / Phase::_t_methodCompilation.seconds());
|
||||
tty->print_cr (" stub compilation : %3.3f sec.", Phase::_t_stubCompilation.seconds());
|
||||
tty->print_cr (" Phases:");
|
||||
tty->print_cr (" parse : %3.3f sec", Phase::_t_parser.seconds());
|
||||
tty->print_cr (" optimizer : %3.3f sec", Phase::_t_optimizer.seconds());
|
||||
if( Verbose || WizardMode ) {
|
||||
tty->print_cr (" C2 Compile Time: %7.3f s", Phase::_t_totalCompilation.seconds());
|
||||
tty->print_cr (" Parse: %7.3f s", timers[_t_parser].seconds());
|
||||
|
||||
{
|
||||
tty->print_cr (" Optimize: %7.3f s", timers[_t_optimizer].seconds());
|
||||
if (DoEscapeAnalysis) {
|
||||
// EA is part of Optimizer.
|
||||
tty->print_cr (" escape analysis: %3.3f sec", Phase::_t_escapeAnalysis.seconds());
|
||||
tty->print_cr (" connection graph: %3.3f sec", Phase::_t_connectionGraph.seconds());
|
||||
tty->print_cr (" macroEliminate : %3.3f sec", Phase::_t_macroEliminate.seconds());
|
||||
tty->print_cr (" Escape Analysis: %7.3f s", timers[_t_escapeAnalysis].seconds());
|
||||
tty->print_cr (" Conn Graph: %7.3f s", timers[_t_connectionGraph].seconds());
|
||||
tty->print_cr (" Macro Eliminate: %7.3f s", timers[_t_macroEliminate].seconds());
|
||||
}
|
||||
tty->print_cr (" GVN 1: %7.3f s", timers[_t_iterGVN].seconds());
|
||||
|
||||
{
|
||||
tty->print_cr (" Incremental Inline: %7.3f s", timers[_t_incrInline].seconds());
|
||||
tty->print_cr (" IdealLoop: %7.3f s", timers[_t_incrInline_ideal].seconds());
|
||||
tty->print_cr (" IGVN: %7.3f s", timers[_t_incrInline_igvn].seconds());
|
||||
tty->print_cr (" Inline: %7.3f s", timers[_t_incrInline_inline].seconds());
|
||||
tty->print_cr (" Prune Useless: %7.3f s", timers[_t_incrInline_pru].seconds());
|
||||
|
||||
double other = timers[_t_incrInline].seconds() -
|
||||
(timers[_t_incrInline_ideal].seconds() +
|
||||
timers[_t_incrInline_igvn].seconds() +
|
||||
timers[_t_incrInline_inline].seconds() +
|
||||
timers[_t_incrInline_pru].seconds());
|
||||
if (other > 0) {
|
||||
tty->print_cr(" Other: %7.3f s", other);
|
||||
}
|
||||
}
|
||||
tty->print_cr (" IdealLoop: %7.3f s", timers[_t_idealLoop].seconds());
|
||||
tty->print_cr (" IdealLoop Verify: %7.3f s", timers[_t_idealLoopVerify].seconds());
|
||||
tty->print_cr (" Cond Const Prop: %7.3f s", timers[_t_ccp].seconds());
|
||||
tty->print_cr (" GVN 2: %7.3f s", timers[_t_iterGVN2].seconds());
|
||||
tty->print_cr (" Macro Expand: %7.3f s", timers[_t_macroExpand].seconds());
|
||||
tty->print_cr (" Graph Reshape: %7.3f s", timers[_t_graphReshaping].seconds());
|
||||
|
||||
double other = timers[_t_optimizer].seconds() -
|
||||
(timers[_t_escapeAnalysis].seconds() +
|
||||
timers[_t_iterGVN].seconds() +
|
||||
timers[_t_incrInline].seconds() +
|
||||
timers[_t_idealLoop].seconds() +
|
||||
timers[_t_idealLoopVerify].seconds() +
|
||||
timers[_t_ccp].seconds() +
|
||||
timers[_t_iterGVN2].seconds() +
|
||||
timers[_t_macroExpand].seconds() +
|
||||
timers[_t_graphReshaping].seconds());
|
||||
if (other > 0) {
|
||||
tty->print_cr(" Other: %7.3f s", other);
|
||||
}
|
||||
tty->print_cr (" iterGVN : %3.3f sec", Phase::_t_iterGVN.seconds());
|
||||
tty->print_cr (" incrInline : %3.3f sec", Phase::_t_incrInline.seconds());
|
||||
tty->print_cr (" idealLoop : %3.3f sec", Phase::_t_idealLoop.seconds());
|
||||
tty->print_cr (" idealLoopVerify: %3.3f sec", Phase::_t_idealLoopVerify.seconds());
|
||||
tty->print_cr (" ccp : %3.3f sec", Phase::_t_ccp.seconds());
|
||||
tty->print_cr (" iterGVN2 : %3.3f sec", Phase::_t_iterGVN2.seconds());
|
||||
tty->print_cr (" macroExpand : %3.3f sec", Phase::_t_macroExpand.seconds());
|
||||
tty->print_cr (" graphReshape : %3.3f sec", Phase::_t_graphReshaping.seconds());
|
||||
double optimizer_subtotal = Phase::_t_iterGVN.seconds() + Phase::_t_iterGVN2.seconds() +
|
||||
Phase::_t_escapeAnalysis.seconds() + Phase::_t_macroEliminate.seconds() +
|
||||
Phase::_t_idealLoop.seconds() + Phase::_t_ccp.seconds() +
|
||||
Phase::_t_macroExpand.seconds() + Phase::_t_graphReshaping.seconds();
|
||||
double percent_of_optimizer = ((optimizer_subtotal == 0.0) ? 0.0 : (optimizer_subtotal / Phase::_t_optimizer.seconds() * 100.0));
|
||||
tty->print_cr (" subtotal : %3.3f sec, %3.2f %%", optimizer_subtotal, percent_of_optimizer);
|
||||
}
|
||||
tty->print_cr (" matcher : %3.3f sec", Phase::_t_matcher.seconds());
|
||||
tty->print_cr (" scheduler : %3.3f sec", Phase::_t_scheduler.seconds());
|
||||
tty->print_cr (" regalloc : %3.3f sec", Phase::_t_registerAllocation.seconds());
|
||||
if( Verbose || WizardMode ) {
|
||||
tty->print_cr (" ctorChaitin : %3.3f sec", Phase::_t_ctorChaitin.seconds());
|
||||
tty->print_cr (" buildIFG : %3.3f sec", Phase::_t_buildIFGphysical.seconds());
|
||||
tty->print_cr (" computeLive : %3.3f sec", Phase::_t_computeLive.seconds());
|
||||
tty->print_cr (" regAllocSplit : %3.3f sec", Phase::_t_regAllocSplit.seconds());
|
||||
tty->print_cr (" postAllocCopyRemoval: %3.3f sec", Phase::_t_postAllocCopyRemoval.seconds());
|
||||
tty->print_cr (" fixupSpills : %3.3f sec", Phase::_t_fixupSpills.seconds());
|
||||
double regalloc_subtotal = Phase::_t_ctorChaitin.seconds() +
|
||||
Phase::_t_buildIFGphysical.seconds() + Phase::_t_computeLive.seconds() +
|
||||
Phase::_t_regAllocSplit.seconds() + Phase::_t_fixupSpills.seconds() +
|
||||
Phase::_t_postAllocCopyRemoval.seconds();
|
||||
double percent_of_regalloc = ((regalloc_subtotal == 0.0) ? 0.0 : (regalloc_subtotal / Phase::_t_registerAllocation.seconds() * 100.0));
|
||||
tty->print_cr (" subtotal : %3.3f sec, %3.2f %%", regalloc_subtotal, percent_of_regalloc);
|
||||
|
||||
tty->print_cr (" Matcher: %7.3f s", timers[_t_matcher].seconds());
|
||||
tty->print_cr (" Scheduler: %7.3f s", timers[_t_scheduler].seconds());
|
||||
|
||||
{
|
||||
tty->print_cr (" Regalloc: %7.3f s", timers[_t_registerAllocation].seconds());
|
||||
tty->print_cr (" Ctor Chaitin: %7.3f s", timers[_t_ctorChaitin].seconds());
|
||||
tty->print_cr (" Build IFG (virt): %7.3f s", timers[_t_buildIFGvirtual].seconds());
|
||||
tty->print_cr (" Build IFG (phys): %7.3f s", timers[_t_buildIFGphysical].seconds());
|
||||
tty->print_cr (" Compute Liveness: %7.3f s", timers[_t_computeLive].seconds());
|
||||
tty->print_cr (" Regalloc Split: %7.3f s", timers[_t_regAllocSplit].seconds());
|
||||
tty->print_cr (" Postalloc Copy Rem: %7.3f s", timers[_t_postAllocCopyRemoval].seconds());
|
||||
tty->print_cr (" Fixup Spills: %7.3f s", timers[_t_fixupSpills].seconds());
|
||||
tty->print_cr (" Compact: %7.3f s", timers[_t_chaitinCompact].seconds());
|
||||
tty->print_cr (" Coalesce 1: %7.3f s", timers[_t_chaitinCoalesce1].seconds());
|
||||
tty->print_cr (" Coalesce 2: %7.3f s", timers[_t_chaitinCoalesce2].seconds());
|
||||
tty->print_cr (" Coalesce 3: %7.3f s", timers[_t_chaitinCoalesce3].seconds());
|
||||
tty->print_cr (" Cache LRG: %7.3f s", timers[_t_chaitinCacheLRG].seconds());
|
||||
tty->print_cr (" Simplify: %7.3f s", timers[_t_chaitinSimplify].seconds());
|
||||
tty->print_cr (" Select: %7.3f s", timers[_t_chaitinSelect].seconds());
|
||||
|
||||
double other = timers[_t_registerAllocation].seconds() -
|
||||
(timers[_t_ctorChaitin].seconds() +
|
||||
timers[_t_buildIFGvirtual].seconds() +
|
||||
timers[_t_buildIFGphysical].seconds() +
|
||||
timers[_t_computeLive].seconds() +
|
||||
timers[_t_regAllocSplit].seconds() +
|
||||
timers[_t_postAllocCopyRemoval].seconds() +
|
||||
timers[_t_fixupSpills].seconds() +
|
||||
timers[_t_chaitinCompact].seconds() +
|
||||
timers[_t_chaitinCoalesce1].seconds() +
|
||||
timers[_t_chaitinCoalesce2].seconds() +
|
||||
timers[_t_chaitinCoalesce3].seconds() +
|
||||
timers[_t_chaitinCacheLRG].seconds() +
|
||||
timers[_t_chaitinSimplify].seconds() +
|
||||
timers[_t_chaitinSelect].seconds());
|
||||
|
||||
if (other > 0) {
|
||||
tty->print_cr(" Other: %7.3f s", other);
|
||||
}
|
||||
}
|
||||
tty->print_cr (" blockOrdering : %3.3f sec", Phase::_t_blockOrdering.seconds());
|
||||
tty->print_cr (" peephole : %3.3f sec", Phase::_t_peephole.seconds());
|
||||
tty->print_cr (" Block Ordering: %7.3f s", timers[_t_blockOrdering].seconds());
|
||||
tty->print_cr (" Peephole: %7.3f s", timers[_t_peephole].seconds());
|
||||
if (Matcher::require_postalloc_expand) {
|
||||
tty->print_cr (" postalloc_expand: %3.3f sec", Phase::_t_postalloc_expand.seconds());
|
||||
tty->print_cr (" Postalloc Expand: %7.3f s", timers[_t_postalloc_expand].seconds());
|
||||
}
|
||||
tty->print_cr (" codeGen : %3.3f sec", Phase::_t_codeGeneration.seconds());
|
||||
tty->print_cr (" install_code : %3.3f sec", Phase::_t_registerMethod.seconds());
|
||||
tty->print_cr (" -------------- : ----------");
|
||||
double phase_subtotal = Phase::_t_parser.seconds() +
|
||||
Phase::_t_optimizer.seconds() + Phase::_t_graphReshaping.seconds() +
|
||||
Phase::_t_matcher.seconds() + Phase::_t_scheduler.seconds() +
|
||||
Phase::_t_registerAllocation.seconds() + Phase::_t_blockOrdering.seconds() +
|
||||
Phase::_t_codeGeneration.seconds() + Phase::_t_registerMethod.seconds();
|
||||
double percent_of_method_compile = ((phase_subtotal == 0.0) ? 0.0 : phase_subtotal / Phase::_t_methodCompilation.seconds()) * 100.0;
|
||||
// counters inside Compile::CodeGen include time for adapters and stubs
|
||||
// so phase-total can be greater than 100%
|
||||
tty->print_cr (" total : %3.3f sec, %3.2f %%", phase_subtotal, percent_of_method_compile);
|
||||
tty->print_cr (" Code Emission: %7.3f s", timers[_t_output].seconds());
|
||||
tty->print_cr (" Insn Scheduling: %7.3f s", timers[_t_instrSched].seconds());
|
||||
tty->print_cr (" Build OOP maps: %7.3f s", timers[_t_buildOopMaps].seconds());
|
||||
tty->print_cr (" Code Installation: %7.3f s", timers[_t_registerMethod].seconds());
|
||||
|
||||
assert( percent_of_method_compile > expected_method_compile_coverage ||
|
||||
phase_subtotal < minimum_meaningful_method_compile,
|
||||
"Must account for method compilation");
|
||||
if( timers[_t_temporaryTimer1].seconds() > 0 ) {
|
||||
tty->cr();
|
||||
tty->print_cr (" Temp Timer 1: %7.3f s", timers[_t_temporaryTimer1].seconds());
|
||||
}
|
||||
if( timers[_t_temporaryTimer2].seconds() > 0 ) {
|
||||
tty->cr();
|
||||
tty->print_cr (" Temp Timer 2: %7.3f s", timers[_t_temporaryTimer2].seconds());
|
||||
}
|
||||
|
||||
double other = Phase::_t_totalCompilation.seconds() -
|
||||
(timers[_t_parser].seconds() +
|
||||
timers[_t_optimizer].seconds() +
|
||||
timers[_t_matcher].seconds() +
|
||||
timers[_t_scheduler].seconds() +
|
||||
timers[_t_registerAllocation].seconds() +
|
||||
timers[_t_blockOrdering].seconds() +
|
||||
timers[_t_peephole].seconds() +
|
||||
timers[_t_postalloc_expand].seconds() +
|
||||
timers[_t_output].seconds() +
|
||||
timers[_t_registerMethod].seconds() +
|
||||
timers[_t_temporaryTimer1].seconds() +
|
||||
timers[_t_temporaryTimer2].seconds());
|
||||
if (other > 0) {
|
||||
tty->print_cr(" Other: %7.3f s", other);
|
||||
}
|
||||
|
||||
if( Phase::_t_temporaryTimer1.seconds() > minimum_reported_time ) {
|
||||
tty->cr();
|
||||
tty->print_cr (" temporaryTimer1: %3.3f sec", Phase::_t_temporaryTimer1.seconds());
|
||||
}
|
||||
if( Phase::_t_temporaryTimer2.seconds() > minimum_reported_time ) {
|
||||
tty->cr();
|
||||
tty->print_cr (" temporaryTimer2: %3.3f sec", Phase::_t_temporaryTimer2.seconds());
|
||||
}
|
||||
tty->print_cr (" output : %3.3f sec", Phase::_t_output.seconds());
|
||||
tty->print_cr (" isched : %3.3f sec", Phase::_t_instrSched.seconds());
|
||||
tty->print_cr (" bldOopMaps : %3.3f sec", Phase::_t_buildOopMaps.seconds());
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -60,63 +60,65 @@ public:
|
||||
Peephole, // Apply peephole optimizations
|
||||
last_phase
|
||||
};
|
||||
|
||||
enum PhaseTraceId {
|
||||
_t_parser,
|
||||
_t_optimizer,
|
||||
_t_escapeAnalysis,
|
||||
_t_connectionGraph,
|
||||
_t_macroEliminate,
|
||||
_t_iterGVN,
|
||||
_t_incrInline,
|
||||
_t_incrInline_ideal,
|
||||
_t_incrInline_igvn,
|
||||
_t_incrInline_pru,
|
||||
_t_incrInline_inline,
|
||||
_t_idealLoop,
|
||||
_t_idealLoopVerify,
|
||||
_t_ccp,
|
||||
_t_iterGVN2,
|
||||
_t_macroExpand,
|
||||
_t_graphReshaping,
|
||||
_t_matcher,
|
||||
_t_scheduler,
|
||||
_t_registerAllocation,
|
||||
_t_ctorChaitin,
|
||||
_t_buildIFGvirtual,
|
||||
_t_buildIFGphysical,
|
||||
_t_computeLive,
|
||||
_t_regAllocSplit,
|
||||
_t_postAllocCopyRemoval,
|
||||
_t_fixupSpills,
|
||||
_t_chaitinCompact,
|
||||
_t_chaitinCoalesce1,
|
||||
_t_chaitinCoalesce2,
|
||||
_t_chaitinCoalesce3,
|
||||
_t_chaitinCacheLRG,
|
||||
_t_chaitinSimplify,
|
||||
_t_chaitinSelect,
|
||||
_t_blockOrdering,
|
||||
_t_peephole,
|
||||
_t_postalloc_expand,
|
||||
_t_output,
|
||||
_t_instrSched,
|
||||
_t_buildOopMaps,
|
||||
_t_registerMethod,
|
||||
_t_temporaryTimer1,
|
||||
_t_temporaryTimer2,
|
||||
max_phase_timers
|
||||
};
|
||||
|
||||
static elapsedTimer timers[max_phase_timers];
|
||||
|
||||
protected:
|
||||
enum PhaseNumber _pnum; // Phase number (for stat gathering)
|
||||
|
||||
#ifndef PRODUCT
|
||||
static int _total_bytes_compiled;
|
||||
|
||||
// accumulated timers
|
||||
static elapsedTimer _t_totalCompilation;
|
||||
static elapsedTimer _t_methodCompilation;
|
||||
static elapsedTimer _t_stubCompilation;
|
||||
#endif
|
||||
|
||||
// The next timers used for LogCompilation
|
||||
static elapsedTimer _t_parser;
|
||||
static elapsedTimer _t_optimizer;
|
||||
public:
|
||||
// ConnectionGraph can't be Phase since it is used after EA done.
|
||||
static elapsedTimer _t_escapeAnalysis;
|
||||
static elapsedTimer _t_connectionGraph;
|
||||
protected:
|
||||
static elapsedTimer _t_idealLoop;
|
||||
static elapsedTimer _t_ccp;
|
||||
static elapsedTimer _t_matcher;
|
||||
static elapsedTimer _t_registerAllocation;
|
||||
static elapsedTimer _t_output;
|
||||
|
||||
#ifndef PRODUCT
|
||||
static elapsedTimer _t_graphReshaping;
|
||||
static elapsedTimer _t_scheduler;
|
||||
static elapsedTimer _t_blockOrdering;
|
||||
static elapsedTimer _t_macroEliminate;
|
||||
static elapsedTimer _t_macroExpand;
|
||||
static elapsedTimer _t_peephole;
|
||||
static elapsedTimer _t_postalloc_expand;
|
||||
static elapsedTimer _t_codeGeneration;
|
||||
static elapsedTimer _t_registerMethod;
|
||||
static elapsedTimer _t_temporaryTimer1;
|
||||
static elapsedTimer _t_temporaryTimer2;
|
||||
static elapsedTimer _t_idealLoopVerify;
|
||||
|
||||
// Subtimers for _t_optimizer
|
||||
static elapsedTimer _t_iterGVN;
|
||||
static elapsedTimer _t_iterGVN2;
|
||||
static elapsedTimer _t_incrInline;
|
||||
|
||||
// Subtimers for _t_registerAllocation
|
||||
static elapsedTimer _t_ctorChaitin;
|
||||
static elapsedTimer _t_buildIFGphysical;
|
||||
static elapsedTimer _t_computeLive;
|
||||
static elapsedTimer _t_regAllocSplit;
|
||||
static elapsedTimer _t_postAllocCopyRemoval;
|
||||
static elapsedTimer _t_fixupSpills;
|
||||
|
||||
// Subtimers for _t_output
|
||||
static elapsedTimer _t_instrSched;
|
||||
static elapsedTimer _t_buildOopMaps;
|
||||
#endif
|
||||
|
||||
// Generate a subtyping check. Takes as input the subtype and supertype.
|
||||
// Returns 2 values: sets the default control() to the true path and
|
||||
@ -131,9 +133,7 @@ public:
|
||||
Compile * C;
|
||||
Phase( PhaseNumber pnum );
|
||||
|
||||
#ifndef PRODUCT
|
||||
static void print_timers();
|
||||
#endif
|
||||
};
|
||||
|
||||
#endif // SHARE_VM_OPTO_PHASE_HPP
|
||||
|
||||
@ -403,7 +403,7 @@ bool PhaseChaitin::eliminate_copy_of_constant(Node* val, Node* n,
|
||||
// When we see a use from a reg-reg Copy, we will attempt to use the copy's
|
||||
// source directly and make the copy go dead.
|
||||
void PhaseChaitin::post_allocate_copy_removal() {
|
||||
NOT_PRODUCT( Compile::TracePhase t3("postAllocCopyRemoval", &_t_postAllocCopyRemoval, TimeCompiler); )
|
||||
Compile::TracePhase tp("postAllocCopyRemoval", &timers[_t_postAllocCopyRemoval]);
|
||||
ResourceMark rm;
|
||||
|
||||
// Need a mapping from basic block Node_Lists. We need a Node_List to
|
||||
|
||||
@ -468,7 +468,7 @@ bool PhaseChaitin::prompt_use( Block *b, uint lidx ) {
|
||||
// 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, ResourceArea* split_arena) {
|
||||
NOT_PRODUCT( Compile::TracePhase t3("regAllocSplit", &_t_regAllocSplit, TimeCompiler); )
|
||||
Compile::TracePhase tp("regAllocSplit", &timers[_t_regAllocSplit]);
|
||||
|
||||
// Free thread local resources used by this method on exit.
|
||||
ResourceMark rm(split_arena);
|
||||
|
||||
@ -1152,19 +1152,19 @@ void Arguments::set_tiered_flags() {
|
||||
if (FLAG_IS_DEFAULT(SegmentedCodeCache) && ReservedCodeCacheSize >= 240*M) {
|
||||
FLAG_SET_ERGO(bool, SegmentedCodeCache, true);
|
||||
|
||||
// Multiply sizes by 5 but fix NonMethodCodeHeapSize (distribute among non-profiled and profiled code heap)
|
||||
// Multiply sizes by 5 but fix NonNMethodCodeHeapSize (distribute among non-profiled and profiled code heap)
|
||||
if (FLAG_IS_DEFAULT(ProfiledCodeHeapSize)) {
|
||||
FLAG_SET_ERGO(uintx, ProfiledCodeHeapSize, ProfiledCodeHeapSize * 5 + NonMethodCodeHeapSize * 2);
|
||||
FLAG_SET_ERGO(uintx, ProfiledCodeHeapSize, ProfiledCodeHeapSize * 5 + NonNMethodCodeHeapSize * 2);
|
||||
}
|
||||
if (FLAG_IS_DEFAULT(NonProfiledCodeHeapSize)) {
|
||||
FLAG_SET_ERGO(uintx, NonProfiledCodeHeapSize, NonProfiledCodeHeapSize * 5 + NonMethodCodeHeapSize * 2);
|
||||
FLAG_SET_ERGO(uintx, NonProfiledCodeHeapSize, NonProfiledCodeHeapSize * 5 + NonNMethodCodeHeapSize * 2);
|
||||
}
|
||||
// Check consistency of code heap sizes
|
||||
if ((NonMethodCodeHeapSize + NonProfiledCodeHeapSize + ProfiledCodeHeapSize) != ReservedCodeCacheSize) {
|
||||
if ((NonNMethodCodeHeapSize + NonProfiledCodeHeapSize + ProfiledCodeHeapSize) != ReservedCodeCacheSize) {
|
||||
jio_fprintf(defaultStream::error_stream(),
|
||||
"Invalid code heap sizes: NonMethodCodeHeapSize(%dK) + ProfiledCodeHeapSize(%dK) + NonProfiledCodeHeapSize(%dK) = %dK. Must be equal to ReservedCodeCacheSize = %uK.\n",
|
||||
NonMethodCodeHeapSize/K, ProfiledCodeHeapSize/K, NonProfiledCodeHeapSize/K,
|
||||
(NonMethodCodeHeapSize + ProfiledCodeHeapSize + NonProfiledCodeHeapSize)/K, ReservedCodeCacheSize/K);
|
||||
"Invalid code heap sizes: NonNMethodCodeHeapSize(%dK) + ProfiledCodeHeapSize(%dK) + NonProfiledCodeHeapSize(%dK) = %dK. Must be equal to ReservedCodeCacheSize = %uK.\n",
|
||||
NonNMethodCodeHeapSize/K, ProfiledCodeHeapSize/K, NonProfiledCodeHeapSize/K,
|
||||
(NonNMethodCodeHeapSize + ProfiledCodeHeapSize + NonProfiledCodeHeapSize)/K, ReservedCodeCacheSize/K);
|
||||
vm_exit(1);
|
||||
}
|
||||
}
|
||||
@ -2502,17 +2502,17 @@ bool Arguments::check_vm_args_consistency() {
|
||||
"Invalid ReservedCodeCacheSize=%dM. Must be at most %uM.\n", ReservedCodeCacheSize/M,
|
||||
(2*G)/M);
|
||||
status = false;
|
||||
} else if (NonMethodCodeHeapSize < min_code_cache_size){
|
||||
} else if (NonNMethodCodeHeapSize < min_code_cache_size){
|
||||
jio_fprintf(defaultStream::error_stream(),
|
||||
"Invalid NonMethodCodeHeapSize=%dK. Must be at least %uK.\n", NonMethodCodeHeapSize/K,
|
||||
"Invalid NonNMethodCodeHeapSize=%dK. Must be at least %uK.\n", NonNMethodCodeHeapSize/K,
|
||||
min_code_cache_size/K);
|
||||
status = false;
|
||||
} else if ((!FLAG_IS_DEFAULT(NonMethodCodeHeapSize) || !FLAG_IS_DEFAULT(ProfiledCodeHeapSize) || !FLAG_IS_DEFAULT(NonProfiledCodeHeapSize))
|
||||
&& (NonMethodCodeHeapSize + NonProfiledCodeHeapSize + ProfiledCodeHeapSize) != ReservedCodeCacheSize) {
|
||||
} else if ((!FLAG_IS_DEFAULT(NonNMethodCodeHeapSize) || !FLAG_IS_DEFAULT(ProfiledCodeHeapSize) || !FLAG_IS_DEFAULT(NonProfiledCodeHeapSize))
|
||||
&& (NonNMethodCodeHeapSize + NonProfiledCodeHeapSize + ProfiledCodeHeapSize) != ReservedCodeCacheSize) {
|
||||
jio_fprintf(defaultStream::error_stream(),
|
||||
"Invalid code heap sizes: NonMethodCodeHeapSize(%dK) + ProfiledCodeHeapSize(%dK) + NonProfiledCodeHeapSize(%dK) = %dK. Must be equal to ReservedCodeCacheSize = %uK.\n",
|
||||
NonMethodCodeHeapSize/K, ProfiledCodeHeapSize/K, NonProfiledCodeHeapSize/K,
|
||||
(NonMethodCodeHeapSize + ProfiledCodeHeapSize + NonProfiledCodeHeapSize)/K, ReservedCodeCacheSize/K);
|
||||
"Invalid code heap sizes: NonNMethodCodeHeapSize(%dK) + ProfiledCodeHeapSize(%dK) + NonProfiledCodeHeapSize(%dK) = %dK. Must be equal to ReservedCodeCacheSize = %uK.\n",
|
||||
NonNMethodCodeHeapSize/K, ProfiledCodeHeapSize/K, NonProfiledCodeHeapSize/K,
|
||||
(NonNMethodCodeHeapSize + ProfiledCodeHeapSize + NonProfiledCodeHeapSize)/K, ReservedCodeCacheSize/K);
|
||||
status = false;
|
||||
}
|
||||
|
||||
@ -2938,17 +2938,17 @@ jint Arguments::parse_each_vm_init_arg(const JavaVMInitArgs* args,
|
||||
return JNI_EINVAL;
|
||||
}
|
||||
FLAG_SET_CMDLINE(uintx, ReservedCodeCacheSize, (uintx)long_ReservedCodeCacheSize);
|
||||
// -XX:NonMethodCodeHeapSize=
|
||||
} else if (match_option(option, "-XX:NonMethodCodeHeapSize=", &tail)) {
|
||||
julong long_NonMethodCodeHeapSize = 0;
|
||||
// -XX:NonNMethodCodeHeapSize=
|
||||
} else if (match_option(option, "-XX:NonNMethodCodeHeapSize=", &tail)) {
|
||||
julong long_NonNMethodCodeHeapSize = 0;
|
||||
|
||||
ArgsRange errcode = parse_memory_size(tail, &long_NonMethodCodeHeapSize, 1);
|
||||
ArgsRange errcode = parse_memory_size(tail, &long_NonNMethodCodeHeapSize, 1);
|
||||
if (errcode != arg_in_range) {
|
||||
jio_fprintf(defaultStream::error_stream(),
|
||||
"Invalid maximum non-method code heap size: %s.\n", option->optionString);
|
||||
"Invalid maximum non-nmethod code heap size: %s.\n", option->optionString);
|
||||
return JNI_EINVAL;
|
||||
}
|
||||
FLAG_SET_CMDLINE(uintx, NonMethodCodeHeapSize, (uintx)long_NonMethodCodeHeapSize);
|
||||
FLAG_SET_CMDLINE(uintx, NonNMethodCodeHeapSize, (uintx)long_NonNMethodCodeHeapSize);
|
||||
// -XX:ProfiledCodeHeapSize=
|
||||
} else if (match_option(option, "-XX:ProfiledCodeHeapSize=", &tail)) {
|
||||
julong long_ProfiledCodeHeapSize = 0;
|
||||
|
||||
@ -188,7 +188,7 @@ define_pd_global(intx, InitialCodeCacheSize, 160*K);
|
||||
define_pd_global(intx, ReservedCodeCacheSize, 32*M);
|
||||
define_pd_global(intx, NonProfiledCodeHeapSize, 0);
|
||||
define_pd_global(intx, ProfiledCodeHeapSize, 0);
|
||||
define_pd_global(intx, NonMethodCodeHeapSize, 32*M);
|
||||
define_pd_global(intx, NonNMethodCodeHeapSize, 32*M);
|
||||
|
||||
define_pd_global(intx, CodeCacheExpansionSize, 32*K);
|
||||
define_pd_global(intx, CodeCacheMinBlockLength, 1);
|
||||
@ -2487,6 +2487,9 @@ class CommandLineFlags {
|
||||
product(bool, CITime, false, \
|
||||
"collect timing information for compilation") \
|
||||
\
|
||||
develop(bool, CITimeVerbose, false, \
|
||||
"be more verbose in compilation timings") \
|
||||
\
|
||||
develop(bool, CITimeEach, false, \
|
||||
"display timing information after each successful compilation") \
|
||||
\
|
||||
@ -2574,9 +2577,6 @@ class CommandLineFlags {
|
||||
product(bool, UseTypeProfile, true, \
|
||||
"Check interpreter profile for historically monomorphic calls") \
|
||||
\
|
||||
notproduct(bool, TimeCompiler, false, \
|
||||
"Time the compiler") \
|
||||
\
|
||||
diagnostic(bool, PrintInlining, false, \
|
||||
"Print inlining optimizations") \
|
||||
\
|
||||
@ -3370,8 +3370,8 @@ class CommandLineFlags {
|
||||
product_pd(uintx, ProfiledCodeHeapSize, \
|
||||
"Size of code heap with profiled methods (in bytes)") \
|
||||
\
|
||||
product_pd(uintx, NonMethodCodeHeapSize, \
|
||||
"Size of code heap with non-methods (in bytes)") \
|
||||
product_pd(uintx, NonNMethodCodeHeapSize, \
|
||||
"Size of code heap with non-nmethods (in bytes)") \
|
||||
\
|
||||
product(uintx, CodeCacheMinimumFreeSpace, 500*K, \
|
||||
"When less than X space left, we stop compiling") \
|
||||
|
||||
@ -272,9 +272,6 @@ void print_statistics() {
|
||||
|
||||
print_method_profiling_data();
|
||||
|
||||
if (TimeCompiler) {
|
||||
COMPILER2_PRESENT(Compile::print_timers();)
|
||||
}
|
||||
if (TimeCompilationPolicy) {
|
||||
CompilationPolicy::policy()->print_time();
|
||||
}
|
||||
|
||||
@ -2422,7 +2422,7 @@ AdapterHandlerEntry* AdapterHandlerLibrary::get_adapter(methodHandle method) {
|
||||
// Ought to log this but compile log is only per compile thread
|
||||
// and we're some non descript Java thread.
|
||||
MutexUnlocker mu(AdapterHandlerLibrary_lock);
|
||||
CompileBroker::handle_full_code_cache(CodeBlobType::NonMethod);
|
||||
CompileBroker::handle_full_code_cache(CodeBlobType::NonNMethod);
|
||||
return NULL; // Out of CodeCache space
|
||||
}
|
||||
entry->relocate(new_adapter->content_begin());
|
||||
|
||||
@ -543,6 +543,10 @@ int NMethodSweeper::process_nmethod(nmethod *nm) {
|
||||
if (PrintMethodFlushing && Verbose) {
|
||||
tty->print_cr("### Nmethod %3d/" PTR_FORMAT " (not entrant) being made zombie", nm->compile_id(), nm);
|
||||
}
|
||||
// Clear ICStubs to prevent back patching stubs of zombie or unloaded
|
||||
// nmethods during the next safepoint (see ICStub::finalize).
|
||||
MutexLocker cl(CompiledIC_lock);
|
||||
nm->clear_ic_stubs();
|
||||
// Code cache state change is tracked in make_zombie()
|
||||
nm->make_zombie();
|
||||
_zombified_count++;
|
||||
|
||||
@ -198,7 +198,6 @@ needs_compact2 =
|
||||
compact1_minimal = \
|
||||
serviceability/ \
|
||||
compiler/ \
|
||||
testlibrary/ \
|
||||
testlibrary_tests/ \
|
||||
sanity/ \
|
||||
runtime/ \
|
||||
|
||||
@ -25,7 +25,7 @@
|
||||
* @test TestIntegerComparison
|
||||
* @bug 8043284 8042786
|
||||
* @summary "Tests optimizations of signed and unsigned integer comparison."
|
||||
* @run main/othervm -server -Xcomp -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:CompileOnly=TestIntegerComparison::testSigned,TestIntegerComparison::testUnsigned TestIntegerComparison
|
||||
* @run main/othervm -Xcomp -XX:CompileOnly=TestIntegerComparison::testSigned,TestIntegerComparison::testUnsigned TestIntegerComparison
|
||||
*/
|
||||
public class TestIntegerComparison {
|
||||
/**
|
||||
|
||||
@ -32,7 +32,7 @@ import com.oracle.java.testlibrary.*;
|
||||
*/
|
||||
public class CheckSegmentedCodeCache {
|
||||
// Code heap names
|
||||
private static final String NON_METHOD = "CodeHeap 'non-methods'";
|
||||
private static final String NON_METHOD = "CodeHeap 'non-nmethods'";
|
||||
private static final String PROFILED = "CodeHeap 'profiled nmethods'";
|
||||
private static final String NON_PROFILED = "CodeHeap 'non-profiled nmethods'";
|
||||
|
||||
@ -40,7 +40,7 @@ public class CheckSegmentedCodeCache {
|
||||
OutputAnalyzer out = new OutputAnalyzer(pb.start());
|
||||
if (enabled) {
|
||||
try {
|
||||
// Non-method code heap should be always available with the segmented code cache
|
||||
// Non-nmethod code heap should be always available with the segmented code cache
|
||||
out.shouldContain(NON_METHOD);
|
||||
} catch (RuntimeException e) {
|
||||
// TieredCompilation is disabled in a client VM
|
||||
@ -111,14 +111,14 @@ public class CheckSegmentedCodeCache {
|
||||
"-XX:+PrintCodeCache", "-version");
|
||||
verifyCodeHeapNotExists(pb, PROFILED);
|
||||
|
||||
// Fails with too small non-method code heap size
|
||||
pb = ProcessTools.createJavaProcessBuilder("-XX:NonMethodCodeHeapSize=100K");
|
||||
failsWith(pb, "Invalid NonMethodCodeHeapSize");
|
||||
// Fails with too small non-nmethod code heap size
|
||||
pb = ProcessTools.createJavaProcessBuilder("-XX:NonNMethodCodeHeapSize=100K");
|
||||
failsWith(pb, "Invalid NonNMethodCodeHeapSize");
|
||||
|
||||
// Fails if code heap sizes do not add up
|
||||
pb = ProcessTools.createJavaProcessBuilder("-XX:+SegmentedCodeCache",
|
||||
"-XX:ReservedCodeCacheSize=10M",
|
||||
"-XX:NonMethodCodeHeapSize=5M",
|
||||
"-XX:NonNMethodCodeHeapSize=5M",
|
||||
"-XX:ProfiledCodeHeapSize=5M",
|
||||
"-XX:NonProfiledCodeHeapSize=5M");
|
||||
failsWith(pb, "Invalid code heap sizes");
|
||||
@ -127,6 +127,6 @@ public class CheckSegmentedCodeCache {
|
||||
pb = ProcessTools.createJavaProcessBuilder("-XX:+SegmentedCodeCache",
|
||||
"-XX:ReservedCodeCacheSize=1700K",
|
||||
"-XX:InitialCodeCacheSize=100K");
|
||||
failsWith(pb, "Not enough space in non-method code heap to run VM");
|
||||
failsWith(pb, "Not enough space in non-nmethod code heap to run VM");
|
||||
}
|
||||
}
|
||||
|
||||
@ -25,7 +25,7 @@
|
||||
* @test
|
||||
* @bug 8032207
|
||||
* @summary Invalid node sizing for loadUS2L_immI16 and loadI2L_immI
|
||||
* @run main/othervm -server -Xbatch -XX:-TieredCompilation -XX:CompileCommand=compileonly,LoadWithMask.foo LoadWithMask
|
||||
* @run main/othervm -Xbatch -XX:CompileCommand=compileonly,LoadWithMask.foo LoadWithMask
|
||||
*
|
||||
*/
|
||||
public class LoadWithMask {
|
||||
|
||||
@ -25,7 +25,7 @@
|
||||
* @test
|
||||
* @bug 8031743
|
||||
* @summary loadI2L_immI broken for negative memory values
|
||||
* @run main/othervm -server -Xbatch -XX:-TieredCompilation -XX:CompileCommand=compileonly,*.foo* LoadWithMask2
|
||||
* @run main/othervm -Xbatch -XX:CompileCommand=compileonly,*.foo* LoadWithMask2
|
||||
*
|
||||
*/
|
||||
public class LoadWithMask2 {
|
||||
|
||||
@ -53,44 +53,32 @@
|
||||
* java/lang/invoke/TestStableBoolean$DefaultStaticValue
|
||||
* java/lang/invoke/TestStableBoolean$ObjectArrayLowerDim2
|
||||
*
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
|
||||
* @run main/othervm -Xbootclasspath/a:.
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
|
||||
* -server -XX:-TieredCompilation
|
||||
* -XX:-TieredCompilation
|
||||
* -XX:+FoldStableValues
|
||||
* -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
|
||||
* java.lang.invoke.TestStableBoolean
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
|
||||
* @run main/othervm -Xbootclasspath/a:.
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
|
||||
* -server -XX:-TieredCompilation
|
||||
* -XX:-TieredCompilation
|
||||
* -XX:-FoldStableValues
|
||||
* -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
|
||||
* java.lang.invoke.TestStableBoolean
|
||||
*
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
|
||||
* @run main/othervm -Xbootclasspath/a:.
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
|
||||
* -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1
|
||||
* -XX:+TieredCompilation -XX:TieredStopAtLevel=1
|
||||
* -XX:+FoldStableValues
|
||||
* -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
|
||||
* java.lang.invoke.TestStableBoolean
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
|
||||
* @run main/othervm -Xbootclasspath/a:.
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
|
||||
* -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1
|
||||
* -XX:+TieredCompilation -XX:TieredStopAtLevel=1
|
||||
* -XX:-FoldStableValues
|
||||
* -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
|
||||
* java.lang.invoke.TestStableBoolean
|
||||
*
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
|
||||
* -client -XX:-TieredCompilation
|
||||
* -XX:+FoldStableValues
|
||||
* -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
|
||||
* java.lang.invoke.TestStableBoolean
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
|
||||
* -client -XX:-TieredCompilation
|
||||
* -XX:-FoldStableValues
|
||||
* -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
|
||||
* java.lang.invoke.TestStableBoolean
|
||||
*/
|
||||
package java.lang.invoke;
|
||||
|
||||
|
||||
@ -53,44 +53,32 @@
|
||||
* java/lang/invoke/TestStableByte$DefaultStaticValue
|
||||
* java/lang/invoke/TestStableByte$ObjectArrayLowerDim2
|
||||
*
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
|
||||
* @run main/othervm -Xbootclasspath/a:.
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
|
||||
* -server -XX:-TieredCompilation
|
||||
* -XX:-TieredCompilation
|
||||
* -XX:+FoldStableValues
|
||||
* -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
|
||||
* java.lang.invoke.TestStableByte
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
|
||||
* @run main/othervm -Xbootclasspath/a:.
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
|
||||
* -server -XX:-TieredCompilation
|
||||
* -XX:-TieredCompilation
|
||||
* -XX:-FoldStableValues
|
||||
* -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
|
||||
* java.lang.invoke.TestStableByte
|
||||
*
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
|
||||
* @run main/othervm -Xbootclasspath/a:.
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
|
||||
* -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1
|
||||
* -XX:+TieredCompilation -XX:TieredStopAtLevel=1
|
||||
* -XX:+FoldStableValues
|
||||
* -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
|
||||
* java.lang.invoke.TestStableByte
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
|
||||
* @run main/othervm -Xbootclasspath/a:.
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
|
||||
* -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1
|
||||
* -XX:+TieredCompilation -XX:TieredStopAtLevel=1
|
||||
* -XX:-FoldStableValues
|
||||
* -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
|
||||
* java.lang.invoke.TestStableByte
|
||||
*
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
|
||||
* -client -XX:-TieredCompilation
|
||||
* -XX:+FoldStableValues
|
||||
* -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
|
||||
* java.lang.invoke.TestStableByte
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
|
||||
* -client -XX:-TieredCompilation
|
||||
* -XX:-FoldStableValues
|
||||
* -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
|
||||
* java.lang.invoke.TestStableByte
|
||||
*/
|
||||
package java.lang.invoke;
|
||||
|
||||
|
||||
@ -53,44 +53,32 @@
|
||||
* java/lang/invoke/TestStableChar$DefaultStaticValue
|
||||
* java/lang/invoke/TestStableChar$ObjectArrayLowerDim2
|
||||
*
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
|
||||
* @run main/othervm -Xbootclasspath/a:.
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
|
||||
* -server -XX:-TieredCompilation
|
||||
* -XX:-TieredCompilation
|
||||
* -XX:+FoldStableValues
|
||||
* -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
|
||||
* java.lang.invoke.TestStableChar
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
|
||||
* @run main/othervm -Xbootclasspath/a:.
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
|
||||
* -server -XX:-TieredCompilation
|
||||
* -XX:-TieredCompilation
|
||||
* -XX:-FoldStableValues
|
||||
* -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
|
||||
* java.lang.invoke.TestStableChar
|
||||
*
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
|
||||
* @run main/othervm -Xbootclasspath/a:.
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
|
||||
* -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1
|
||||
* -XX:+TieredCompilation -XX:TieredStopAtLevel=1
|
||||
* -XX:+FoldStableValues
|
||||
* -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
|
||||
* java.lang.invoke.TestStableChar
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
|
||||
* @run main/othervm -Xbootclasspath/a:.
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
|
||||
* -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1
|
||||
* -XX:+TieredCompilation -XX:TieredStopAtLevel=1
|
||||
* -XX:-FoldStableValues
|
||||
* -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
|
||||
* java.lang.invoke.TestStableChar
|
||||
*
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
|
||||
* -client -XX:-TieredCompilation
|
||||
* -XX:+FoldStableValues
|
||||
* -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
|
||||
* java.lang.invoke.TestStableChar
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
|
||||
* -client -XX:-TieredCompilation
|
||||
* -XX:-FoldStableValues
|
||||
* -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
|
||||
* java.lang.invoke.TestStableChar
|
||||
*/
|
||||
package java.lang.invoke;
|
||||
|
||||
|
||||
@ -53,44 +53,32 @@
|
||||
* java/lang/invoke/TestStableDouble$DefaultStaticValue
|
||||
* java/lang/invoke/TestStableDouble$ObjectArrayLowerDim2
|
||||
*
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
|
||||
* @run main/othervm -Xbootclasspath/a:.
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
|
||||
* -server -XX:-TieredCompilation
|
||||
* -XX:-TieredCompilation
|
||||
* -XX:+FoldStableValues
|
||||
* -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
|
||||
* java.lang.invoke.TestStableDouble
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
|
||||
* @run main/othervm -Xbootclasspath/a:.
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
|
||||
* -server -XX:-TieredCompilation
|
||||
* -XX:-TieredCompilation
|
||||
* -XX:-FoldStableValues
|
||||
* -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
|
||||
* java.lang.invoke.TestStableDouble
|
||||
*
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
|
||||
* @run main/othervm -Xbootclasspath/a:.
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
|
||||
* -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1
|
||||
* -XX:+TieredCompilation -XX:TieredStopAtLevel=1
|
||||
* -XX:+FoldStableValues
|
||||
* -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
|
||||
* java.lang.invoke.TestStableDouble
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
|
||||
* @run main/othervm -Xbootclasspath/a:.
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
|
||||
* -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1
|
||||
* -XX:+TieredCompilation -XX:TieredStopAtLevel=1
|
||||
* -XX:-FoldStableValues
|
||||
* -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
|
||||
* java.lang.invoke.TestStableDouble
|
||||
*
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
|
||||
* -client -XX:-TieredCompilation
|
||||
* -XX:+FoldStableValues
|
||||
* -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
|
||||
* java.lang.invoke.TestStableDouble
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
|
||||
* -client -XX:-TieredCompilation
|
||||
* -XX:-FoldStableValues
|
||||
* -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
|
||||
* java.lang.invoke.TestStableDouble
|
||||
*/
|
||||
package java.lang.invoke;
|
||||
|
||||
|
||||
@ -53,44 +53,32 @@
|
||||
* java/lang/invoke/TestStableFloat$DefaultStaticValue
|
||||
* java/lang/invoke/TestStableFloat$ObjectArrayLowerDim2
|
||||
*
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
|
||||
* @run main/othervm -Xbootclasspath/a:.
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
|
||||
* -server -XX:-TieredCompilation
|
||||
* -XX:-TieredCompilation
|
||||
* -XX:+FoldStableValues
|
||||
* -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
|
||||
* java.lang.invoke.TestStableFloat
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
|
||||
* @run main/othervm -Xbootclasspath/a:.
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
|
||||
* -server -XX:-TieredCompilation
|
||||
* -XX:-TieredCompilation
|
||||
* -XX:-FoldStableValues
|
||||
* -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
|
||||
* java.lang.invoke.TestStableFloat
|
||||
*
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
|
||||
* @run main/othervm -Xbootclasspath/a:.
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
|
||||
* -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1
|
||||
* -XX:+TieredCompilation -XX:TieredStopAtLevel=1
|
||||
* -XX:+FoldStableValues
|
||||
* -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
|
||||
* java.lang.invoke.TestStableFloat
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
|
||||
* @run main/othervm -Xbootclasspath/a:.
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
|
||||
* -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1
|
||||
* -XX:+TieredCompilation -XX:TieredStopAtLevel=1
|
||||
* -XX:-FoldStableValues
|
||||
* -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
|
||||
* java.lang.invoke.TestStableFloat
|
||||
*
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
|
||||
* -client -XX:-TieredCompilation
|
||||
* -XX:+FoldStableValues
|
||||
* -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
|
||||
* java.lang.invoke.TestStableFloat
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
|
||||
* -client -XX:-TieredCompilation
|
||||
* -XX:-FoldStableValues
|
||||
* -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
|
||||
* java.lang.invoke.TestStableFloat
|
||||
*/
|
||||
package java.lang.invoke;
|
||||
|
||||
|
||||
@ -53,44 +53,32 @@
|
||||
* java/lang/invoke/TestStableInt$DefaultStaticValue
|
||||
* java/lang/invoke/TestStableInt$ObjectArrayLowerDim2
|
||||
*
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
|
||||
* @run main/othervm -Xbootclasspath/a:.
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
|
||||
* -server -XX:-TieredCompilation
|
||||
* -XX:-TieredCompilation
|
||||
* -XX:+FoldStableValues
|
||||
* -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
|
||||
* java.lang.invoke.TestStableInt
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
|
||||
* @run main/othervm -Xbootclasspath/a:.
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
|
||||
* -server -XX:-TieredCompilation
|
||||
* -XX:-TieredCompilation
|
||||
* -XX:-FoldStableValues
|
||||
* -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
|
||||
* java.lang.invoke.TestStableInt
|
||||
*
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
|
||||
* @run main/othervm -Xbootclasspath/a:.
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
|
||||
* -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1
|
||||
* -XX:+TieredCompilation -XX:TieredStopAtLevel=1
|
||||
* -XX:+FoldStableValues
|
||||
* -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
|
||||
* java.lang.invoke.TestStableInt
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
|
||||
* @run main/othervm -Xbootclasspath/a:.
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
|
||||
* -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1
|
||||
* -XX:+TieredCompilation -XX:TieredStopAtLevel=1
|
||||
* -XX:-FoldStableValues
|
||||
* -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
|
||||
* java.lang.invoke.TestStableInt
|
||||
*
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
|
||||
* -client -XX:-TieredCompilation
|
||||
* -XX:+FoldStableValues
|
||||
* -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
|
||||
* java.lang.invoke.TestStableInt
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
|
||||
* -client -XX:-TieredCompilation
|
||||
* -XX:-FoldStableValues
|
||||
* -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
|
||||
* java.lang.invoke.TestStableInt
|
||||
*/
|
||||
package java.lang.invoke;
|
||||
|
||||
|
||||
@ -53,44 +53,32 @@
|
||||
* java/lang/invoke/TestStableLong$DefaultStaticValue
|
||||
* java/lang/invoke/TestStableLong$ObjectArrayLowerDim2
|
||||
*
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
|
||||
* @run main/othervm -Xbootclasspath/a:.
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
|
||||
* -server -XX:-TieredCompilation
|
||||
* -XX:-TieredCompilation
|
||||
* -XX:+FoldStableValues
|
||||
* -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
|
||||
* java.lang.invoke.TestStableLong
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
|
||||
* @run main/othervm -Xbootclasspath/a:.
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
|
||||
* -server -XX:-TieredCompilation
|
||||
* -XX:-TieredCompilation
|
||||
* -XX:-FoldStableValues
|
||||
* -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
|
||||
* java.lang.invoke.TestStableLong
|
||||
*
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
|
||||
* @run main/othervm -Xbootclasspath/a:.
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
|
||||
* -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1
|
||||
* -XX:+TieredCompilation -XX:TieredStopAtLevel=1
|
||||
* -XX:+FoldStableValues
|
||||
* -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
|
||||
* java.lang.invoke.TestStableLong
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
|
||||
* @run main/othervm -Xbootclasspath/a:.
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
|
||||
* -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1
|
||||
* -XX:+TieredCompilation -XX:TieredStopAtLevel=1
|
||||
* -XX:-FoldStableValues
|
||||
* -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
|
||||
* java.lang.invoke.TestStableLong
|
||||
*
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
|
||||
* -client -XX:-TieredCompilation
|
||||
* -XX:+FoldStableValues
|
||||
* -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
|
||||
* java.lang.invoke.TestStableLong
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
|
||||
* -client -XX:-TieredCompilation
|
||||
* -XX:-FoldStableValues
|
||||
* -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
|
||||
* java.lang.invoke.TestStableLong
|
||||
*/
|
||||
package java.lang.invoke;
|
||||
|
||||
|
||||
@ -54,44 +54,32 @@
|
||||
* java/lang/invoke/TestStableObject$DefaultStaticValue
|
||||
* java/lang/invoke/TestStableObject$ObjectArrayLowerDim2
|
||||
*
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
|
||||
* @run main/othervm -Xbootclasspath/a:.
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
|
||||
* -server -XX:-TieredCompilation
|
||||
* -XX:-TieredCompilation
|
||||
* -XX:+FoldStableValues
|
||||
* -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
|
||||
* java.lang.invoke.TestStableObject
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
|
||||
* @run main/othervm -Xbootclasspath/a:.
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
|
||||
* -server -XX:-TieredCompilation
|
||||
* -XX:-TieredCompilation
|
||||
* -XX:-FoldStableValues
|
||||
* -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
|
||||
* java.lang.invoke.TestStableObject
|
||||
*
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
|
||||
* @run main/othervm -Xbootclasspath/a:.
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
|
||||
* -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1
|
||||
* -XX:+TieredCompilation -XX:TieredStopAtLevel=1
|
||||
* -XX:+FoldStableValues
|
||||
* -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
|
||||
* java.lang.invoke.TestStableObject
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
|
||||
* @run main/othervm -Xbootclasspath/a:.
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
|
||||
* -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1
|
||||
* -XX:+TieredCompilation -XX:TieredStopAtLevel=1
|
||||
* -XX:-FoldStableValues
|
||||
* -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
|
||||
* java.lang.invoke.TestStableObject
|
||||
*
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
|
||||
* -client -XX:-TieredCompilation
|
||||
* -XX:+FoldStableValues
|
||||
* -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
|
||||
* java.lang.invoke.TestStableObject
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
|
||||
* -client -XX:-TieredCompilation
|
||||
* -XX:-FoldStableValues
|
||||
* -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
|
||||
* java.lang.invoke.TestStableObject
|
||||
*/
|
||||
package java.lang.invoke;
|
||||
|
||||
|
||||
@ -53,44 +53,32 @@
|
||||
* java/lang/invoke/TestStableShort$DefaultStaticValue
|
||||
* java/lang/invoke/TestStableShort$ObjectArrayLowerDim2
|
||||
*
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
|
||||
* @run main/othervm -Xbootclasspath/a:.
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
|
||||
* -server -XX:-TieredCompilation
|
||||
* -XX:-TieredCompilation
|
||||
* -XX:+FoldStableValues
|
||||
* -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
|
||||
* java.lang.invoke.TestStableShort
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
|
||||
* @run main/othervm -Xbootclasspath/a:.
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
|
||||
* -server -XX:-TieredCompilation
|
||||
* -XX:-TieredCompilation
|
||||
* -XX:-FoldStableValues
|
||||
* -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
|
||||
* java.lang.invoke.TestStableShort
|
||||
*
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
|
||||
* @run main/othervm -Xbootclasspath/a:.
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
|
||||
* -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1
|
||||
* -XX:+TieredCompilation -XX:TieredStopAtLevel=1
|
||||
* -XX:+FoldStableValues
|
||||
* -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
|
||||
* java.lang.invoke.TestStableShort
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
|
||||
* @run main/othervm -Xbootclasspath/a:.
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
|
||||
* -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1
|
||||
* -XX:+TieredCompilation -XX:TieredStopAtLevel=1
|
||||
* -XX:-FoldStableValues
|
||||
* -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
|
||||
* java.lang.invoke.TestStableShort
|
||||
*
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
|
||||
* -client -XX:-TieredCompilation
|
||||
* -XX:+FoldStableValues
|
||||
* -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
|
||||
* java.lang.invoke.TestStableShort
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
|
||||
* -client -XX:-TieredCompilation
|
||||
* -XX:-FoldStableValues
|
||||
* -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
|
||||
* java.lang.invoke.TestStableShort
|
||||
*/
|
||||
package java.lang.invoke;
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2013, 2014, 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
|
||||
@ -27,9 +27,7 @@
|
||||
* @bug 8026775
|
||||
* @summary Uncommon trap blob did not bang all the stack shadow pages
|
||||
*
|
||||
* @run main/othervm -server -XX:+IgnoreUnrecognizedVMOptions -XX:+TieredCompilation UncommonTrapStackBang
|
||||
* @run main/othervm -server -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation UncommonTrapStackBang
|
||||
*
|
||||
* @run main/othervm UncommonTrapStackBang
|
||||
*
|
||||
* Note: This test does not reproduce the problem with absolute
|
||||
* certainty. Empirically the bug reproduces on Windows some 80+% of
|
||||
|
||||
@ -52,7 +52,7 @@ public class CodeCacheTest {
|
||||
*
|
||||
* Expected output with code cache segmentation (number of segments may change):
|
||||
*
|
||||
* CodeHeap 'non-methods': size=5696Kb used=2236Kb max_used=2238Kb free=3459Kb
|
||||
* CodeHeap 'non-nmethods': size=5696Kb used=2236Kb max_used=2238Kb free=3459Kb
|
||||
* bounds [0x00007fa0f0ffe000, 0x00007fa0f126e000, 0x00007fa0f158e000]
|
||||
* CodeHeap 'profiled nmethods': size=120036Kb used=8Kb max_used=8Kb free=120027Kb
|
||||
* bounds [0x00007fa0f158e000, 0x00007fa0f17fe000, 0x00007fa0f8ac7000]
|
||||
@ -95,7 +95,7 @@ public class CodeCacheTest {
|
||||
// Tiered compilation: use all segments
|
||||
segmentsCount = 3;
|
||||
} else {
|
||||
// No TieredCompilation: only non-method and non-profiled segment
|
||||
// No TieredCompilation: only non-nmethod and non-profiled segment
|
||||
segmentsCount = 2;
|
||||
}
|
||||
|
||||
|
||||
5
hotspot/test/testlibrary_tests/ctw/Bar.java
Normal file
5
hotspot/test/testlibrary_tests/ctw/Bar.java
Normal file
@ -0,0 +1,5 @@
|
||||
public class Bar {
|
||||
private static void staticMethod() { }
|
||||
public void method() { }
|
||||
protected Bar() { }
|
||||
}
|
||||
62
hotspot/test/testlibrary_tests/ctw/ClassesDirTest.java
Normal file
62
hotspot/test/testlibrary_tests/ctw/ClassesDirTest.java
Normal file
@ -0,0 +1,62 @@
|
||||
/*
|
||||
* Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 8012447
|
||||
* @library /testlibrary /testlibrary/whitebox /testlibrary/ctw/src
|
||||
* @build ClassFileInstaller sun.hotspot.tools.ctw.CompileTheWorld sun.hotspot.WhiteBox Foo Bar
|
||||
* @run main ClassFileInstaller sun.hotspot.WhiteBox Foo Bar
|
||||
* sun.hotspot.WhiteBox$WhiteBoxPermission
|
||||
* @run main ClassesDirTest prepare
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Dsun.hotspot.tools.ctw.logfile=ctw.log sun.hotspot.tools.ctw.CompileTheWorld classes
|
||||
* @run main ClassesDirTest check ctw.log
|
||||
* @summary testing of CompileTheWorld :: classes in directory
|
||||
* @author igor.ignatyev@oracle.com
|
||||
*/
|
||||
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Paths;
|
||||
import java.nio.file.StandardCopyOption;
|
||||
|
||||
public class ClassesDirTest extends CtwTest {
|
||||
private static final String[] SHOULD_CONTAIN
|
||||
= {"# dir: classes", "Done (2 classes, 6 methods, "};
|
||||
|
||||
private ClassesDirTest() {
|
||||
super(SHOULD_CONTAIN);
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
new ClassesDirTest().run(args);
|
||||
}
|
||||
|
||||
protected void prepare() throws Exception {
|
||||
String path = "classes";
|
||||
Files.createDirectory(Paths.get(path));
|
||||
Files.move(Paths.get("Foo.class"), Paths.get(path, "Foo.class"),
|
||||
StandardCopyOption.REPLACE_EXISTING);
|
||||
Files.move(Paths.get("Bar.class"), Paths.get(path, "Bar.class"),
|
||||
StandardCopyOption.REPLACE_EXISTING);
|
||||
}
|
||||
}
|
||||
59
hotspot/test/testlibrary_tests/ctw/ClassesListTest.java
Normal file
59
hotspot/test/testlibrary_tests/ctw/ClassesListTest.java
Normal file
@ -0,0 +1,59 @@
|
||||
/*
|
||||
* Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 8012447
|
||||
* @library /testlibrary /testlibrary/whitebox /testlibrary/ctw/src
|
||||
* @build ClassFileInstaller sun.hotspot.tools.ctw.CompileTheWorld sun.hotspot.WhiteBox Foo Bar
|
||||
* @run main ClassFileInstaller sun.hotspot.WhiteBox Foo Bar
|
||||
* sun.hotspot.WhiteBox$WhiteBoxPermission
|
||||
* @run main ClassesListTest prepare
|
||||
* @run main/othervm/timeout=600 -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Dsun.hotspot.tools.ctw.logfile=ctw.log sun.hotspot.tools.ctw.CompileTheWorld classes.lst
|
||||
* @run main ClassesListTest check ctw.log
|
||||
* @summary testing of CompileTheWorld :: list of classes in file
|
||||
* @author igor.ignatyev@oracle.com
|
||||
*/
|
||||
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Paths;
|
||||
import java.nio.file.StandardCopyOption;
|
||||
|
||||
public class ClassesListTest extends CtwTest {
|
||||
private static final String[] SHOULD_CONTAIN
|
||||
= {"# list: classes.lst", "Done (4 classes, "};
|
||||
|
||||
private ClassesListTest() {
|
||||
super(SHOULD_CONTAIN);
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
new ClassesListTest().run(args);
|
||||
}
|
||||
|
||||
protected void prepare() throws Exception {
|
||||
String path = "classes.lst";
|
||||
Files.copy(Paths.get(System.getProperty("test.src"), path),
|
||||
Paths.get(path), StandardCopyOption.REPLACE_EXISTING);
|
||||
}
|
||||
}
|
||||
118
hotspot/test/testlibrary_tests/ctw/CtwTest.java
Normal file
118
hotspot/test/testlibrary_tests/ctw/CtwTest.java
Normal file
@ -0,0 +1,118 @@
|
||||
/*
|
||||
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Collections;
|
||||
import java.util.ArrayList;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.Writer;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.io.BufferedReader;
|
||||
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Paths;
|
||||
import java.nio.file.StandardCopyOption;
|
||||
import java.nio.charset.Charset;
|
||||
|
||||
import com.oracle.java.testlibrary.JDKToolFinder;
|
||||
import com.oracle.java.testlibrary.OutputAnalyzer;
|
||||
|
||||
public abstract class CtwTest {
|
||||
protected final String[] shouldContain;
|
||||
protected CtwTest(String[] shouldContain) {
|
||||
this.shouldContain = shouldContain;
|
||||
}
|
||||
|
||||
public void run(String[] args) throws Exception {
|
||||
if (args.length == 0) {
|
||||
throw new Error("args is empty");
|
||||
}
|
||||
switch (args[0]) {
|
||||
case "prepare":
|
||||
prepare();
|
||||
break;
|
||||
case "check":
|
||||
check(args);
|
||||
break;
|
||||
default:
|
||||
throw new Error("unregonized action -- " + args[0]);
|
||||
}
|
||||
}
|
||||
|
||||
protected void prepare() throws Exception { }
|
||||
|
||||
protected void check(String[] args) throws Exception {
|
||||
if (args.length < 2) {
|
||||
throw new Error("logfile isn't specified");
|
||||
}
|
||||
String logfile = args[1];
|
||||
try (BufferedReader r = Files.newBufferedReader(Paths.get(logfile),
|
||||
Charset.defaultCharset())) {
|
||||
OutputAnalyzer output = readOutput(r);
|
||||
for (String test : shouldContain) {
|
||||
output.shouldContain(test);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static OutputAnalyzer readOutput(BufferedReader reader)
|
||||
throws IOException {
|
||||
StringBuilder builder = new StringBuilder();
|
||||
String eol = String.format("%n");
|
||||
String line;
|
||||
|
||||
while ((line = reader.readLine()) != null) {
|
||||
builder.append(line);
|
||||
builder.append(eol);
|
||||
}
|
||||
return new OutputAnalyzer(builder.toString(), "");
|
||||
}
|
||||
|
||||
protected void dump(OutputAnalyzer output, String name) {
|
||||
try (Writer w = new FileWriter(name + ".out")) {
|
||||
String s = output.getStdout();
|
||||
w.write(s, s.length(), 0);
|
||||
} catch (IOException io) {
|
||||
io.printStackTrace();
|
||||
}
|
||||
try (Writer w = new FileWriter(name + ".err")) {
|
||||
String s = output.getStderr();
|
||||
w.write(s, s.length(), 0);
|
||||
} catch (IOException io) {
|
||||
io.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
protected ProcessBuilder createJarProcessBuilder(String... command)
|
||||
throws Exception {
|
||||
String javapath = JDKToolFinder.getJDKTool("jar");
|
||||
|
||||
ArrayList<String> args = new ArrayList<>();
|
||||
args.add(javapath);
|
||||
Collections.addAll(args, command);
|
||||
|
||||
return new ProcessBuilder(args.toArray(new String[args.size()]));
|
||||
}
|
||||
}
|
||||
5
hotspot/test/testlibrary_tests/ctw/Foo.java
Normal file
5
hotspot/test/testlibrary_tests/ctw/Foo.java
Normal file
@ -0,0 +1,5 @@
|
||||
public class Foo {
|
||||
private static void staticMethod() { }
|
||||
public void method() { }
|
||||
protected Foo() { }
|
||||
}
|
||||
76
hotspot/test/testlibrary_tests/ctw/JarDirTest.java
Normal file
76
hotspot/test/testlibrary_tests/ctw/JarDirTest.java
Normal file
@ -0,0 +1,76 @@
|
||||
/*
|
||||
* Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 8012447
|
||||
* @library /testlibrary /testlibrary/whitebox /testlibrary/ctw/src
|
||||
* @build ClassFileInstaller com.oracle.java.testlibrary.* sun.hotspot.tools.ctw.CompileTheWorld sun.hotspot.WhiteBox Foo Bar
|
||||
* @run main ClassFileInstaller sun.hotspot.WhiteBox Foo Bar
|
||||
* sun.hotspot.WhiteBox$WhiteBoxPermission
|
||||
* @run main JarDirTest prepare
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Dsun.hotspot.tools.ctw.logfile=ctw.log sun.hotspot.tools.ctw.CompileTheWorld jars/*
|
||||
* @run main JarDirTest check ctw.log
|
||||
* @summary testing of CompileTheWorld :: jars in directory
|
||||
* @author igor.ignatyev@oracle.com
|
||||
*/
|
||||
|
||||
import java.io.File;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Paths;
|
||||
|
||||
import com.oracle.java.testlibrary.OutputAnalyzer;
|
||||
|
||||
public class JarDirTest extends CtwTest {
|
||||
private static final String[] SHOULD_CONTAIN
|
||||
= {"# jar_in_dir: jars",
|
||||
"# jar: jars" + File.separator +"foo.jar",
|
||||
"# jar: jars" + File.separator +"bar.jar",
|
||||
"Done (4 classes, 12 methods, "};
|
||||
|
||||
private JarDirTest() {
|
||||
super(SHOULD_CONTAIN);
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
new JarDirTest().run(args);
|
||||
}
|
||||
|
||||
protected void prepare() throws Exception {
|
||||
String path = "jars";
|
||||
Files.createDirectory(Paths.get(path));
|
||||
|
||||
ProcessBuilder pb = createJarProcessBuilder("cf", "jars/foo.jar",
|
||||
"Foo.class", "Bar.class");
|
||||
OutputAnalyzer output = new OutputAnalyzer(pb.start());
|
||||
dump(output, "ctw-foo.jar");
|
||||
output.shouldHaveExitValue(0);
|
||||
|
||||
pb = createJarProcessBuilder("cf", "jars/bar.jar", "Foo.class",
|
||||
"Bar.class");
|
||||
output = new OutputAnalyzer(pb.start());
|
||||
dump(output, "ctw-bar.jar");
|
||||
output.shouldHaveExitValue(0);
|
||||
}
|
||||
|
||||
}
|
||||
66
hotspot/test/testlibrary_tests/ctw/JarsTest.java
Normal file
66
hotspot/test/testlibrary_tests/ctw/JarsTest.java
Normal file
@ -0,0 +1,66 @@
|
||||
/*
|
||||
* Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 8012447
|
||||
* @library /testlibrary /testlibrary/whitebox /testlibrary/ctw/src
|
||||
* @build ClassFileInstaller com.oracle.java.testlibrary.* sun.hotspot.tools.ctw.CompileTheWorld sun.hotspot.WhiteBox Foo Bar
|
||||
* @run main ClassFileInstaller sun.hotspot.WhiteBox Foo Bar
|
||||
* sun.hotspot.WhiteBox$WhiteBoxPermission
|
||||
* @run main JarsTest prepare
|
||||
* @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Dsun.hotspot.tools.ctw.logfile=ctw.log sun.hotspot.tools.ctw.CompileTheWorld foo.jar bar.jar
|
||||
* @run main JarsTest check ctw.log
|
||||
* @summary testing of CompileTheWorld :: jars
|
||||
* @author igor.ignatyev@oracle.com
|
||||
*/
|
||||
|
||||
import com.oracle.java.testlibrary.OutputAnalyzer;
|
||||
|
||||
public class JarsTest extends CtwTest {
|
||||
private static final String[] SHOULD_CONTAIN
|
||||
= {"# jar: foo.jar", "# jar: bar.jar",
|
||||
"Done (4 classes, 12 methods, "};
|
||||
|
||||
private JarsTest() {
|
||||
super(SHOULD_CONTAIN);
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
new JarsTest().run(args);
|
||||
}
|
||||
|
||||
protected void prepare() throws Exception {
|
||||
ProcessBuilder pb = createJarProcessBuilder("cf", "foo.jar",
|
||||
"Foo.class", "Bar.class");
|
||||
OutputAnalyzer output = new OutputAnalyzer(pb.start());
|
||||
dump(output, "ctw-foo.jar");
|
||||
output.shouldHaveExitValue(0);
|
||||
|
||||
pb = createJarProcessBuilder("cf", "bar.jar", "Foo.class", "Bar.class");
|
||||
output = new OutputAnalyzer(pb.start());
|
||||
dump(output, "ctw-bar.jar");
|
||||
output.shouldHaveExitValue(0);
|
||||
}
|
||||
|
||||
}
|
||||
4
hotspot/test/testlibrary_tests/ctw/classes.lst
Normal file
4
hotspot/test/testlibrary_tests/ctw/classes.lst
Normal file
@ -0,0 +1,4 @@
|
||||
java.lang.String
|
||||
java.lang.Object
|
||||
Foo
|
||||
Bar
|
||||
Loading…
x
Reference in New Issue
Block a user